ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

iOS应用上架全流程指南:从开发者账号到App Store审核

iOS应用上架全流程指南:从开发者账号到App Store审核 记第一个iOS应用成功上线及流程和心得从写完最后一个git commit到App Store显示“可供销售”我整整花了两个星期。这期间踩过的坑、推翻重来的配置、反复琢磨的审核条款比写代码本身更让我长记性。如果你正准备上架自己的第一个iOS应用这篇东西能把你在开发者账号、证书配置、审核材料这些环节上可能要撞的墙提前拆掉一部分。我默认你已经有一个能跑通的功能完整的App工程能真机调试、能Archive只是还没走完上架这条路。下面我按自己实际操作的顺序来写尽量把那些苹果文档没说透、论坛里翻半天才找到答案的细节都交代清楚。1. 开发者账号注册第一个卡住你的往往不是代码1.1 个人账号与公司账号的取舍账号类型这步看似简单但选错了后面很折腾。个人账号Individual每年99美元公司账号Company同样99美元但需要邓白氏编码D-U-N-S Number来验证企业实体。我当时想的是先上架练手就选了个人账号。这里有个容易忽略的点个人账号上架的Appseller name显示的是你的个人姓名如果你希望显示成公司名、或者以后有多人协作管理团队就得走公司账号。个人账号也可以在App Store Connect后台邀请团队成员加入但是没法像公司账号那样以组织名义对外展示。申请流程本身不复杂用Apple ID在developer.apple.com上注册填写基本信息同意开发者协议然后进入付费页面。付款成功后账号并不会立刻生效通常要等几分钟到几小时苹果的邮件通知里会告诉你“Your enrollment is being processed”。有个坑是如果你的Apple ID之前在某些第三方平台被标记过风控可能触发人工审核需要上传身份证信息甚至接听验证电话这个周期可能拖到两三个工作日。1.2 双重认证与团队角色的附加项现在开发者账号强制要求开启双重认证这一步别嫌烦后面所有涉及证书、钥匙串、上传的操作都要依赖它。建议你在注册时就顺手把“受信任电话号码”填成自己常用的号码并且把恢复密钥Recovery Key打印出来收好——我身边真有人因为换了手机号、又没留恢复密钥差点把自己锁在开发者账号外面那才是真的叫天天不应。账号生效后进入App Store Connect第一件事是确认自己的角色是“Account Holder”还是“Admin”。Account Holder拥有最高权限很多关键操作比如同意最新的付费协议、修改税务信息只有这个角色能做。如果你是个人开发者那自然是Account Holder但如果你是在团队里帮别人上架一定要提前确认清楚谁有权限签署协议否则后续创建App记录会卡住。2. 证书、描述文件与Bundle ID第一次最容易在这里绕晕2.1 理解证书体系再动手iOS上架需要的东西放在一起很容易让人懵证书Certificate、标识符Identifier、描述文件Provisioning Profile三者相互关联。用个比较土的理解方式证书是你的开发者身份证标识符是你的App身份证描述文件是把这两者以及允许运行的设备绑在一起的授权凭证。开发阶段用的Development证书和发布阶段用的Distribution证书是两套东西不要混用。我在一开始犯过一个低级错误直接用Development证书去Archive然后试图上传到App Store结果Xcode Organizer里上传按钮一直是灰色的。实际上Xcode在打包上传时会根据你选择的Export方法自动匹配对应的证书但前提是钥匙串里同时存在有效的发布证书并且描述文件类型匹配。创建证书有两种途径我推荐用Xcode自动管理Automatically manage signing它会帮你把Certificates、Identifiers、Profiles都建好省去在开发者后台手动配置的麻烦。但如果你想手动创建路径是打开“钥匙串访问”→ 证书助理 → 从证书颁发机构请求证书选择“存储到磁盘”生成.certSigningRequest文件到开发者后台Certificates页面上传这个CSR文件下载生成的.cer证书双击安装到钥匙串2.2 Bundle ID的反向域名规则与通配符陷阱Bundle ID你在创建App记录时就要填它必须和Xcode工程里的Bundle Identifier完全一致否则后面全部白搭。iOS上Bundle ID的命名要求是反向域名形式比如com.yourname.yourapp。有两类情况容易出错使用通配符Bundle IDcom.yourname.*这种可以用于开发和调试多个App但是上架时每个App必须使用唯一的、不含通配符的Bundle ID。你可以在开发者后台为同一个App分别创建带通配符的开发描述文件和不带通配符的发布描述文件但一次上架只对应一个确定的ID。Bundle ID大小写问题实际上App Store的Bundle ID是区分大小写的虽然苹果建议全部小写但如果你已经用了大写字母后续保持一致即可。这个问题在开发者后台不太容易发现但当你用API做内购、推送、CloudKit配置时大小写不一致会导致莫名其妙的功能失效。我当时在图省事开发期一直用通配符描述文件跑真机等到上传时才想起要建独立的App ID结果Xcode自动签名时它帮我建了一个但和我在App Store Connect里创建的App记录用的Bundle ID差了一个下划线硬是让我排查了一个下午。这种细节问题越早统一越好。2.3 描述文件的有效期与“推送”功能的强制要求如果只是普通App描述文件有效期为一年到期后Xcode会自动续期。但如果你集成了推送通知Push Notification情况就不一样了推送证书APNs Auth Key 或 Push Notification Certificate是独立的它不依赖于App ID描述文件但有推送权限的App ID在创建描述文件时会强制校验推送证书是否有效。我在这块吃过一个亏本地推送调试一直正常但一打生产包就收不到推送检查半天发现APNs Key由于我的失误被我在开发者后台删除了。要记住APNs Auth Key就是那个.p8文件可以同时用于开发和生产的推送且不限制数量每家服务商只认这个Key文件把它存在服务端时要做好访问控制泄露了别人就能冒充你的App发推送。3. 打包上传Archive、Export、Validate的每一步都有讲究3.1 Archive前的工程设置检查清单在Xcode里执行Product → Archive之前有几个配置项一定要过一遍Version和Build Number。Version比如1.0.0是展示给用户的版本号Build比如1是内部构建号。提交到App Store Connect后你每上传一次或者用TestFlight分发一版Build号必须递增否则会被当作重复版本拒绝。很多新手在这边反复被“The provided entity is incomplete”的错误困扰其实就是Build号没变或者Info.plist里CFBundleVersion缺失。Deployment Target。这个决定了App支持的最低iOS版本。每降低一个大版本兼容性测试成本就多一截首次上架我建议保守一点只支持当前主流版本附近比如iOS 15以上把精力放在功能打磨上而不是纠结老机型兼容性。发布证书。Archive时Xcode会要求选择签名身份确保钥匙串里存在对应的Distribution证书。如果Keychain里多张证书混乱可以在钥匙串里把过期证书全部删掉只保留当前有效的。导出方法。Archive成功后在Organizer窗口里选择“Distribute App”→“App Store Connect”-“Upload”。这里会弹出一堆选项“Strip Swift symbols”和“Rebuild from bitcode”这些保持默认即可“Upload Symbols”建议勾选这样以后crash日志能还原出符号化的崩溃堆栈。3.2 三个最让人抓狂的上传报错上传过程最常见的报错有三个我把解决办法列一下App Store Connect Operation Error这类错误通常是网络问题或者Apple服务临时抖动换个网络重试一般能解决。如果持续报“An error occurred uploading to the App Store”可以尝试用xcrun altool --upload-app -f xxx.ipa -t ios --apiKey --apiIssuer命令行方式上传绕开Xcode自带上传器的网络兼容性问题。ITMS-90161 / Invalid Provisioning Profile描述文件和Bundle ID不匹配或者证书失效。到开发者后台检查使用的描述文件是否过期重新生成并下载安装。ITMS-90809: Deprecated API Usage苹果在审核阶段会扫描API调用如果你用了UIWebView相关的API会被直接拒绝。现在统一要用WKWebView。如果你的项目有历史遗留代码用了UIWebView关键词全局搜索替换掉相关第三方SDK也要检查版本。3.3 TestFlight内测上架前最值得花时间的一步上传成功后不要急着点“提交审核”。先去TestFlight把构建版本设置为“外部测试”邀请几个真实用户装来试试。我这里强烈建议流程是先用TestFlight出的“外部测试”链接发给朋友发10份左右让他们跑两天重点看崩溃和卡顿。TestFlight本身的配额限制是外部测试员每版本最多10000人够用了。TestFlight有一个和线上一致的运行时环境所以很多“只在线上崩溃、本地跑得好好的”问题能在这一步暴露出来。比如我遇到过一个很低级的错误本地调试时因为开启了NSAllowsArbitraryLoads所以所有HTTP请求都正常但TestFlight包默认ATS限制更严格部分第三方图片请求直接灰屏。这种问题如果直接提交审核基本上妥妥被拒。4. 提交审核前的十八般准备隐私、截图、描述、协议4.1 隐私政策不是可选项苹果在2020年之后对隐私合规抓得越来越严所有要求用户登录、收集任何个人信息包括崩溃日志、设备信息的App都必须提供隐私政策URL。这不仅仅是个“线上文档”而是需要在App Store Connect后台“App隐私”部分如实填写收集的数据类型、用途、是否关联用户身份。我给自己的建议是用GitHub Pages免费托管一份隐私政策页内容包含收集哪些信息、如何使用、用户如何注销数据和删除账号。如果App涉及账号注册苹果还会检查是否有“删除账号”的功能这是2022年之后的新规定没有的话会被拒Guideline 5.1.1(v)。别问我怎么知道的问就是我在这个条款上被拒过一次。4.2 截图和预览视频的尺寸规范App Store的审核需要2-3张不同尺寸的截图6.7英寸iPhone 15 Pro Max等、6.5英寸、5.5英寸iPad如果有适配还要单独提供。截图必须是真实运行画面的截图不能用设计稿冒充。如果用了模拟器截图注意把模拟器边框去掉不要包含状态栏模拟器的外框。我一开始不懂直接把设计图切成几个尺寸传上去结果审核员给的理由是“screenshots do not reflect the app in use”被拒一次。正确做法是在模拟器里跑起来按CmdS保存截图然后到App Store Connect上传对应尺寸。如果有视频预览可以做一个30秒以内的录屏优先展示第一眼就能看懂的核心功能苹果在很多审核页面会直接播放预览这是建立第一印象的机会。4.3 审核备注App Review Information要诚实、要详细如果你使用了登录、或者有需要审核员测试才能进入的功能务必在“App Review Information”的备注里写清楚测试账号和密码、功能入口的位置、有没有需要特殊环境才能触发的逻辑。有人担心写了测试账号会被苹果拿去乱搞其实没必要审核员只会在审核环境里用你的备注做功能验证。反而你没写、又设置了登录墙很可能会收到“We couldn‘t fully review your app because it requires a login”的拒信。4.4 付费协议和银行信息提前填在提交审核之前App Store Connect的“协议、税务和银行业务”页面里付费App协议Paid Applications Agreement要处于生效状态。即使你的App是免费下载的也要签署免费App协议。税务信息、银行信息都要填完整否则就算审核过了App状态也会被卡在“Pending Contract”没有办法上线销售免费App也一样。这块的周期比大多数人想的长银行验证可能需要几个工作日千万别在审核通过之后才想起去填那时候只能干着急。5. 审核被拒的常见原因与我的两次被拒“实战”5.1 第一次被拒4.3 Spam我提交的第一个版本因为没有充分展示独特功能被4.3“Spam”拒了。这个条款常见的触发场景是你的App和市场上某个已有产品功能高度重合、界面雷同或者是纯模板生成的工具类App。被拒后的处理方式不是硬磨而是要么在功能和界面上做出足够差异化要么在审核备注里说明你的竞品分析表指出你比现有产品多了哪些独特价值。我的做法是重新设计了几个核心界面的交互方式增加了一个现有产品没有的数据统计维度和自定义工作流然后在备注里专门写了一页“Why this app is not spam”列了功能对比和开发背景第二次提交就通过了。提示被拒后直接在Resolution Center回复审核员说明情况不要重新上传构建版本除非你真的改了代码。每次“重新上传”都会重置审核队列等待时间重新算。5.2 第二次被拒2.1 App Completeness这个条款通常是说你的App有bug、崩溃或功能不完整。我那次是因为在弱网环境下有个数据加载失败后界面一直转菊花审核员在审核过程中抓到了。这个问题的整改思路不是只改UI而是要做全面的异常兜底网络请求超时要有重试机制、加载失败要有友好提示、空白页要有占位图。被拒之后我系统性地过了一遍所有网络请求的边界情况并把弱网模拟挂上逐个页面验证改了一周才算踏实。这个经验对我来说值回票价一个在稳定网络下测不出来的问题在审核员手上可能几秒钟就暴露。5.3 审核等待时间的“玄学”与心态管理审核等待时间从几小时到几天不等。我发现一个规律工作日提交比周五晚提交通过率高、速度也快。周五提交容易排队到下周还可能出现“Pending Review”状态卡三四天的情况。最好的提交窗口是周二到周四的上午美东时间那边是白天审核员在岗时分。等待期间不要反复点击“Request call from App Review team”除非你的App真的非常紧急且在线上已经造成事故。频繁催促进入审核队列并不会加快速度反而让人觉得你有风险。6. 上线之后发布按钮按下不等于结束6.1 “可供销售”之后要立刻做三件事当App状态变成“Ready for Sale”你可能会松一口气但真实情况是这才刚开始。第一件事去App Store Connect后台“App Store”页面的“价格与销售范围”里确认你的App在所有国家和地区的上架状态。默认是所有地区都上架如果你只想上中国区一定要把其他地区取消勾选。反过来如果你希望全球上架记得检查每个地区的“出口合规”信息没填的话部分国家不会展示你的App。第二件事快速自己下载一遍线上版本确认版本号、启动画面、首页展示都没有问题。线上版本要过一会才在App Store前台搜索到搜不到不要慌等几分钟或直接用App Store Connect里“查看”生成的链接跳转。第三件事打开Xcode Organizer的“Crashes”和“Metrics”面板观察第一波真实用户的崩溃率、启动耗时、卡顿率。如果崩溃率最开始就异常优先处理crash日志里出现频率最高的线程栈。很多崩溃是你测试时不会被触发的真实场景比如低电量模式、弱网、极端的内存压力。6.2 版本更新与用户评论的维护在上线后的一两周内用户评论特别重要。前10个评分会直接影响App的初始排名和转化率。这时候你应该准备一条固定的“用户反馈收集通道”在App内部放一个“意见反馈”入口让用户有问题先走这里而不是直接去App Store打一星。每两周到一个月的更新节奏比较合适既能持续修复问题和增加功能也不会让用户觉得更新太频繁打扰。每次提审时把“What‘s New in This Version”写清楚直接列出用户能感知的变化别用“修复了一些bug并优化体验”这种空话苹果审核员和用户都不买账。6.3 我最后悔没早点做的事上线前做一份线下体验清单如果把整段流程从头过一遍最后悔的是没有在产品开发早期就做一份“清单”Bundle ID映射表、证书到期时间、隐私收集清单、测试账号表、审核备注模板。这些琐碎的信息在第一次上架时散落在各个角落每次都要东翻西找。等我第二次准备提审时按照清单走一遍流程整个人从容了许多。这份清单现在已经成了我后续所有App的标配。你可以用最简单的Markdown文件维护放在工程根目录的docs文件夹里每次提审前照着过一遍减少遗漏比提高速度重要太多。最后再分享一个我自己总结的小技巧在你点上架按钮之前把手机断网、打开低电量模式、把系统语言切成英文然后完整走一遍核心流程。这三个动作能替你拦住审核阶段不少低级bug而且成本几乎为零。第一个App上线就像第一次学游泳在水里呛几口很正常关键是每次呛水后能总结出属于自己的节奏。希望这篇记录能让你少呛几口水。
返回列表