如何将Flutter项目导出为SDK(iOS动态框架)

12
我们已经开发了一个很棒的Flutter项目,具有出色的功能,我们希望将其导出为一个框架,就像本地库一样,以便隐藏源代码(转换为动态框架)。
我们遵循了以下指示:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps,这使我们可以在主机iOS应用程序中包含Flutter项目,初始化FlutterEngine并使用FlutterViewController。
问题是,我们如何创建一个动态框架,比如SomeProductSDK.framework,它将公开创建SomeProductSDK相关模态屏幕的公共方法?
// In any app
import SomeProductSDK

let controller = TransactionViewController() // SomeProductSDK.framework with partial implementation with flutter
self.present(controller, animated: true)
2个回答

9

我已经部分达到了你的要求。所有这些都是非常实验性的,总的来说对于生产就绪的SDK来说不是一个好主意。但是……它是可能的。

  1. 像往常一样创建Flutter应用程序并在iOS模拟器上运行一次。
  2. 打开Xcode工作区并添加新框架。为了我的目的,我将其命名为RunnerLib。
  3. 将该框架的部署目标更改为与Runner相同。同时禁用bitcode。
  4. 将App.framework和Flutter.framework的目标成员身份更改为RunnerLib。
  5. 创建Launcher类,其中包含一个静态方法:+ (void)launchFrom:(UIViewController *)parent,这将创建一个FlutterViewController并呈现它。
  6. 重写Runner以使用Launcher类。使用标准的AppDelegate替换FlutterAppDelegate,创建ViewController等。它应该看起来像标准的本地iOS项目,所以您可以创建一个并复制AppDelegate、storyboard和ViewController。
  7. 在视图控制器中调用launchFrom方法,在viewDidAppear或者按钮的IBAction中进行调用。
  8. 您应该能够构建Runner并看到flutter屏幕出现。
  9. 现在,如果您构建Runner应用程序,您可以打开创建的Runner.app,并查看Frameworks目录包含3个框架:App、Flutter和Runner。
  10. 现在,您需要两套框架:一套用于模拟器,在调试模式下编译;另一套用于设备-存档。获取调试框架非常容易,只需从Xcode编译并检查产品即可。存档的框架更难,我建议使用xcodebuild archive来禁用签名。
  11. 您的用户将需要根据设备配置他们的项目以使用正确的框架。可能这一步可以通过Carthage和fat二进制文件自动化处理,但我不确定。问题在于App.framework在设备上看起来与在模拟器上完全不同。

源代码:https://github.com/szotp/runner_lib


1
谢谢,终于有时间回答你了。大多数Flutter应用程序都会有插件依赖项,这些插件也必须构建。Flutter模块使用pbhelper.rb脚本文件来完成此操作。我已经做到了,因此我可以构建所有依赖项、app.framework、flutter.framework,并且我们还得到了FlutterPluginRegistrant.framework,它引用了所有dep pods。我将所有这些框架放入了伞形框架中,在另一个iOS项目的模拟器中运行良好(只需嵌入它),然后创建了聚合目标并将伞形框架放入其中,结果我也可以为设备构建。 - Almas Adilbek
1
我有另一个问题。在Flutter模块项目中,如果我们有基于Swift的插件和静态框架插件(例如:firebase_messaging),我们会遇到构建错误,这是因为我们无法将这些静态框架构建为动态框架(在Podfile中指定!use_frameworks)。如果我删除!use_frameworks,则会出现基于Swift的插件的头文件路径问题。这仅适用于Flutter模块项目。在Flutter应用程序项目中构建没有问题。 - Almas Adilbek
1
小心使用“伞形框架”,因为它们不被允许在应用商店中使用。至于依赖项,如果客户想在他们的应用程序中使用相同的库,那么这将成为一个问题。我会尽量保持它们最小化。 - szotp
1
是的,我们了解 umbrella 框架的缺点。您认为本机 Pod 依赖项和插件 Pod 依赖项可能会彼此冲突吗? Umbrella 只包含与 Flutter 相关的插件 Pod,而不是本机应用程序中使用的插件 Pod。或者,我们错过了什么吗? - Almas Adilbek
1
是的,我的应用因为这个被拒绝了。 - szotp
显示剩余2条评论

4
为了将框架导出为本地库,您必须确保使用您的框架的人(用户)已经在他的计算机上安装了Flutter SDK,因为您的框架代码肯定默认依赖于Flutter SDK。所以你要做的就相当于在pub.dev上拥有自己的包。
如果您找到了使您要导出的框架独立于Flutter框架的方法,那么将其作为框架导出才有意义。(毫无疑问这是可能的,但请注意您将投入多少工作和时间才能让您的框架达到此目标。您可以在同样的努力和时间内构建自己的Flutter框架)
既然您已经制作了那个很棒的Flutter项目,请考虑将其上传为https://pub.dev/上的一个包,如果您希望的话。
建议:您可以要求想要尝试您的软件包的用户安装Flutter。这样,您的辛勤工作就不会白费。
结论:您正在尝试做的事情实际上并不可行。

1
谢谢您的回答。实际上,我们正在尝试将一个使用Flutter构建的商业产品作为SDK分发。SDK的消费者可以是本地应用程序或跨平台应用程序,这并不重要。而且,我们希望隐藏源代码。因此,在pub.dev上公开它不是一个选项。 - Almas Adilbek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接