这篇按真实顺序走一遍 iOS App 上架的全流程,从注册 Apple 开发者账号开始,到 App 出现在 App Store 为止,全程在 Windows 上完成。适合 App 已经能在真机上跑、准备第一次上架的开发者。账号审核和 App 审核各要等一到几天,其余步骤一个下午能做完。更多教程可以查看官网:https://www.kxbuild.net/zh
整个流程分六段。
上架必须加入 Apple Developer Program,年费 99 美元,中国大陆是 688 元人民币,按年续费,过期后 App 会从商店下架。注册前先给 Apple ID 打开双重认证。
账号分个人和公司两种,注册后不能直接互转,按 App 在商店里署谁的名来选。
| 账号类型 | 需要准备 | App Store 上显示的开发者 |
|---|---|---|
| 个人 | 本人身份证件、Apple ID | 你的真实姓名 |
| 公司 / 组织 | 邓白氏编码(D-U-N-S)、公司官网、能代表公司签署协议的人 | 公司名称 |
最顺的注册方式是在 iPhone 上安装 Apple Developer App,登录后点「立即注册」,按提示拍证件、付款。公司账号要先在 Apple 的页面免费申请邓白氏编码,通常要等一到两周。付款后 Apple 审核账号,一般一两天,个别需要补材料。
登录 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。
登录 appstoreconnect.apple.com,进入「App」,点左上角「+」选「新建 App」,填写下面几项。
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 证书数量有限,团队共用一张即可,不要每人各建一张。
App Store Connect 用两个号区分构建。版本号(Marketing Version)是商店里显示的 1.0、1.1,构建号(Current Project Version)每次上传都要比上一次大,同一个版本号被拒后重传也要加构建号。在工程设置编辑器的 General 页修改这两项。
同一页顺便确认两处。只做 iPhone 版的,在 Deployment 里把设备家族改成只有 iPhone,否则审核时会在 iPad 上测试,还要多准备一套 iPad 截图。App 图标要齐全,在资源目录编辑器里给 AppIcon 放一张 1024×1024 的图,缺图标的包上传时就会被拒。
以下两种做法任选其一。
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 里改。更多构建选项见构建与配置。
Windows 上用 Appuploader 上传。打开后用开发者账号登录,在上传页选中
build\MyApp.ipa,等进度走完。手边有 Mac 的也可以用 Apple 的 Transporter,把 ipa 拖进去即可。上传前 App Store Connect 里的 App 记录要已经建好,Bundle ID 一致,详见发布与上架。
上传时 Apple 会自动检查签名、描述文件、图标和 Info.plist,不合格的包直接报错并说明原因,常见的有构建号重复、描述文件类型不对、缺少某个尺寸的图标。按提示改完重新构建上传即可。
上传成功后 Apple 还要处理几分钟到几十分钟,处理完会发邮件,构建出现在 App Store Connect 的 TestFlight 页。
提交审核前先用 TestFlight 在真机上装一遍正式包,Release 包和调试时的 Debug 包行为不完全一样,这一步能提前发现只在 Release 下出现的问题。
构建处理完成后,TestFlight 页会提示「缺少出口合规证明」。App 只用了 HTTPS 和系统自带加密的,按问卷选不使用非豁免加密即可。不想每次上传都答一遍,工程有 Info.plist 文件的,用 plist 编辑器]加一个 Boolean 类型的
ITSAppUsesNonExemptEncryption,值设为 NO。
测试员分两种。
测试员在 iPhone 上安装 TestFlight App,接受邀请后直接安装。每个构建可以测试 90 天。测试中遇到崩溃,把手机接到电脑上用 kxdevice 导出崩溃报告,报告里有出错的函数和调用栈。
1kxdevice crash pull .\crashes MyApp*
回到 App Store Connect 的「App Store」页,左侧各栏都要填完才能提交。
填写副标题(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 手机。
所有 App 都要填隐私政策网址,网页里写明收集哪些数据、做什么用、怎么联系你。然后在「App 隐私」页回答数据收集问卷,逐项说明是否收集联系方式、位置、标识符、使用数据等,用到的第三方 SDK 收集的数据也要算进去。问卷的结果会显示在商店的「App 隐私」标签里,要和 App 的实际行为一致。
代码里用到 UserDefaults(包括
@AppStorage)、文件时间戳、磁盘剩余空间这类 API 的,Apple 要求在 App 的隐私清单
PrivacyInfo.xcprivacy 里写明使用原因,缺了上传后会收到 ITMS-91053 邮件,严重时构建不能提交。用到的第三方 SDK 也要自带隐私清单。.xcprivacy 用 plist 编辑器双击就能编辑。
在「App Store」页的版本信息里,「构建版本」一栏点「+」选刚才上传的构建。再填写「App 审核信息」。
最后选择版本发布方式,审核通过后自动发布、手动发布或定时发布,第一次上架建议选手动,确认无误再点发布。点右上角「添加以供审核」,再点「提交以供审核」。
状态会依次变成「正在等待审核」「正在审核」,结果通过邮件通知。多数 App 在一两天内出结果。
被拒后在 App Store Connect 的审核消息里能看到被拒的条款编号和说明,有时附截图或崩溃日志。改完加构建号重新上传,在同一个版本里换上新构建再提交。只是元数据的问题不用重传包,改完直接回复审核消息并重新提交。对结论有异议的可以先在消息里回复解释,仍不接受的再向 App 审核委员会申诉。
审核员在最新版 iOS 的真机上测试,启动就崩溃、按钮点了没反应、页面里留着占位内容都会被拒。审核消息附带的崩溃日志里能看到出错位置。提交前在最新版 iOS 的手机上用 Release 包完整走一遍主要流程,TestFlight 就是做这件事的。
没有提供测试账号、账号密码错误、账号过期、登录依赖只有国内手机号才能收的验证码,都会被要求补充信息。提供一个长期有效的账号,在备注里写清登录方式。只提供第三方登录(微信、QQ、Google 等)的 App,按 4.8 条还要再提供一种注重隐私的登录方式,Sign in with Apple 符合要求。
功能太少、只是把网站套进一个 WebView、内容和网页版完全一样的 App,常被 4.2 拒绝。审核要看到 App 本身的价值,常见的改法是加上原生能力,例如离线可用、推送通知、系统分享、小组件,或者把核心功能做成原生界面。
常见的几种情况。隐私政策链接打不开或内容不全。申请相机、相册、定位等权限的说明文字太笼统,要写清具体用途,例如「用于扫描快递单号」,这些说明在 Info.plist 的
NS…UsageDescription 键里。不需要账号的功能也强制注册登录。App 支持注册账号,却不能在 App 内删除账号。
截图不是 App 的真实界面,描述写了 App 里没有的功能,关键词里堆了竞品名称,App 里或截图里出现「Android」「测试版」这类字样,都会按 2.3 被拒。这类问题不用重新上传构建,改完元数据直接重新提交。
App 审核依据的是 App Store 审核指南,看的是 App 的功能、稳定性、隐私处理和商店信息,不会因为打包用的是哪台电脑、哪个工具而区别对待。通过上传检查的构建和其他构建走同样的审核流程,KXBuild 打出的 ipa 结构和 Xcode 导出的一致。
能不能通过审核,最终由 Apple 按指南判断,任何工具都无法保证。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047439/viewspace-3186499/ ,如需转载,请注明出处,否则将追究法律责任。