【问题标题】:How to export Flutter project as SDK (iOS dynamic framework)如何将 Flutter 项目导出为 SDK(iOS 动态框架)
【发布时间】:2020-01-02 17:31:45
【问题描述】:

我们已经构建了一个很棒的 Flutter 项目,它具有我们想要导出作为框架的强大功能,就像原生 这样做,以便隐藏源代码(转换为动态框架)。

我们已按照说明操作:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps

这允许我们将 Flutter 项目包含在 Host iOS 应用程序中,初始化 FlutterEngine 并使用 FlutterViewController

问题是,我们如何创建一个动态框架,比如说 SomeProductSDK.framework,它将公开一个公共方法来创建我们的 SomeProductSDK 相关的 modal屏幕

// In any app
import SomeProductSDK

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

【问题讨论】:

    标签: ios flutter frameworks static-libraries dynamic-frameworks


    【解决方案1】:

    我已经部分实现了你想要的。所有这些都是非常实验性的,对于生产就绪的 SDK 来说总体上是个坏主意。但是……这是可能的。

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

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

    【讨论】:

    • 谢谢,终于有时间回复你了。大多数情况下,flutter 应用程序都会有插件依赖项,这些插件也必须构建。 Flutter 模块使用 pbhelper.rb sciprt 文件来做到这一点。我做到了,所以我可以构建所有的 dep、app.framework、flutter.framework,我们还得到了 FlutterPluginRegistrant.framework,它指的是所有的 dep pod。我已经将所有这些框架放入了伞形框架中,该框架在另一个 iOS 项目中对 Simulator 工作正常(只是嵌入它),然后创建聚合目标并将伞形放入其中,因此我也可以为设备构建。
    • 我还有一个问题。在颤振模块项目中,如果我们有一个基于 swift 的插件和静态框架插件(例如:firebase_messaging),我们会得到构建错误,那是因为我们不能将这些静态框架构建为动态的(在 Podfile 中指定!use_frameworks)。如果我删除 !use_frameworks,那么我们会遇到基于 swift 的插件的标题路径问题。这仅适用于 Flutter 模块项目。在 Flutter 应用项目中构建没有问题。
    • 小心使用伞形框架。他们在应用商店中是不允许的。至于依赖关系,如果他们想在他们的应用程序中使用相同的库,他们将成为客户的问题。我会尽量减少它们。
    • 是的,我们知道伞形框架的缺点。你认为原生 Pod 依赖和插件 pod 依赖会相互冲突吗? Umbrella 仅包含与 Flutter 相关的插件 pod,而不是原生应用程序中使用的插件。或者,我们错过了什么?
    • 你好。我是否理解在项目中使用伞形框架不会通过 iTunes 连接验证?
    【解决方案2】:

    为了将框架导出为本机库,您必须确保将使用您的框架的人(用户)已将 Flutter SDK 安装到他的计算机上,因为您的框架代码肯定会依赖于 Flutter SDK默认。因此,您尝试做的相当于在 pub.dev 上拥有自己的包。

    如果您找到某种方法来制作您想要导出的框架 - 独立于 Flutter 的框架,那么只有将其作为框架导出才有意义。 (毫无疑问,这样做应该是可能的,但是看看你将投入的工作量和时间只是为了让你的框架在那里。你可以用同样的努力和时间构建你自己的 Flutter 框架)

    既然你已经做出了很棒的 Flutter 项目,如果你愿意,可以考虑将它作为一个包上传到 https://pub.dev/

    建议:你可以让想要试用你的包的用户安装Flutter。这样你的努力就不会白费。

    结论: 实现你的目标实际上是不可行的。

    【讨论】:

    • 感谢您的回答。实际上,我们正在尝试将商业产品作为 SDK 分发,它是用 Flutter 构建的。 SDK 消费者是原生应用还是跨平台应用都无所谓。而且,我们要隐藏源代码。所以在 pub.dev 中公开它不是一种选择。
    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 2021-07-23
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多