目标:将 Flutter App 发布到 App StoreTestFlight

准备工作:

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 的用户与角色页面添加额外的内部用户,他们将会出现在页面顶部的下拉菜单中