目标:将 Flutter App 发布到 App Store 和 TestFlight

准备工作:

1. 一个苹果开发者账号

2. 装有 Xcode 的 mac 电脑

3. 一个 Flutter App 工程

注册一个 Bundle ID

每一个 iOS 应用都与一个在 Apple 登记的唯一的 Bundle ID 关联

  1. 登录你的开发者号打开 App IDs 页面
  2. 点击 + 来创建一个新的 Bundle ID
  3. 屏幕快照 107.png
  4. 选择 App IDs, 点击 continue
    屏幕快照 108.png
  5. 填写 Bundle ID 和描述
    屏幕快照 109.png
  6. 点击 Continue, 在下一页点击注册,完成!

在 App Store Connect 上注册你的 App

  1. 登录你的开发者账号会看到如下界面:
    屏幕快照 104.png
  2. 点击 + 新建 App
    sku 是你的 app 在 App Store 里的唯一标识,一般推荐直接使用 Bundle ID

屏幕快照 110.png

  1. 上传 app 图标,并存储
    屏幕快照 112.png

检查 Xcode 项目设置

  1. 在 Xcode 中,打开你的 App 的 ios 目录中的 Runner.xcworkspace
  2. 想要看你的 app 设置,在 Xcode 的项目导航栏中选择 Runner
  3. 选择 General tab

Identity

Display Name

Bundle Identifier

Runner
注意

Flutter 1.18.0-10.0.pre 之前的版本只能将显示名称设定为 Runner,不能命名为其他名字。有关更多信息,请参见 Issue 41793。

屏幕快照 120.png

Signing & Capabilities

Automatically

Team

勾选 Automatically manage signing。
Automatically manage signing 是否需要 Xcode 自动管理 app 签名和设置。这个默认被设置为 true ,对于绝大多数 App 来说都是适用的。对于更复杂的场景,查看 代码签名指南

屏幕快照 121.png

你项目的 General tab 应该看起来像是这样的:
屏幕快照 122.png

更改应用名称

屏幕快照 116.png

为了避免上传到 App Store coonect 后被驳回,请在 Info.plist 添加如下内容

    <key>NSAppleMusicUsageDescription</key>
    <string>App需要您的同意,才能访问媒体资料库</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>App需要您的同意,才能访问蓝牙</string>
    <key>NSCalendarsUsageDescription</key>
    <string>App需要您的同意,才能访问日历</string>
    <key>NSCameraUsageDescription</key>
    <string>App需要您的同意,才能访问相机</string>
    <key>NSContactsUsageDescription</key>
    <string>App需要您的同意,才能访问通讯录</string>
    <key>NSHealthShareUsageDescription</key>
    <string>App需要您的同意,才能访问健康分享</string>
    <key>NSHealthUpdateUsageDescription</key>
    <string>App需要您的同意,才能访问健康更新 </string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>App需要您的同意,才能始终访问位置</string>
    <key>NSLocationUsageDescription</key>
    <string>App需要您的同意,才能访问位置</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>App需要您的同意,才能在使用期间访问位置</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>App需要您的同意,才能访问麦克风</string>
    <key>NSMotionUsageDescription</key>
    <string>App需要您的同意,才能访问运动与健身</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>App需要您的同意,才能访问相册</string>
    <key>NSRemindersUsageDescription</key>
    <string>App需要您的同意,才能访问提醒事项</string>
    <key>NSSpeechRecognitionUsageDescription</key>
    <string>App需要您的同意,才能访问语音识别</string>
    <key>kTCCServiceMediaLibrary</key>
    <string>App需要您的同意,才能访问音乐</string>

提示

Infoo.plist 还需添加一项,如图,否则上传上传到 App Store 里的构建版本会显示 缺少合规证明

屏幕快照 118.png

更新应用版本号

每个应用默认的初始版本号是 1.0.0。若要更新它,请转到 pubspec.yaml 文件并更新以下内容:
version: 1.0.0+1
版本号由三个点分隔的数字组成,例如上面样例中的 1.0.0。然后是可选的构建号,例如上面样例中的 1,以 + 分隔。
版本号与构建号都可以在 Flutter 打包时分别使用 --build-name 和 --build-number 重新指定

添加应用图标

让 UI 切一张(1024x1024)的图片
打开这个网址:一键生成所有尺寸的应用图标 。上传准备好的 1024x1024 的图片,选择你所需要的平台。生成即可。
生成下载好后替换掉 Runner/Assets.xcassets 下的所有文件
替换后应该是这样的效果:
屏幕快照 117.png可以运行下 Flutter App 来验证你的图标是否已经被替换

创建一个构建归档 (build archive)

在这一步,你将创建一个构建归档,并上传到 App Store Connect。
在开发过程中,你将会使用 debug 模式来完成构建、调试并测试。当你准备好通过 App Store 或 TestFlight 交付你的 app 给用户时,你需要准备一个 release 构建。这时你也许想要混淆你的 Dart 代码以加大反编译难度。混淆你的代码需要在 build 的时候添加一些标志,并维护其他文件以消除反编译的堆栈跟踪。

  1. 在你的 Flutter App 应用目录的命令行中执行 flutter build ios (flutter build 默认指向 --release)
  2. 在 Xcode 中,打开你应用 ios 目录中的 Runner.xcworkspace
  3. 选择 Product > Scheme > Runner
  4. 选择 Product > Destination > Generic iOS Device
  5. 在 Xcode 项目导航栏中选择 Runner,然后在设置界面侧边栏选择 Runner 目标。
  6. 在 Identity 部分,更新 Version 为你想要发布的用户可见的版本号。
  7. 在 Identity 部分,更新 Build 标示为一个唯一的 Build 数字,用来在 App Store Connect 上追踪。每一个上传都需要一个独立的 Build 数字。
  8. 选择 Product > Archive 来生成一个构建归档
  9. 选择你刚刚的生成的构建归档,点击 Validate App
    屏幕快照 119.png

直接下一步下一步...
屏幕快照 123.png

  1. 当这个归档校验成功以后,点击 Distribute App
    直接下一步下一步...

上传成功后,你会在 30 分钟内收到一封信来提醒你

发布你的 app 到 TestFlight

  1. 在 App Store Connect 中,你的应用的详情页面跳转到 TestFlight Tab
    屏幕快照 124.png

为每一个内部测试人员添加邮件。你可以在 App Store Connect 的用户与角色页面添加额外的内部用户,他们将会出现在页面顶部的下拉菜单中