将 Xamarin.iOS 应用发布到 App Store

若要将应用发布至 App Store,应用开发人员必须先将该应用及其屏幕截图、说明、图标和其他信息提交给 Apple 审核。 Apple 会在批准应用后将其加入 App Store,用户可以直接使用 iOS 设备在其中购买并安装应用。

本指南介绍向 App Store 提供应用以及将应用发给 Apple 审核所要遵循的步骤。 具体而言,描述了以下内容:

  • 遵循 App Store 审核指南
  • 设置应用 ID 和权利
  • 提供 App Store 图标和应用图标
  • 设置 App Store 预配配置文件
  • 更新“发布”生成配置
  • 在 iTunes Connect 中配置应用
  • 生成应用并将其提交至 Apple

重要

Apple 已表明,从 2019 年 3 月开始,提交到 App Store 的所有应用和更新必须是使用 iOS 12.1 SDK 或更高版本构建的,包含在 Xcode 10.1 或更高版本中。 应用还应支持 iPhone XS 和 12.9 英寸 iPad Pro 屏幕大小。

App Store 指南

在将应用提交以发布在 App Store 之前,请确保应用符合 Apple 的 App Store 审核指南中所定义的标准。 在将应用提交至 App Store 时,Apple 会审核应用以确保它满足这些要求。 如果不满足,Apple 会拒绝该应用,需要处理好提出的问题并重新提交应用。 因此,在开发过程中最好尽早熟悉这些准则。

提交应用时需要注意几点:

  1. 确保应用的描述与其功能匹配。
  2. 测试应用不会在正常使用时崩溃。 这包括在它支持的每台 iOS 设备上的使用情况。

另请参阅 Apple 提供的 App Store 相关资源

设置应用 ID 和权利

每个 iOS 应用都有唯一的应用 ID,此 ID 有一组相关联的应用程序服务,也就是“权利”。 “权利”允许应用执行一系列的操作,例如接收推送通知、访问 iOS 功能(例如 HealthKit)等等。

若要创建应用 ID 并选择任何需要的权利,请访问 Apple 开发人员门户并执行以下步骤:

  1. 登录到 Apple 开发人员门户。 如果还没有 Apple ID,请先创建 Apple ID
  2. 依次转到“证书、ID 和配置文件”部分以及“标识符”部分
  3. 单击页面顶部标识符标题旁边的 按钮+
  4. 选择“应用 ID”,然后单击“继续”
  5. 选择“应用”,然后单击“继续”
  6. 为新应用程序输入“描述”和“捆绑 ID”,然后选择 Xamarin.iOS 应用程序要求的任何“功能”使用 Xamarin.iOS 中的功能指南中进一步描述了应用服务。 选择完后,单击“继续”
  7. 单击“注册”按钮完成创建新应用 ID 的过程

定义应用 ID 时,除了选择和配置所需的应用程序服务,还必须通过编辑“Info.plist”和“Entitlements.plist”文件在 Xamarin.iOS 项目中配置权利。 有关详细信息,请参阅使用 Xamarin.iOS 中的权利指南,其中介绍了如何创建 Entitlements.plist 文件以及它所包含的各种权利设置的含义

包括 App Store 图标

在将应用提交至 Apple 时,请确保包含一个带有 App Store 图标的资产目录。 若要了解如何做到这一点,请参阅 Xamarin.iOS 中的 App Store 图标指南。

设置应用图标和启动屏幕

为了让 Apple 能在 App Store 上提供 iOS 应用,该应用必须在所有能运行的 iOS 设备上具备合适的图标和启动屏幕。 若要详细了解如何设置应用图标和启动屏幕,请阅读以下指南:

创建并安装 App Store 预配配置文件

iOS 使用预配配置文件来控制特定应用程序生成的部署方式。 这些文件包含有关用于应用签名的证书、应用 ID 和应用安装位置的信息。 对于开发和临时分发,预配配置文件还包括允许部署应用的设备列表。 但是如果是 App Store 分发,则只包含证书和应用 ID 信息,因为公开分发的唯一机制是 App Store。

若要创建和安装 App Store 预配配置文件,请执行以下步骤:

  1. 登录到 Apple 开发人员门户
  2. 依次转到“证书、ID 和配置文件”部分以及“配置文件”部分
  3. 单击 按钮,选择“iOS 应用开发”和 App Store,然后单击“继续”+
  4. 从列表中选择应用的“应用 ID”然后单击“继续”
  5. 选择签名证书,然后单击“继续”
  6. 选择要包含在此配置文件中的设备,然后单击“继续”
  7. 输入一个预配配置文件名称,然后单击“生成”以生成配置文件
  8. 使用 Xamarin 的 Apple 帐户管理工具将新建的预配配置文件下载到 Mac。 如果是在 Mac 设备上,还可以直接从 Apple 开发人员门户下载预配配置文件并双击它以进行安装。

有关详细说明,请参阅创建分发配置文件在 Xamarin.iOS 项目中选择分发配置文件

更新“发布”生成配置

新的 Xamarin.iOS 项目会自动设置“调试”和“发布”生成配置。 若要正确地配置“发布”生成,请执行以下步骤

  1. 在 Solution Pad 中,打开位于 iOS 项目内部的 Info.plist 文件

  2. 请确保位于“应用程序”视图。 这可以通过单击底部导航栏中的选项来设置。

  3. 选择“手动预配”作为签名选项。 保存并关闭该文件。

  4. 在 Solution Pad 中右键单击“项目名称”,选择“选项”并导航至“iOS 生成”选项卡

  5. 将“配置”设为“发布”,并将“平台”设为“iPhone”

  6. 若要使用特定 iOS SDK 进行生成,请从“SDK 版本”列表中进行选择。 如果不需要,则让此值保持为“默认”

  7. 通过链接,可去除未使用的代码,从而降低应用程序的整体大小。

    • 在大多数情况下,“链接器行为”应设为默认值“仅链接框架 SDK”
    • 使用“不链接”选项可能会导致 Apple 因以下原因而拒绝应用:Xamarin 中存在需要使用“仅链接 Framework SDK”选项进行链接的非公共 iOS API
    • 应谨慎使用“全部链接”,因为它将从项目的所有程序集中去除代码,包括第三方库。 它会去除第三方库可能仅通过反射(链接器无法检测到)使用的代码,因为它执行静态代码分析来确定正在使用的库代码。 应谨慎使用“全部链接”,因为可能需要手动保留某些类和/或方法来避免由于缺少代码而导致运行时失败
    • 有关详细信息,请参阅链接 Xamarin.iOS 应用指南。
  8. 对于 iOS 11,请选择一个支持 ARM64 的设备体系结构。 若要深入了解适用于 64 位 iOS 设备的生成,请参阅 32/64 位平台注意事项文档中的“启用 Xamarin.iOS 应用的 64 位生成”部分

  9. 可使用 LLVM 编译器生成更小更快的代码。 但是此选项会增加编译时间。

  10. 选中“优化 PNG 图像”以进一步降低应用程序的大小

  11. 应启用调试,因为这将使生成增加不必要的大小。

  12. 根据应用程序的需要,可能需要调整使用的垃圾回收的类型以及国际化的设置。

    按上文所述设置选项后,你的生成设置应类似于:

    iOS Build settings

    另请参阅 iOS 生成机制指南,其中进一步介绍了生成设置。

  13. 导航至“iOS 捆绑签名”选项卡。如果此处的选项不可编辑,请确保在 Info.plist 文件中选择了“手动预配”

  14. 请确保将“配置”设置为“发布”,并将“平台”设置为“iPhone”

  15. 将“签名标识”设置为“分发(自动)”

  16. 对于“预配配置文件”,请选择上面创建的 App Store 预配配置文件

    现在,项目的捆绑签名选项应类似如下:

    iOS Bundle Signing

  17. 单击“确定”,保存对项目属性所做的更改

在 iTunes Connect 中配置应用

iTunes Connect 是一款基于 Web 的工具套件,用于在 App Store 上管理 iOS 应用程序。 必须在 iTunes Connect 中对 Xamarin.iOS 应用程序进行恰当的配置,然后才能提交到 Apple 进行审核并在 App Store 上发布。

若要了解如何做到这一点,请阅读在 iTunes Connect 中配置应用指南。

生成并提交应用

如果已正确配置生成设置,且 iTunes Connect 正在等待提交,则可生成应用并将其提交至 Apple。

  1. 在 Visual Studio for Mac 中,选择“发布”生成配置和一个作为生成目标的设备(不是模拟器)

    Build configuration and platform selection

  2. 在“生成”菜单中,选择“存档以供发布”

  3. 存档创建完成后,将显示“存档”视图。 单击“签名并分发...”以打开发布向导

    Screenshot of the Sign and Distribute button location in the Archives view.

    注意

    默认情况下,“存档”视图仅显示打开的解决方案的存档。 若要查看拥有存档的所有解决方案,请勾选“显示所有存档”复选框。 最好保留旧的存档,以便在必要时将它们所包含的调试信息用于符号化崩溃报告。

  4. 选择“App Store”分发通道。 单击 “下一步”

  5. 选择“上传”作为目标。 单击 “下一步”

  6. 在“预配配置文件”窗口中选择签名标识、应用和预配配置文件。 单击 “下一步”

    Screenshot of the Provisioning profile wizard page showing a valid signing identity, app, and provisioning profile selection.

  7. 在“App Store Connect 信息”窗口中,从菜单中选择 Apple ID 用户名,然后输入应用特定的密码。 单击 “下一步”

    Screenshot of the App Store Connect information wizard page showing an Apple ID user name selected.

  8. 验证包的详细信息,然后单击“发布”。 选择一个位置来保存 .ipa 文件后,向导会将应用上传到 App Store Connect。

    注意

    Apple 可能会使用 .ipa 文件中包含的 iTunesMetadata.plist 拒绝应用,导致如下所示的错误

    ERROR: ERROR ITMS-90047: "Disallowed paths ( "iTunesMetadata.plist" ) found at: Payload/iPhoneApp1.app"

    若要了解如何处理此错误,请参阅 Xamarin 论坛中的这篇帖子

iTunes Connect 状态

若要查看应用提交的状态,请登录至 iTunes Connect 并选择应用。 初始状态应该为“等待审核”,不过在被处理时可能会暂时地显示为“上传已接收”

Waiting For Review

提示和技巧

自定义 .ipa 位置

可以通过 MSBuild 属性 IpaPackageDir 来自定义 .ipa 文件输出位置。 如果将 IpaPackageDir 设为自定义位置,则 .ipa 文件将放入该位置,而不是默认时间戳子目录中。 创建依赖特定目录路径才能正常工作的自动生成,如用于持续集成 (CI) 生成的生成,此操作会很有帮助。

要使用新属性,有以下几种可能的方法。 例如,若要将 .ipa 文件输出到旧的默认目录(正如在 Xamarin.iOS 9.6 和更低版本中那样),可以使用以下方法之一将 IpaPackageDir 属性设为 $(OutputPath)。 两种方法都与所有 Unified API Xamarin.iOS 生成兼容,包括 IDE 生成,以及使用 msbuild 或 mdtool 的命令行生成

  • 第一个选项是,在 MSBuild 文件的 <PropertyGroup> 元素内,设置 IpaPackageDir 属性。 例如,可将以下 <PropertyGroup> 添加到 iOS 应用项目 .csproj 文件底部(</Project> 结束标记前):

    <PropertyGroup>
      <IpaPackageDir>$(OutputPath)</IpaPackageDir>
    </PropertyGroup>
    
  • 更好的方法是将 <IpaPackageDir> 元素添加到现有 <PropertyGroup> 的底部,对应用于生成 .ipa 文件的配置。 此方法更好,因为会在 iOS IPA 选项项目属性页上使用计划设置针对将来的兼容性准备项目。 如果当前使用 Release|iPhone 配置生成 .ipa 文件,完整的已更新属性组可能类似下面这样:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone'">
       <Optimize>true</Optimize>
       <OutputPath>bin\iPhone\Release</OutputPath>
       <ErrorReport>prompt</ErrorReport>
       <WarningLevel>4</WarningLevel>
       <ConsolePause>false</ConsolePause>
       <CodesignKey>iPhone Developer</CodesignKey>
       <MtouchUseSGen>true</MtouchUseSGen>
       <MtouchUseRefCounting>true</MtouchUseRefCounting>
       <MtouchFloat32>true</MtouchFloat32>
       <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
       <MtouchLink>SdkOnly</MtouchLink>
       <MtouchArch>ARMv7, ARM64</MtouchArch>
       <MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>
       <MtouchTlsProvider>Default</MtouchTlsProvider>
       <BuildIpa>true</BuildIpa>
       <IpaPackageDir>$(OutputPath)</IpaPackageDir>
    </PropertyGroup>
    

另一种用于 msbuild 命令行生成的方法是添加 /p: 命令行参数来设置 IpaPackageDir 属性。 请注意,在这种情况下,msbuild 不会展开传入到命令行的 $() 表达式,因此不能使用 $(OutputPath) 语法。 必须改为提供完整路径名称。

msbuild /p:Configuration="Release" /p:Platform="iPhone" /p:ServerAddress="192.168.1.3" /p:ServerUser="macuser" /p:IpaPackageDir="%USERPROFILE%\Builds" /t:Build SingleViewIphone1.sln

或 Mac 上以下示例:

msbuild /p:Configuration="Release" /p:Platform="iPhone" /p:IpaPackageDir="$HOME/Builds" /t:Build SingleViewIphone1.sln

创建分发生成并将其存档后,现可将应用程序提交到 iTunes Connect。

总结

本文介绍了如何配置、生成并提交 iOS 应用以发布在 App Store 上。