跳到主内容

构建并发布 iOS 应用

如何向 App Store 发布 Flutter 应用。

本指南提供了将 Flutter 应用发布至 App StoreTestFlight 的分步说明。

准备工作

#

构建和发布应用需要 Xcode。您必须使用运行 macOS 的设备来遵循本指南。

在开始应用发布流程之前,请确保您的应用符合苹果的 App 审核准则

要将应用发布到 App Store,您必须首先注册 Apple Developer Program。您可以阅读苹果的选择会员资格指南,以了解更多关于不同会员选项的信息。

视频概览

#

对于更喜欢看视频而不是阅读文本的用户,以下视频涵盖了与本指南相同的内容。

在新标签页中观看 YouTube 视频:“分 7 步发布由 Flutter 构建的 iOS 应用”

在 App Store Connect 上注册您的应用

#

App Store Connect(前身为 iTunes Connect)上管理您的应用生命周期。您可以在此定义应用名称和描述、添加截图、设置价格,并管理在 App Store 和 TestFlight 上的发布。

注册应用包含两个步骤:注册唯一的套装 ID (Bundle ID),以及在 App Store Connect 上创建应用记录。

有关 App Store Connect 的详细概述,请参阅 App Store Connect 指南。

注册套装 ID (Bundle ID)

#

每个 iOS 应用都关联一个套装 ID (Bundle ID),这是一个在苹果注册的唯一标识符。要为您的应用注册套装 ID,请按照以下步骤操作

  1. 打开开发者账户的 App ID 页面。
  2. 点击 + 号以创建新的套装 ID。
  3. 输入应用名称,选择 Explicit App ID,并输入一个 ID。
  4. 选择您的应用所使用的服务,然后点击 Continue
  5. 在下一页上,确认详细信息并点击 Register 以注册您的套装 ID。

在 App Store Connect 上创建应用记录

#

在 App Store Connect 上注册您的应用

  1. 在浏览器中打开 App Store Connect
  2. 在 App Store Connect 着陆页上,点击 Apps
  3. 点击左上角的 + 号,然后选择 New App
  4. 在弹出的表单中填写您的应用详细信息。在“平台 (Platforms)”部分,确保勾选了 iOS。由于 Flutter 目前不支持 tvOS,请勿勾选该选项。点击 Create
  5. 导航到您应用的应用详情页面,并从侧边栏选择 App Information
  6. 在“常规信息 (General Information)”部分,选择您在上一步中注册的套装 ID。

如需详细概述,请参阅向您的账户添加应用

检查 Xcode 项目设置

#

本步骤涵盖了检查 Xcode 工作区中最关键的设置。有关详细流程和说明,请参阅准备应用分发

在 Xcode 中导航到您的目标 (Target) 设置

  1. 通过在 Flutter 项目目录的终端窗口中运行 open ios/Runner.xcworkspace,打开项目中的默认 Xcode 工作区。
  2. 要查看应用的设置,请在 Xcode 导航器中选择 Runner 目标。

验证最重要的设置。

General 标签页的 Identity 部分

显示名称 (Display Name)

您应用的显示名称。

套装标识符 (Bundle Identifier)

您在 App Store Connect 上注册的 App ID。

Signing & Capabilities 标签页

自动管理签名 (Automatically manage signing)

Xcode 是否应自动管理应用签名和配置文件。默认设置为 true,这对大多数应用来说已足够。对于更复杂的场景,请参阅代码签名指南

团队 (Team)

选择与您注册的 Apple Developer 账户关联的团队。如果需要,请选择 Add Account...,然后更新此设置。

Build Settings 标签页的 Deployment 部分

iOS 部署目标 (iOS Deployment Target)

您的应用支持的最低 iOS 版本。Flutter 支持 iOS 13 及更高版本。如果您的应用或插件包含使用 iOS 13 以上版本 API 的 Objective-C 或 Swift 代码,请将此设置更新为所需的最高版本。

项目设置的 General 标签页应与下图类似

Xcode Project Settings

有关应用签名的详细概述,请参阅创建、导出和删除签名证书

添加应用图标

#

当创建新的 Flutter 应用时,会生成占位图标集。本步骤涵盖如何用您自己的应用图标替换这些占位图标。

  1. 请查阅 iOS 应用图标准则,特别是关于创建浅色、深色和着色图标的建议。
  2. 在 Xcode 项目导航器中,选择 Runner 文件夹中的 Assets.xcassets。用您自己的应用图标更新占位图标。
  3. 通过运行 flutter run 启动应用,验证图标是否已替换。

添加启动图

#

与应用图标类似,您也可以替换占位启动图。

  1. 在 Xcode 项目导航器中,选择 Runner 文件夹中的 Assets.xcassets。用您自己的启动图更新占位启动图。
  2. 通过热重启 (Hot Restart) 您的应用来验证新的启动图。(请勿使用 hot reload。)

创建构建归档并上传至 App Store Connect

#

在开发过程中,您一直使用 debug 构建进行构建、调试和测试。当您准备将应用分发给 App Store 或 TestFlight 上的用户时,需要准备一个 release 构建。

更新应用的构建版本号和版本号

#

应用的默认版本号是 1.0.0。要更新它,请导航到 pubspec.yaml 文件并更新以下行:

yaml
version: 1.0.0+1

版本号是三个由点分隔的数字(如上例中的 1.0.0),后跟一个可选的构建编号(如上例中的 1),并以 + 号分隔。

版本号和构建编号都可以在 flutter build ipa 命令中通过分别指定 --build-name--build-number 来覆盖。

在 iOS 中,build-name 使用 CFBundleShortVersionString,而 build-number 使用 CFBundleVersion。在 Apple 开发者网站的核心基础键 (Core Foundation Keys)部分阅读更多关于 iOS 版本控制的信息。

您也可以在 Xcode 中覆盖 pubspec.yaml 中的构建名称和编号。

  1. 打开应用 ios 文件夹下的 Runner.xcworkspace
  2. 在 Xcode 项目导航器中选择 Runner,然后在设置视图侧边栏中选择 Runner 目标。
  3. 在 Identity 部分,将 Version 更新为您希望发布的用户可见版本号。
  4. 在 Identity 部分,将 Build 标识符更新为一个唯一的构建编号,用于在 App Store Connect 上跟踪此版本。每次上传都需要一个唯一的构建编号。

创建应用套装 (App Bundle)

#

运行 flutter build ipa,在项目的 build/ios/archive/ 目录中生成 Xcode 构建归档(.xcarchive 文件),并在 build/ios/ipa 中生成 App Store 应用套装(.ipa 文件)。

考虑添加 --obfuscate--split-debug-info 标志以混淆您的 Dart 代码,从而增加逆向工程的难度。

如果您不发布到 App Store,可以通过添加 --export-method ad-hoc--export-method development--export-method enterprise 选项来选择不同的导出方法

将应用套装上传至 App Store Connect

#

一旦应用套装创建完成,请通过以下任一方式将其上传至 App Store Connect

  1. 安装并打开 Apple Transporter macOS 应用。将 build/ios/ipa/*.ipa 应用套装拖放到该应用中。

  2. 或者通过命令行上传应用套装:

    bash
    xcrun altool --upload-app --type ios -f build/ios/ipa/*.ipa --apiKey your_api_key --apiIssuer your_issuer_id
    

    运行 man altool 以获取关于如何使用 App Store Connect API 密钥进行身份验证的详细信息。

  3. 或者在 Xcode 中打开 build/ios/archive/MyApp.xcarchive

    点击 Validate App 按钮。如果报告了任何问题,请解决它们并重新构建。在您上传归档文件之前,您可以重复使用相同的构建 ID。

    归档验证成功后,点击 Distribute App

您可以在 App Store Connect 上应用详情页面的“活动 (Activities)”标签页中跟踪构建状态。您应该会在 30 分钟内收到一封电子邮件,通知您的构建已通过验证,并可在 TestFlight 上向测试人员发布。此时,您可以选择是在 TestFlight 上发布,还是继续将应用发布到 App Store。

更多详细信息,请参阅上传应用至 App Store Connect

使用 Codemagic CLI 工具创建构建归档

#

此步骤涵盖了使用 Flutter 构建命令以及在 Flutter 项目目录的终端中执行 Codemagic CLI 工具,来创建构建归档并上传至 App Store Connect。这使您能够在与登录钥匙串隔离的临时钥匙串中,完全控制分发证书并创建构建归档。

  1. 安装 Codemagic CLI 工具

    bash
    pip3 install codemagic-cli-tools
    
  2. 您需要生成一个具有 App Manager 权限的 App Store Connect API 密钥,以自动化 App Store Connect 的操作。为了使后续命令更简洁,请使用新密钥设置以下环境变量:issuer id、key id 和 API 密钥文件。

    bash
    export APP_STORE_CONNECT_ISSUER_ID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
    export APP_STORE_CONNECT_KEY_IDENTIFIER=ABC1234567
    export APP_STORE_CONNECT_PRIVATE_KEY=`cat /path/to/api/key/AuthKey_XXXYYYZZZ.p8`
    
  3. 您需要导出或创建 iOS 分发证书来对构建归档进行代码签名和打包。

    如果您有现有的证书,可以针对每个证书执行以下命令来导出私钥

    bash
    openssl pkcs12 -in <certificate_name>.p12 -nodes -nocerts | openssl rsa -out cert_key
    

    或者,您可以通过执行以下命令创建新的私钥

    bash
    ssh-keygen -t rsa -b 2048 -m PEM -f cert_key -q -N ""
    

    之后,您可以让 CLI 工具根据私钥自动创建新的 iOS 分发证书。

  4. 设置一个新的临时钥匙串以用于代码签名

    bash
    keychain initialize
    
  5. 从 App Store Connect 获取代码签名文件

    bash
    app-store-connect fetch-signing-files $(xcode-project detect-bundle-id) \
        --platform IOS \
        --type IOS_APP_STORE \
        --certificate-key=@file:/path/to/cert_key \
        --create
    

    其中 cert_key 是您导出的 iOS 分发证书私钥,或是自动生成新证书的新私钥。如果 App Store Connect 中不存在该证书,将根据私钥创建证书。

  6. 现在将获取到的证书添加到您的钥匙串中

    bash
    keychain add-certificates
    
  7. 更新 Xcode 项目设置以使用获取的代码签名配置文件

    bash
    xcode-project use-profiles
    
  8. 安装 Flutter 依赖项

    bash
    flutter packages pub get
    
  9. 安装 CocoaPods 依赖项

    bash
    find . -name "Podfile" -execdir pod install \;
    
  10. 构建 Flutter iOS 项目

    bash
    flutter build ipa --release \
        --export-options-plist=$HOME/export_options.plist
    

    请注意,export_options.plistxcode-project use-profiles 命令的输出结果。

  11. 将应用发布到 App Store Connect

    bash
    app-store-connect publish \
        --path $(find $(pwd) -name "*.ipa")
    
  12. 如前所述,别忘了将您的登录钥匙串设为默认值,以避免机器上的应用出现身份验证问题。

    bash
    keychain use-login
    

您应该会在 30 分钟内收到一封电子邮件,通知您的构建已通过验证,并可在 TestFlight 上向测试人员发布。此时,您可以选择是在 TestFlight 上发布,还是继续将应用发布到 App Store。

在 TestFlight 上发布您的应用

#

TestFlight 允许开发者将应用推送给内部和外部测试人员。此可选步骤涵盖了在 TestFlight 上发布您的构建版本。

  1. App Store Connect 上导航到您应用详情页面的 TestFlight 标签页。
  2. 在侧边栏中选择 Internal Testing
  3. 选择要发布给测试人员的构建版本,然后点击 Save
  4. 添加内部测试人员的电子邮件地址。您可以在 App Store Connect 的 Users and Roles 页面中添加额外的内部用户,该页面可从页面顶部的下拉菜单中访问。

更多详细信息,请参阅使用 TestFlight 分发应用

在 App Store 上发布您的应用

#

当您准备向全球发布应用时,请按照以下步骤提交应用进行审核并发布到 App Store

  1. App Store Connect 上应用详情页面的侧边栏中选择 Pricing and Availability,并填写所需信息。
  2. 从侧边栏选择状态。如果这是该应用的首次发布,其状态为 1.0 Prepare for Submission。填写所有必填字段。
  3. 点击 Submit for Review

当苹果的 App 审核流程完成后,他们会通知您。您的应用将按照您在 Version Release 部分中指定的说明进行发布。

更多详细信息,请参阅通过 App Store 分发应用

故障排除

#

分发您的应用指南提供了向 App Store 发布应用过程的详细概述。