跳到主要内容
教程目录

在 Windows 上上架 App Store,从打包 ipa 到提交审核的完整流程

这篇按真实顺序走一遍 iOS App 上架的全流程,从注册 Apple 开发者账号开始,到 App 出现在 App Store 为止,全程在 Windows 上完成。适合 App 已经能在真机上跑、准备第一次上架的开发者。账号审核和 App 审核各要等一到几天,其余步骤一个下午能做完。

整个流程分六段。

  1. 注册 Apple 开发者账号。
  2. 注册 Bundle ID,在 App Store Connect 创建 App。
  3. 准备发布证书和描述文件。
  4. 用 KXBuild 构建 Release,得到 ipa 并上传。
  5. 用 TestFlight 在真机上验证。
  6. 填写商店信息,提交审核。

注册 Apple 开发者账号

上架必须加入 Apple Developer Program,年费 99 美元,中国大陆是 688 元人民币,按年续费,过期后 App 会从商店下架。注册前先给 Apple ID 打开双重认证。

账号分个人和公司两种,注册后不能直接互转,按 App 在商店里署谁的名来选。

账号类型 需要准备 App Store 上显示的开发者
个人 本人身份证件、Apple ID 你的真实姓名
公司 / 组织 邓白氏编码(D-U-N-S)、公司官网、能代表公司签署协议的人 公司名称

最顺的注册方式是在 iPhone 上安装 Apple Developer App,登录后点「立即注册」,按提示拍证件、付款。公司账号要先在 Apple 的页面免费申请邓白氏编码,通常要等一到两周。付款后 Apple 审核账号,一般一两天,个别需要补材料。

注册 Bundle ID

登录 developer.apple.com,进入 Certificates, Identifiers & Profiles,在 Identifiers 页点「+」,选 App IDs,类型选 App,Bundle ID 选 Explicit 并填入工程里的 Bundle ID,例如 com.yourname.mytodo。App 用到推送、iCloud、Sign in with Apple 这类能力的,在同一页勾上对应的 Capabilities。

Bundle ID 必须和工程里的完全一致。不确定工程里写的是什么,打开工程设置编辑器的 General 页查看 Bundle Identifier。

在 App Store Connect 创建 App

登录 appstoreconnect.apple.com,进入「App」,点左上角「+」选「新建 App」,填写下面几项。

  • 平台,选 iOS。
  • 名称,商店里显示的名字,最多 30 个字符,全商店唯一,被占用时换一个。
  • 主要语言,没有对应语言的本地化信息时商店显示这个语言。
  • 套装 ID,下拉选上一步注册的 Bundle ID。
  • SKU,你自己用的内部编号,不对外显示,例如 mytodo001。

建好之后先不急着填商店信息,等构建上传成功再一起填。

准备发布证书和描述文件

上架需要两个文件,Apple Distribution 证书(.p12,含私钥)和 App Store 类型的描述文件(.mobileprovision)。App Store 描述文件不限制设备,不用登记 UDID。

Windows 上可以用 Appuploader 登录开发者账号直接生成证书和描述文件,也可以从 Mac 的钥匙串导出,或者用 OpenSSL 生成 CSR 后在开发者网站申请,三种做法见证书与签名,用 OpenSSL 申请的完整步骤见在 Windows 上申请 iOS 证书和描述文件。拿到后放进工程根目录的 keychain 文件夹,在 password.properties 里写一行「文件名=密码」。

1distribution.p12=123456

一个账号的 Distribution 证书数量有限,团队共用一张即可,不要每人各建一张。

打 Release ipa

改版本号

App Store Connect 用两个号区分构建。版本号(Marketing Version)是商店里显示的 1.0、1.1,构建号(Current Project Version)每次上传都要比上一次大,同一个版本号被拒后重传也要加构建号。在工程设置编辑器的 General 页修改这两项。

同一页顺便确认两处。只做 iPhone 版的,在 Deployment 里把设备家族改成只有 iPhone,否则审核时会在 iPad 上测试,还要多准备一套 iPad 截图。App 图标要齐全,在资源目录编辑器里给 AppIcon 放一张 1024×1024 的图,缺图标的包上传时就会被拒。

构建

以下两种做法任选其一。

  • VS Code 插件。在 KXBuild 视图的「构建配置」节点切到 Release(也可以在命令面板运行 KXBuild: 选择构建配置),再运行 KXBuild: 构建。
  • 命令行。按工程类型执行其中一条。

使用 .xcodeproj 的工程执行这一条。

1kxbuild build .\MyApp.xcodeproj -c Release

使用 .xcworkspace 的工程(例如用了 CocoaPods)执行这一条。

1kxbuild build .\MyApp.xcworkspace -c Release

完成后工程目录下生成 build\MyApp.ipa,结构和 Xcode 导出的一样。构建报找不到 Distribution 证书时,说明工程的 Release 配置还指着开发证书,命令行加 -D CODE_SIGN_IDENTITY="Apple Distribution" 临时覆盖,长期的做法是在工程设置编辑器的 Signing 里改。更多构建选项见构建与配置。

上传 ipa

Windows 上用 Appuploader 上传。打开后用开发者账号登录,在上传页选中 build\MyApp.ipa,等进度走完。手边有 Mac 的也可以用 Apple 的 Transporter,把 ipa 拖进去即可。上传前 App Store Connect 里的 App 记录要已经建好,Bundle ID 一致,详见发布与上架。

上传时 Apple 会自动检查签名、描述文件、图标和 Info.plist,不合格的包直接报错并说明原因,常见的有构建号重复、描述文件类型不对、缺少某个尺寸的图标。按提示改完重新构建上传即可。

上传成功后 Apple 还要处理几分钟到几十分钟,处理完会发邮件,构建出现在 App Store Connect 的 TestFlight 页。

用 TestFlight 测试

提交审核前先用 TestFlight 在真机上装一遍正式包,Release 包和调试时的 Debug 包行为不完全一样,这一步能提前发现只在 Release 下出现的问题。

构建处理完成后,TestFlight 页会提示「缺少出口合规证明」。App 只用了 HTTPS 和系统自带加密的,按问卷选不使用非豁免加密即可。不想每次上传都答一遍,工程有 Info.plist 文件的,用 plist 编辑器加一个 Boolean 类型的 ITSAppUsesNonExemptEncryption,值设为 NO。

测试员分两种。

  • 内部测试员,是 App Store Connect 团队里的成员,最多 100 人,构建处理完就能装,不用审核。
  • 外部测试员,任何人都可以,用邮箱邀请或生成公开链接,最多 10000 人。每个版本的第一个构建要先过一次 TestFlight 审核,通常一天以内。

测试员在 iPhone 上安装 TestFlight App,接受邀请后直接安装。每个构建可以测试 90 天。测试中遇到崩溃,把手机接到电脑上用 kxdevice 导出崩溃报告,报告里有出错的函数和调用栈。

1kxdevice crash pull .\crashes MyApp*

填写商店信息

回到 App Store Connect 的「App Store」页,左侧各栏都要填完才能提交。

App 信息

填写副标题(30 个字符以内)、主要类别,完成年龄分级问卷,内容版权按实际选择。App 要在中国大陆销售的,按要求填写 ICP 备案号,没有备案号的 App 不能在中国大陆上架。

截图

iPhone 截图至少要提供一组 6.9 英寸或 6.5 英寸的尺寸,其他尺寸 Apple 会按这组缩放。App 支持 iPad 的还要一组 13 英寸 iPad 截图。每组 1 到 10 张,竖屏横屏都可以。

显示屏 竖屏尺寸(像素)
iPhone 6.9 英寸 1320×2868、1290×2796、1260×2736
iPhone 6.5 英寸 1284×2778、1242×2688
iPad 13 英寸 2064×2752、2048×2732

没有模拟器也能截。手机接到电脑,App 停在要截的界面,执行下面的命令,图片就保存到当前目录。用 Pro Max 或 Plus 机型截出来的尺寸可以直接用,其他机型要在作图工具里扩成上表的尺寸。

1kxdevice screenshot -o shot1.png

截图要用 App 的真实界面,可以加标题文字和背景,但不能出现其他平台的名字和设备外观,例如 Android 手机。

描述、关键词和网址

  • 描述,最多 4000 个字符,写清 App 能做什么,写到的功能审核时都会去找。
  • 关键词,最多 100 个字符,用英文逗号分隔,不要写竞品名称和 App 名称里已有的词。
  • 技术支持网址,必须能打开,放一个联系方式页面即可。
  • 宣传文本,可选,随时能改,不用重新审核。

App 隐私

所有 App 都要填隐私政策网址,网页里写明收集哪些数据、做什么用、怎么联系你。然后在「App 隐私」页回答数据收集问卷,逐项说明是否收集联系方式、位置、标识符、使用数据等,用到的第三方 SDK 收集的数据也要算进去。问卷的结果会显示在商店的「App 隐私」标签里,要和 App 的实际行为一致。

代码里用到 UserDefaults(包括 @AppStorage)、文件时间戳、磁盘剩余空间这类 API 的,Apple 要求在 App 的隐私清单 PrivacyInfo.xcprivacy 里写明使用原因,缺了上传后会收到 ITMS-91053 邮件,严重时构建不能提交。用到的第三方 SDK 也要自带隐私清单。.xcprivacy 用 plist 编辑器双击就能编辑。

提交审核

在「App Store」页的版本信息里,「构建版本」一栏点「+」选刚才上传的构建。再填写「App 审核信息」。

  • 登录信息,App 需要登录才能用的,填一个审核专用的测试账号和密码,账号里预先放好数据。登录要短信验证码的,在备注里说明怎么绕过,或者给这个账号设固定验证码。
  • 联系信息,审核有问题时会联系这个人。
  • 备注,功能入口比较深、需要特定硬件或特定地区才能用的,在这里写清怎么测。

最后选择版本发布方式,审核通过后自动发布、手动发布或定时发布,第一次上架建议选手动,确认无误再点发布。点右上角「添加以供审核」,再点「提交以供审核」。

状态会依次变成「正在等待审核」「正在审核」,结果通过邮件通知。多数 App 在一两天内出结果。

常见被拒原因

被拒后在 App Store Connect 的审核消息里能看到被拒的条款编号和说明,有时附截图或崩溃日志。改完加构建号重新上传,在同一个版本里换上新构建再提交。只是元数据的问题不用重传包,改完直接回复审核消息并重新提交。对结论有异议的可以先在消息里回复解释,仍不接受的再向 App 审核委员会申诉。

2.1 App 完整性,崩溃和缺陷

审核员在最新版 iOS 的真机上测试,启动就崩溃、按钮点了没反应、页面里留着占位内容都会被拒。审核消息附带的崩溃日志里能看到出错位置。提交前在最新版 iOS 的手机上用 Release 包完整走一遍主要流程,TestFlight 就是做这件事的。

2.1 缺少信息,登录不进去

没有提供测试账号、账号密码错误、账号过期、登录依赖只有国内手机号才能收的验证码,都会被要求补充信息。提供一个长期有效的账号,在备注里写清登录方式。只提供第三方登录(微信、QQ、Google 等)的 App,按 4.8 条还要再提供一种注重隐私的登录方式,Sign in with Apple 符合要求。

4.2 最低功能要求

功能太少、只是把网站套进一个 WebView、内容和网页版完全一样的 App,常被 4.2 拒绝。审核要看到 App 本身的价值,常见的改法是加上原生能力,例如离线可用、推送通知、系统分享、小组件,或者把核心功能做成原生界面。

5.1.1 数据收集与存储

常见的几种情况。隐私政策链接打不开或内容不全。申请相机、相册、定位等权限的说明文字太笼统,要写清具体用途,例如「用于扫描快递单号」,这些说明在 Info.plist 的 NS…UsageDescription 键里。不需要账号的功能也强制注册登录。App 支持注册账号,却不能在 App 内删除账号。

2.3 元数据不准确

截图不是 App 的真实界面,描述写了 App 里没有的功能,关键词里堆了竞品名称,App 里或截图里出现「Android」「测试版」这类字样,都会按 2.3 被拒。这类问题不用重新上传构建,改完元数据直接重新提交。

不用 Xcode 打的包能过审吗

App 审核依据的是 App Store 审核指南,看的是 App 的功能、稳定性、隐私处理和商店信息,不会因为打包用的是哪台电脑、哪个工具而区别对待。通过上传检查的构建和其他构建走同样的审核流程,KXBuild 打出的 ipa 结构和 Xcode 导出的一致。

能不能通过审核,最终由 Apple 按指南判断,任何工具都无法保证。