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

时间:2019-08-29 12:25:55

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

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

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

这允许我们将Flutter项目包含在Host iOS应用中,初始化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 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

为了将框架导出为本地库,您必须确保将使用框架(用户)的用户的计算机上安装了Flutter SDK,因为您的框架代码肯定会依赖Flutter SDK,默认。因此,您要做的等同于在pub.dev上拥有自己的软件包。

如果找到某种方法来制作要导出的框架-独立于Flutter的框架,则只有将其导出为框架才有意义。 (这样做毫无疑问是可能的,但是要看到为使框架实现所需的工作量和时间。您可以在同样的时间和精力下构建自己的Flutter框架)

由于您已经完成了很棒的 Flutter项目,因此,如果愿意,可以考虑将其作为软件包上传到https://pub.dev/

建议:您可以要求要尝试安装软件包的用户安装Flutter。这样,您的辛苦便不会白费。

结论: 实现您的尝试实际上不可行。