如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架

Posted

技术标签:

【中文标题】如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架【英文标题】:How to use Objective-C framework in a Swift written iOS part of a flutter plugin 【发布时间】:2019-06-25 20:25:44 【问题描述】:

Flutter 插件中,我想在我的 ios 部分中使用 Objective-C 框架,用 swift 编写,然后在使用 Swift 作为 iOS 语言的 Flutter 项目中使用它。经过一些研究(我不是 iOS 开发人员)我发现我想做的可以通过在 swift 和 Objective- 之间导入 充当桥接标题的文件中的标题来实现C,但是如果在 Podfile 中定义了use_frameworks!(据我所知),flutter 插件中的桥接头是自动创建的,而且我不明白如何从Objective-C (我认为是通过在 podspec 中定义一些东西,但我不知道) pod in that。事实上,如果我尝试从 Objective-C pod 中导入某些内容,XCode 会抱怨(以及编译器)会说它 "doesn't find the module with name <framework name>" 或者它无法构建 Objective-C代码。如果我尝试在 Objective-C 插件中使用该框架,我可以使用它,但前提是我从项目 Podfile 中注释掉 use_frameworks!

最后,我想知道是否可以在 Swift 插件中使用 Objective-c 外部框架来开发 Flutter 插件。

【问题讨论】:

这个运气好吗?我在同一条船上...... 嗯,不是真的。最后我发现可以从播客文件中导入不同的 pod,问题是当有一些东西是不能用命令“pod ”得到的。此时真的很难编写正确的播客配置,这取决于 .framework 文件的服务方式。例如:有一个本地 .framework 文件,该文件内部没有要使用的标头,但要在外部使用。 @LorenzoImperatrice 你能分享一下你是如何以“pod ”的方式做到的吗? 对不起,最后我没有用 'pod ' 这样做,因为那一刻不是正确的。无论如何,这很容易,并且网上有大量指南。我建议始终检查link,这是官方指南。指定您只需要在您的 podspec 中编写如下内容:spec.dependency 'SocketRocket' 即可从您的项目中获取依赖项。 ***.com/questions/24002369/… 试试这个:) 【参考方案1】:

我建议您查看starflut 包https://pub.dev/packages/starflut。但很可能你想要完成的事情在另一个包中更简单地为你完成,但如果你完全一心想要自己做,我认为你应该试试这个包

【讨论】:

嘿塞缪尔!谢谢你的建议,我一定会看看这个包,但我认为它没有帮助,我有 2 个问题针对同一个论点,这两个问题都有 10 多票但没有答案: ( . 不幸的是,我不得不做的事情是引用一个只提供本机代码的付费库,仅此而已,我希望从中创建一个插件,但我刚刚结束将它绑定到应用程序代码!跨度> 【参考方案2】:

如果对于某些开发人员来说这仍然是一个相关问题,这里是可能的解决方案。

在插件的.podspec 文件中,将此字符串粘贴到远程框架

Pod::Spec.new do |s|
    ...

    s.dependency 'GoogleWebRTC'
end

或者,对于本地框架,粘贴这些

Pod::Spec.new do |s|
    ...

    s.preserve_paths = 'WebRTC.framework'
    s.xcconfig =  'OTHER_LDFLAGS' => '-framework WebRTC', 'ENABLE_BITCODE' => 'NO' 
    s.vendored_frameworks = 'WebRTC.framework'
end

【讨论】:

嗨,伙计,谢谢您的回答,如果您开始收到一些赞成票,请在 cmets 中联系我,这样我会给您分配最佳答案。不幸的是,我无法再验证它了,因为我很久没有在 Flutter 中编码了。

以上是关于如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架的主要内容,如果未能解决你的问题,请参考以下文章

如何从用 Swift 编写的 Flutter 平台特定代码启动 ViewController?

Flutter 插件问题(引入插件同时存在静态库与swift)

如何在 Flutter 中启用对现有项目的 Swift 支持

未找到 Flutter 插件“geolocator-Swift.h”文件

Flutter学习之混合开发

Flutter学习之混合开发