
1. 上架前的第一批准备工作开发者账号、App ID与证书体系很多人第一次接触“iOS打包上架”第一反应是打开Xcode点几下结果卡在证书配置上死活过不去。这个阶段的核心阻塞点不是代码而是苹果的签名机制。你写好的App想要装进App Store必须先回答三个问题你是谁、这个App是哪个、你有没有权限发布它。这三件事分别对应开发者账号、App ID和签名证书。开发者账号分个人Individual和公司Organization两种价格都是688元/年但公司账号需要提供邓白氏编码D-U-N-S审核周期通常多出5到15个工作日。如果你只是个人开发者直接注册个人账号即可如果企业主体需要多人协作或者要上架公司名义的应用公司账号会是更好的选择。注册都在developer.apple.com完成注册流程本身不复杂真正容易卡住的是后续的证书生成和权限理解。App ID是每个应用在苹果生态里的唯一身份证格式类似com.example.socialapp。这个ID决定了你的App能使用哪些能力比如推送Push Notifications、iCloud、Sign in with Apple等。创建App ID的入口在Certificates, Identifiers Profiles页面选择Identifiers - App IDs - Register。唯一要注意的是Bundle ID必须和Xcode项目里的Bundle Identifier完全一致只有字母、数字、连字符和点号不能有下划线。证书体系值得花几分钟彻底搞懂因为它贯穿整个上架流程。苹果用双证书机制开发证书Development用于开发调试发布证书Distribution用于打包上架。后者才是我们今天的主角。签发证书时你要在Mac的钥匙串访问Keychain Access里生成一个CSR证书签名请求流程是Keychain Access - Certificate Assistant - Request a Certificate From a Certificate Authority输入你的邮箱和名字选择Saved to disk保存然后在苹果后台选择上传这个CSR文件苹果签好一个.cer文件回给你。双击安装到钥匙串即可。这里有个实操细节钥匙串里的私钥对应的个人证书千万不要丢。发布证书的私钥一旦丢失你没法在另一台Mac上签名打包。很多团队会用Export把证书和私钥导出成.p12文件放到一个安全的位置或者提供给CI打包机。导出时记得设密码不然导出包里含有私钥却无保护传输过程有泄露风险。描述文件Provisioning Profile是最后一个环节。它把App ID、开发者证书和如果是开发描述文件测试设备三样东西绑定在一起。发布描述文件Distribution - App Store不需要指定设备这也是为什么上架包能面向所有iPhone和iPad。在后台生成描述文件后Xcode通常能自动管理下载和安装所以很多新人在这个环节感觉“什么都没做”其实是Xcode替你做了。说句题外话如果你在知乎或者技术社区看到“教你在不注册开发者账号的情况下把App装到手机”的教程那种做法叫证书信任安装它和上架App Store完全是两条路。正式上架一定要走正规的开发者账号别走旁门左道被苹果查出来封号是小事影响用户信任才是大事。2. 在Xcode里把工程配置到“可打包”状态进入Xcode工程后第一件事是检查TARGETS里的General页签。Identity区域有两个字段最容易混淆Display Name是用户桌面上看到的名字Bundle Identifier是上篇提到的唯一ID。很多新手把Display Name改成了中文名却发现桌面图标名字没变多半是改了项目文件夹而不是Display Name。正确答案是改General里Identity的Display Name。然后是版本号体系。Xcode里有两个数字Version和Build。Version是面向用户的版本号例如1.0.0Build是面向仓库和审核的后台构建号例如1001。每次上传新构建Build必须自增——哪怕你只是改了一个bug重新打包Build不变的话App Store Connect会拒绝上传提示你“红version已经存在上一个build请增加build number”。实践中我会把Build前两位与版本号后两位挂钩比如1.2.3对应Build 10203这样一看就知道这个包属于哪个版本。签名设置是整个打包流程的“鬼门关”。进入TARGETS - Signing Capabilities页签勾选Automatically manage signing然后选好你的Team登录开发者账号后这里会自动出现你的团队名。Xcode会自动创建和更新描述文件前提是你的Bundle ID在后台存在、且开发者账号下证书有效。如果勾选了自动管理仍然报“No profiles found”绝大多数情况是后台的App ID还没创建或者你的账号没有App Store Connect权限。先把App ID建好再回到Xcode刷新问题立刻消失。这个阶段还有一批必须确认的隐藏配置Deployment Target最低支持的iOS版本。定得过低代码里用了新系统API会报编译警告甚至崩溃定得过高用户流失。我个人建议用你核心用户群里占比最高的大版本作为基准。支持的设备方向默认全部勾选但如果你只做iPhone竖屏App其它方向勾掉可以省内存和适配工作量。Info.plist的权限说明你的App如果需要相机、相册、定位、麦克风权限必须在Info.plist里加对应的Usage Description字符串。苹果对权限描述审核很严之前见过不少开发者随便填“需要权限才能使用”被审核退回重新提交。签名选择上很多人纠结“自动管理”到底靠不靠谱。我的看法个人开发者或者小团队直接使用自动签名省心不会漏掉描述文件的更新。如果你的项目有多个开发者或者要接入持续集成CI可以用手动签名把描述文件下载到本地、在Xcode里指定这样构建机不依赖你的开发者账号登录状态。但手动签名的前提是把证书和私钥同步到那台机器否则一样报找不到证书。这里分享一个我踩过的坑曾经做过一个项目Xcode自动签名后生成的描述文件是Development类型打包出来的IPA装不上真机查了好久才发现是Target和Project的Signing设置不一致。Xcode工程里有两处签名配置一是Project的Build Settings二是Target的Build Settings。Target的配置会覆盖Project的配置。所以一定要在Target层级统一签名方式否则Gradle、CocoaPods这些工具链一介入证书匹配就会出诡异问题。最后还有一件事很多人会忽略归档Archive之前把Scheme里的Run配置改成Release。具体路径是Product - Scheme - Edit Scheme - Run - Build Configuration选Release。不改成Release的话你特制的Debug模式会被打进归档包会出现调试信息暴露、性能下降、甚至某些Debug-only的功能在审核阶段崩溃。Release模式关闭了大部分调试优化压缩体积也会去掉日志符号这是上架包的基本素养。3. Archive归档与导出IPA从Xcode到App Store Connect的真实咬合过程配置好上面的所有环节后就能开始打包。直接在Xcode里连上真机Run那只是开发调试真正上架用的包必须走“Archive”归档流程。选择菜单栏的Product - ArchiveXcode会先编译整个工程然后把Release版的可执行文件、资源、Info.plist、签名等所有东西封装成一个.xcarchive文件并自动打开Organizer窗口。如果你在Product菜单里找不到Archive多半是刚才选的Scheme没有选Generic iOS Device或者当前连接的是模拟器。Archive要求选择“Any iOS Devicearm64”也就是真机架构而不能是模拟器架构。归档完成后Organizer窗口会列出你所有的Archive包。选定目标包点击右侧的Distribute App按钮会弹出一个分发方式选择框。上架到App Store的路径是App Store Connect这一步会重新签名并生成最终上传的IPA。分发的选项里还有Ad Hoc测试设备上安装、Development开发调试和Enterprise企业分发需要企业账号新手不用管直接选第一项。选完分发方式Xcode会让你确认“Upload to App Store Connect”还是“Export for manual distribution”。如果是走Transporter或者第三方上传工具可以选导出到本地再手动传如果是Xcode直接传选Upload。我个人的习惯是先Export本地再用Transporter上传原因是这一步能抓住很多证书问题——比如导出时如果签名不匹配Xcode会把具体原因直接亮出来修复后重新导出不用占用App Store Connect的网络会话。导出的IPA包含三部分核心内容编译后的Mach-O可执行文件、资源文件图片、字体、Storyboard和签名数据。签名数据里有一个_CodeSignature目录和embedded.mobileprovision描述文件苹果服务器在你上传后会先校验这套签名是否有效、是否对上App ID和证书。所以如果你看到类似ITMS-90096之类的错误码不用慌多数是指向证书过期或者描述文件与App ID不匹配回Xcode重新生成即可。上传标准IPA有两道门。第一道门是上传工具。Xcode 13之后苹果主推Transporter你在App Store Connect后台下载Transporter应用拖拽IPA进去就能传。老的Xcode自带Upload功能也没有被废除但用Transporter更直观而且上传进度、错误提示更详细。第二道门是后台验证。App Store Connect收到上传构建后会进行基础校验版本号是否重复、可用Bund版本是否覆盖设备、图标是否1024x1024、是否包含不允许的符号。这期间构建状态会经历Processing、Uploading、Waiting for Review几个阶段Processing阶段通常需要5到15分钟如果超过30分钟还没动静大概率是后台出问题可以尝试删掉重新传。上传之后的瞬间你会在App Store Connect的TestFlight页签看到这个构建。TestFlight是苹果的公开测试分发工具内部测试不需要审核外部测试需要简单审核。如果你不想直接发布可以先把包丢给内部测试人员进行一轮真机验证确认没有崩溃再提交审核。这一步我强烈建议不要跳过。毕竟你在开发机和模拟器上测出来的结果和用户真机上跑出来的结果经常是两回事——我见过开发环境正常的App在iOS 15的老机型上启动闪退幸好TestFlight拦住了。这里还要提一个容易忽视的细节导出IPA的时候Xcode会让你选择是否包含bitcode包。现在苹果已经全面废弃bitcode新项目不要勾选。如果你的工程是从老版本Xcode迁移过来的检查一下Build Settings里的Enable Bitcode是否为NO否则导出时会遇到兼容性警告拖慢审核周期。4. App Store Connect后台配置从创建应用到填写审核资料IPA上传不是终点后台配置才决定你的App能不能出现在商店里。先在developer.apple.com进入App Store Connect选择My Apps点左上角加号创建新App。这里有公司名称、Primary Language、Bundle ID、SKU四个必填项。公司名称通常是你开发者账号对应的实体名Bundle ID只能选刚创建的那个App IDSKU是你自己的内部编号比如SOCIAL001这个不需要对用户公开填什么都行。创建完成进入应用详情页需要填写的字段一大排我按重要程度排序Privacy Policy URL隐私政策链接。苹果现在非常重视隐私合规如果你的App搜集任何用户数据比如崩溃日志、统计埋点、用户行为分析这个字段必须有。没有隐私政策URL的App在审核时大概率被拒。没有自己网站的话可以用平台服务商提供的模板页面也可以用App隐私标签做简单的本地版本但URL更稳妥。App Store的描述展示给用户的介绍文字控制在3000字符以内。苹果要求描述真实、具体、能反映功能。写得漂亮的确实加分但更重要的是别在描述里写“这个App含有xxx功能”却实际上没有——这属于虚假宣传审核直接退回。关键词最多100字符逗号分隔。这里是做基础关键词优化ASO的地方。可以放业务相关的词组比如“社交、交友、定位雷达”也可以把竞品的名字放进去不违法但有争议苹果会审核关键词是否误导我建议只放自己的核心词。支持URL必须提供用于用户遇到问题时跳转网页。没有真实网站的话可以填一个简单的落地页别用新浪微博或者临时博客苹果会抽查。App审核信息包括Demo账号如果你的App需要登录才能使用务必提供一组测试账号、联系方式和备注。备注栏是唯一可以和苹果审核团队“解释”的地方。我这里多写了一句如果你用了第三方登录、广告SDK、热更新模块在备注里提前说明能极大降低被拒概率。还有评分等级和版权。评分等级选择后你的App会被自动归类为适龄范围。版权选“我的公司拥有此App的全部版权”即可除非你是授权代理。截图方面至少需要6.5英寸iPhone X及之后的截图5.5英寸iPhone 8 Plus/SE 7 Plus也可以准备iPad如果要提交则要额外尺寸的图。截图必须是真实运行画面不能用设计稿、合成图。有个很常见的坑有些开发者把iPhone截图拉伸成iPad尺寸提交结果被苹果以“截图不匹配实际运行效果”为由拒绝。正确的做法是在模拟器或者真机上使用截图工具Command Shift 4直接截取当前分辨率下的运行画面并确保截图里的状态栏显示是正常的。接下来还有一个所有首次上架的人都会遇到的选项Export Compliance出口合规证明。如果你的App用到了标准加密库比如HTTPS、SSL选“Yes”如果你用了非标准的加密算法需要选“No”并上传合规证明。绝大多数App都走HTTPS直接选Yes就好。如果是金融、IM类应用还用到了自定义加密这个问题会变得比较复杂建议在这种场景下咨询法务或者上架顾问。一切信息填写完毕后点击页面右上角的“Add for Review”或者“Submit for Review”状态变为Waiting for Review。如果构建列表里没有出现你刚上传的包多半是上传时选择了“手动发布”你需要去活动页签Activity里把构建状态从“Missing Compliance”之类的提示中处理掉。这里再强调一次Activity页签里能看到你所有上传的构建如果这个构建是绿的“Ready for Submission”才能提交审核。5. 审核意见怎么读、怎么回我在被拒中总结的几条规律提交审核后大多数App会在24-48小时内拿到结果。苹果审核团队有几百人每天要看海量App所以被拒是常态一次通过反而少见。被拒不可怕可怕的是看不懂被拒理由、不知道怎么回。最常见的被拒原因集中在Guideline 2.1App Completeness信息不完整、2.3元数据误导、4.3垃圾应用、5.1.1数据收集和存储。遇到这些问题第一件事是完整阅读被拒的那个英文段落苹果会在被拒邮件里明确写出哪个Guideline、哪个功能点、以及截图或视频证据。比如“We noticed your app does not include a naked functionality”意味着你提交的只是演示版或壳工程苹果不允许占位壳。处理方法有两种一是直接修改App再上传新包二是通过Resolution Center回复解释。如果问题出在功能或内容上修改后重新提交即可无需和苹果争论如果问题出在元数据或审核信息填写的误解可以通过回复附上正确的截图或说明。回复时保持简洁、礼貌、具体不要说太多客套话苹果审核团队的节奏很快你回复得越清晰他们越容易重新处理。还有一类高频问题权限过度请求。比如你的App明明是普通记账工具却申请了通讯录权限审核团队会直接拒绝。解决办法是调整代码逻辑让权限请求在使用时才触发而不是App启动时一股脑弹出所有权限。苹果在这块的标准是“最小必要权限原则”你的权限用途越窄过审概率越高。这个原则放进代码设计里也完全正确——权限越多用户卸载率越高隐私投诉风险越大。另外很多开发者容易忽略“账户注销”功能。如果你的App有账号系统苹果在4.0签发的审核指南要求App内必须提供注销账号的入口而且注销要达到“现实满足”——不是设置里的一个小小的“联系客服注销”。如果你在提交审核前没做注销入口可以在App内做个简单的注销确认流程再加一个自动处理逻辑。这条规则在2024年9月后执行得特别严格遇到“缺少帐号注销功能”被拒的开发者真的不在少数。最后讲一下崩溃信息。如果苹果审核团队实测时发现你的App崩溃他们会在被拒邮件里附带崩溃日志。拿到日志后别慌用Xcode的“Window - Devices and Simulators → View Device Logs”功能导入崩溃日志或者用Symbolicatecrash工具自动化符号还原。重点看崩溃栈里有没有你代码的符号地址如果全部是无符号的第三方库框架基本可以锁定是某个SDK在特定系统版本上崩了换个版本或者换个SDK通常能解决。整个上架流程走完看着自己的App出现在商店里那一刻确实挺有成就感的。但我要提醒的是上架只是“开始”不是“结束”。后续每次发新版本依然要重新走一遍打包、上传、审核而且审核标准会随苹果政策动态调整。多关注WWDC发布的新政策多刷一刷苹果的开发者文档别等到被拒了才临时抱佛脚。我个人现在每次提交审核前都习惯先把自己代入苹果审核员的视角把App当成一个“陌生人”来体验一遍权限、描述、截图、登录流程、注销流程挨个走一遍确实能筛出不少低级问题。这套流程跑顺了你会发现上架这件事其实一点儿也不玄学。