Flutter 是一种跨平台的移动应用开发框架,可以由 Dart 编写代码,并生成 iOS 和 Android 的原生应用。在开发完成后,我们往往需要对应用进行打包,并上架到 App Store 或者其他应用商店供用户下载安装。而在打包过程中,iOS 应用通常需要进行签名,以确保应用的身份和安全性。然而,有时候我们可能想要免签名打包 iOS 应用,本篇文章将介绍如何在 Flutter 中实现这一目标。
免签名打包 iOS 应用的原理是利用一些工具和技术将 Flutter 应用打包成一个预编译的动态库(dylib),然后将该动态库与一个最小化的原生应用包(wrapper)结合,最终生成一个免签名的可执行文件(ipa)。具体的步骤如下:
1. 配置 Flutter 工程
首先,在终端中进入 Flutter 工程目录,使用以下命令来配置工程:
```
flutter create --org com.example --template=plugin my_app
```
这将创建一个 Flutter 插件工程模板,其中 `--org` 参数用于设置应用的包名,`my_app` 则为工程的名称。
2. 构建 Flutter 引擎
在终端中进入工程目录,运行以下命令来构建 Flutter 引擎:
```
flutter build ios --no-codesign
```
这将生成一个 iOS 平台所需的框架和动态库,同时禁用代码签名。
3. 创建原生应用 wrapper
使用 Xcode 创建一个新的 iOS 项目,并命名为 `Wrapper`。在 `Wrapper` 项目中,导入 Flutter 引擎生成的框架和动态库,同时添加必要的配置。
4. 创建动态库 target
在 `Wrapper` 项目中创建一个新的 target,用于生成动态库。可以选择创建一个 Cocoa Touch Framework 或者一个 Cocoa Touch Library。在 target 的 Build Settings 中,配置相关参数,例如指定动态库的输出路径。
5. 编写动态库代码
在动态库的源码中,引入 Flutter 引擎提供的入口文件,并调用 `FlutterMain` 类的 `startWithOptions` 方法来启动 Flutter 引擎:
```
#import
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
void flutterMain() {
@autoreleasepool {
[FlutterMain startWithOptions:[[FlutterDylibPluginRegistry alloc] initWithServiceRegistry:nil]
delegate:[[FlutterAppDelegate alloc] init]];
}
}
```
6. 执行 Flutter 编译命令
返回终端,在工程目录中运行以下命令,编译 Flutter 应用:
```
flutter build bundle
```
这将生成一个包含 Flutter 应用代码的 `.zip` 文件。
7. 将 Flutter 应用代码拷贝到动态库项目中
将生成的 `.zip` 文件解压,并将其中的 `App.framework` 和 `flutter_assets` 文件夹拷贝到动态库项目的对应位置。
8. 编译并打包动态库
在 Xcode 中选择动态库 target,选择相应的真机设备,点击 `Build` 按钮进行编译。编译成功后,会生成一个 `libflutter.so` 文件。
9. 构建最小化的原生应用包
在 Xcode 中创建一个新的 iOS 项目,包名和应用名称可以任意设置。然后,将刚才生成的动态库 `libflutter.so` 拖拽到新项目中。
10. 安装依赖库
在新项目的 `Podfile` 文件中,添加以下依赖库,并运行 `pod install` 命令安装:
```
pod 'Flutter'
pod 'FlutterPluginRegistrant'
```
11. 添加启动代码
在新项目中的 `main.m` 文件中引入刚才生成的动态库,并调用 `flutterMain` 函数:
```
#import "AppDelegate.h"
void flutterMain();
int main(int argc, char * argv[]) {
@autoreleasepool {
// 注册动态库
flutterMain();
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
```
12. 打包 ipa 文件
在 Xcode 中选择真机设备,点击 `Product -> Archive` 进行打包。打包成功后,可以在 `Organizer` 中导出 ipa 文件。
通过上述步骤,我们就成功实现了 Flutter 应用的免签名打包。这样的打包方式相对简洁,无需证书和签名文件,适用于一些特定的开发和测试场景。然而,需要注意的是,由于免签名打包的应用无法在正式的 App Store 中上架,因此仅适用于内部使用或者在非官方渠道分发的情况下使用。