如何将 Flutter 项目导出为 SDK(iOS 动态框架)
How to export Flutter project as SDK (iOS dynamic framework)
我们已经构建了一个很棒的 Flutter 项目,它具有我们想要导出作为框架[的强大功能] =31=],就像本机 库 所做的那样,因此源代码被隐藏(转换为动态框架)。
我们已按照说明进行操作:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps
这允许我们在主机 iOS 应用程序中包含 Flutter 项目,初始化 FlutterEngine
并使用 FlutterViewController
.
问题是,我们如何创建一个动态框架,比方说 SomeProductSDK.framework,它将公开一个 public 方法来创建我们的 SomeProductSDK 相关模态屏幕?
// In any app
import SomeProductSDK
let controller = TransactionViewController() // SomeProductSDK.framework with partial implementation with flutter
self.present(controller, animated: true)
为了将框架导出为本机库,您必须确保将使用您的框架的人(用户)在其计算机上安装了 Flutter SDK,因为您的框架代码肯定会依赖于 Flutter默认情况下。因此,您尝试做的相当于在 pub.dev 上拥有自己的包裹。
如果您找到某种方法使您想要导出的框架独立于 Flutter 的框架,那么只有将其导出为框架才有意义。 (毫无疑问,这样做应该是可能的,但看看你将投入多少工作和时间来让你的框架在那里。你可以用同样的努力和时间构建你自己的 Flutter 框架)
由于您已经制作了很棒的 Flutter 项目,如果您愿意,请考虑将其作为一个包上传到 https://pub.dev/。
建议:可以让想试用你包的用户安装Flutter。这样你的努力才不会白费。
结论: 实现你想要做的事情实际上是不可行的。
我已经部分实现了你想要的。所有这些都是非常实验性的,总体上对于生产就绪的 SDK 来说不是一个好主意。但是……这是可能的。
- 像往常一样创建 flutter 应用程序,然后 运行 在 iOS 模拟器上创建一次。
- 打开 Xcode 工作区并添加新框架。出于我的目的,我将其命名为 RunnerLib。
- 将该框架的部署目标更改为与 Runner 相同。同时禁用位码。
- 将 App.framework 和 Flutter.framework 的目标成员资格更改为 RunnerLib。
- 使用一种静态方法创建 Launcher class:
+ (void)launchFrom:(UIViewController *)parent
,这应该创建一个 FlutterViewController 并呈现它。
- 重写 Runner 以使用 Launcher class。将 FlutterAppDelegate 替换为标准 AppDelegate,制作 ViewController 等。它应该看起来像标准原生 iOS 项目,因此您可以创建一个并复制 AppDelegate、storyboard 和 ViewController.
- 在视图控制器、viewDidAppear 中或作为按钮上的 IBAction 调用 launchFrom 方法。
- 您应该能够构建 Runner 并看到出现 flutter 屏幕。
- 现在,如果您构建 Runner 应用程序,您可以打开装箱的 Runner.app,并看到 Frameworks 目录包含 3 个框架:App、Flutter 和 Runner。
- 您将需要两套框架:一套用于模拟器,在调试模式下编译,另一套用于设备 - 已存档。获取调试框架非常简单,只需从 Xcode 编译并检查产品即可。归档框架更难,我建议
xcodebuild archive
禁用签名。
- 您的用户必须根据设备配置他们的项目以使用正确的框架。 Carthage 和 fat 二进制文件可能会自动执行此步骤,但我不确定。问题出在 App.framework 上,它在设备上看起来与在模拟器上完全不同。
我们已经构建了一个很棒的 Flutter 项目,它具有我们想要导出作为框架[的强大功能] =31=],就像本机 库 所做的那样,因此源代码被隐藏(转换为动态框架)。
我们已按照说明进行操作:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps
这允许我们在主机 iOS 应用程序中包含 Flutter 项目,初始化 FlutterEngine
并使用 FlutterViewController
.
问题是,我们如何创建一个动态框架,比方说 SomeProductSDK.framework,它将公开一个 public 方法来创建我们的 SomeProductSDK 相关模态屏幕?
// In any app
import SomeProductSDK
let controller = TransactionViewController() // SomeProductSDK.framework with partial implementation with flutter
self.present(controller, animated: true)
为了将框架导出为本机库,您必须确保将使用您的框架的人(用户)在其计算机上安装了 Flutter SDK,因为您的框架代码肯定会依赖于 Flutter默认情况下。因此,您尝试做的相当于在 pub.dev 上拥有自己的包裹。
如果您找到某种方法使您想要导出的框架独立于 Flutter 的框架,那么只有将其导出为框架才有意义。 (毫无疑问,这样做应该是可能的,但看看你将投入多少工作和时间来让你的框架在那里。你可以用同样的努力和时间构建你自己的 Flutter 框架)
由于您已经制作了很棒的 Flutter 项目,如果您愿意,请考虑将其作为一个包上传到 https://pub.dev/。
建议:可以让想试用你包的用户安装Flutter。这样你的努力才不会白费。
结论: 实现你想要做的事情实际上是不可行的。
我已经部分实现了你想要的。所有这些都是非常实验性的,总体上对于生产就绪的 SDK 来说不是一个好主意。但是……这是可能的。
- 像往常一样创建 flutter 应用程序,然后 运行 在 iOS 模拟器上创建一次。
- 打开 Xcode 工作区并添加新框架。出于我的目的,我将其命名为 RunnerLib。
- 将该框架的部署目标更改为与 Runner 相同。同时禁用位码。
- 将 App.framework 和 Flutter.framework 的目标成员资格更改为 RunnerLib。
- 使用一种静态方法创建 Launcher class:
+ (void)launchFrom:(UIViewController *)parent
,这应该创建一个 FlutterViewController 并呈现它。 - 重写 Runner 以使用 Launcher class。将 FlutterAppDelegate 替换为标准 AppDelegate,制作 ViewController 等。它应该看起来像标准原生 iOS 项目,因此您可以创建一个并复制 AppDelegate、storyboard 和 ViewController.
- 在视图控制器、viewDidAppear 中或作为按钮上的 IBAction 调用 launchFrom 方法。
- 您应该能够构建 Runner 并看到出现 flutter 屏幕。
- 现在,如果您构建 Runner 应用程序,您可以打开装箱的 Runner.app,并看到 Frameworks 目录包含 3 个框架:App、Flutter 和 Runner。
- 您将需要两套框架:一套用于模拟器,在调试模式下编译,另一套用于设备 - 已存档。获取调试框架非常简单,只需从 Xcode 编译并检查产品即可。归档框架更难,我建议
xcodebuild archive
禁用签名。 - 您的用户必须根据设备配置他们的项目以使用正确的框架。 Carthage 和 fat 二进制文件可能会自动执行此步骤,但我不确定。问题出在 App.framework 上,它在设备上看起来与在模拟器上完全不同。