尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Cocos Creator iOS 打包上架全流程:从构建到提审的避坑指南

Cocos Creator iOS 打包上架全流程:从构建到提审的避坑指南 做 Cocos Creator 游戏的老哥十个里有九个迟早要碰 iOS 打包上架这道坎。“Cocos Creator、iOS、App Store、打包、上架”这几个词串起来听着像一条标准流水线可真到动手那天你会发现最难的不是游戏逻辑而是证书、签名、隐私合规这些“引擎外”的东西。这篇文章我会把 Cocos Creator 从构建、Xcode 打包到 App Store 提审的完整链路拆开讲一遍适合第一次做 iOS 上架、卡在打包或提审环节的人也适合团队里非原生开发出身、却要独自扛起发版任务的朋友。看到最后你会明白这套流程不是玄学每一步都有明确目的踩过坑之后也能自己排查。1. 把苹果这套流程拆开看心里就有底了1.1 为什么是“Cocos Creator 构建 Xcode 打包”两步走很多人在 Cocos Creator 里找了一圈发现根本不能直接生成.ipa文件就开始怀疑是不是自己版本不对。其实 Cocos Creator 从来不会直接吐出安装包它的构建结果是一个完整的 iOS 原生工程也就是带.xcodeproj或.xcworkspace的文件夹。后面真正负责编译、签名、打包的是苹果自家的 Xcode。这个设计很像做饭Creator 负责把游戏资源和引擎运行时这些“食材”准备好码放整齐地递给你Xcode 才是在火上翻炒、调味、装盘的那口锅。你不碰 Xcode就永远做不出能上架的 ipa。搞清这个协作关系后续所有环节都不慌了。整个流程可以归纳成四段Creator 构建出 Xcode 工程Xcode 编译并导出 ipaTransporter 或 Xcode 把 ipa 传到 App Store Connect然后在 App Store Connect 里填元数据、提审、等结果。1.2 上架前需要提前准备的四样东西第一样是苹果开发者账号。个人账号每年 99 美元直接在 Apple Developer 官网注册就行。公司账号需要邓白氏编码这个编码申请有时要一两周如果你在帮公司上架一定要提前办别等游戏做好了才去补。第二样是证书和描述文件。用 Xcode 的自动签名其实能省掉大半手动操作但前提是你要在 Apple Developer 后台把你的设备、Bundle ID、App ID 这些登记清楚。后面我会详细讲怎么配签名。第三样是 App Store Connect 里的 App 记录。ipa 传上去之前你得有个“壳”在 App Store Connect 新建 App填好 Bundle ID、名称、语言这些基础信息有了这个记录上传的构建版本才能被认领。第四样是一台 iPhone 或 iPad用来开开发者模式、跑真机调试。模拟器虽然方便但很多权限功能、性能表现跟真机差距不小。建议 iOS 打包前至少做一轮真机验证否则提审后“启动崩溃”这种拒审理由能让你反复折腾一周。2. Cocos Creator 构建这一步把细节抠到极致2.1 构建发布面板里的关键参数逐个说在 Cocos Creator 里点菜单栏的“项目 - 构建发布”弹出构建面板后选择平台为 iOS。构建面板里至少有四个参数需要认真看不是随手填就完事。第一个是 Bundle ID也就是应用的唯一标识。Cocos 构建会把 Bundle ID 直接写进 Xcode 工程所以这个值必须和你在 Apple Developer 后台注册的 App ID 完全一致。常见问题是有的人先用了com.example.game后来又改了公司域名导致签名时“Bundle ID 不匹配”的报错一轮接一轮。第二个是“是否生成 .xcodeproj”还是“使用 CMake 生成”这个选项在不同 Creator 版本里略有区别。绝大多数情况用默认的 Xcode 工程即可CMake 模式更多是给需要深度集成第三方原生 SDK 的高级场景准备的普通游戏没必要主动切。第三个是“资源服务器地址”和“初始场景”这关系到远程资源加载。如果你的游戏要做热更新构建面板里需要填对 CDN 地址否则 App 一启动就去加载空的或旧的资源目录启动后内容缺失也是审核常见问题。第四个是“MD5 加密”和“压缩类型”。iOS 包对资源体积比较敏感建议开 MD5 做资源混淆和增量更新缓存同时纹理压缩尽量选择适合 iOS 的格式比如 ASTC后面我会在性能部分展开。填完这些参数点构建Creator 会先生成一份原生工程。构建速度取决于机器性能和项目大小一般三到十分钟不等。构建完成的目录通常在项目的build/ios/proj里面会有.xcodeproj、native/engine等子目录。2.2 图标、启动屏和权限描述这些“门面”别偷懒App Store 审核有一部分是真人审核他们会打开你的 App看界面能不能用、图标清不清楚、启动屏是否正常。所以这几样东西最好一次做对。图标方面构建面板会让你配置 1024x1024 的无透明通道图标。如果图标里带透明像素上传统一构建版本时可能报错或者审核时被判定为元数据不合格。Creator 会帮你生成各种尺寸的图标但你提供的源图质量决定了最终效果建议放大缩小各看一遍别出现边缘模糊。启动屏方面Cocos 引擎生成的 Xcode 工程默认有 LaunchScreen可以放一张图或使用 storyboard 实现。要注意 iOS 15 之后很多启动画面的兼容性要求变了如果你的启动屏出现黑边或拉伸建议在 Xcode 的 Assets 里核对一下 LaunchImage 是否完整至少覆盖 iPhone 和 iPad 的主流分辨率。权限描述是另一个高频坑。如果你的游戏会调用相机、相册、麦克风、定位等系统能力必须在 Info.plist 里写好用途描述。比如用NSCameraUsageDescription告诉用户“需要使用相机拍摄头像”。直接在 Creator 构建插件的配置里填好不要等用户第一次弹权限框时才发现描述是空的那样会被系统强制终止也会让审核人员认为你的隐私处理不完善。2.3 构建产物里到底生成了什么怎么判断是否成功构建成功后先别急着双击进 Xcode而是应该打开build/ios/proj看一下结构。正常情况下会看到.xcodeproj文件、native目录以及各类资源目录。可以搜索一下你的游戏主场景资源是否被拷贝进来确认构建输出的资源是完整版本。另一个判断构建成功的办法是去 Xcode 里跑一次模拟器。如果 Cocos 构建出的工程能直接在模拟器上启动并进入游戏场景说明“食材”已经备齐。模拟器启动没问题再换真机能少排查很多环境问题。我习惯把这一步作为构建是否成功的唯一标准因为只要 Xcode 工程本身是好的后面打包、上传的环节基本只剩下签名和账号配置问题。3. Xcode 打包实战从开发者模式到导出 ipa3.1 真机调试遇到“开发者模式”别慌Xcode 工程打开后用数据线连接 iPhone第一次跑真机大概率会遇到几个提示。iOS 12 之后的系统加入了“开发者模式”如果你在设置里找不到这个开关真机运行会直接报错。处理方式很直接iPhone 上“设置 - 隐私与安全性 - 开发者模式”把它打开然后重启手机。如果打开开发者模式后 Xcode 仍然提示未受信任的开发者还需要去“设置 - 通用 - 设备管理”里找到你的开发者证书手动信任一次。这两步是老手也经常遗漏的因为换一台新设备或者重装系统后信任状态会被重置。真机调试建议用 Development 证书Xcode 会自动帮你创建。如果网络环境不稳定导致证书创建失败Xcode 的报错通常会写“Failed to create provisioning profile”这时去 Apple Developer 后台确认 Bundle ID 是否注册、设备是否已经加入设备列表就行。注意这里说的网络环境不稳定只是普通网络连接问题检查 DNS、换网络、重启 Xcode 都能解决别在证书信任这种基础环节卡太久。3.2 签名配置里的“自动”和“手动”怎么选第一次打开 Cocos 生成的 Xcode 工程你需要进到 Target 的 Signing Capabilities 页签里设置签名。最简单的方式是勾选 Automatically manage signing然后选择你的开发者 Team。Xcode 会为你生成对应的证书和描述文件一般跑真机调试没有任何问题。自动签名适合个人开发者也适合 App Store 上架因为它能自动维护开发和生产两套描述文件。但如果你需要接推送、内购、Game Center 等功能需要在 Signing Capabilities 里手动添加对应的 Capability系统会自动更新 App ID 权限。手动签名适合团队里证书统一管理的场景。有人会在 Apple Developer 后台预先创建 Distribution 证书然后在 Xcode 里关闭自动签名手动指定 Provisioning Profile。对新手我不推荐手动因为一旦描述文件过期或者没有包含某台设备报错信息会非常抽象。个人上架游戏用自动签名就够了先把流程跑通再说。真正要留意的是签名不只影响你能不能跑真机还决定你是否能导出到 App Store Connect。所以你要记住架构区分开发证书用于 debug 运行分发证书用于 Archive 导出二者不要混用。3.3 Archive 归档并导出 ipa 的正确姿势Xcode 里打包上线时第一步不是点 Run而是选择目标设备为“Any iOS Device (arm64)”或者“Generic iOS Device”。这个模式不连接手机只是为了编译出发布包。然后点击菜单栏的“Product - Archive”Xcode 会开始归档。归档完成后会自动弹出 Organizer 窗口里面能看到本次 Archive 的记录。此时点 Distribute App会弹出导出选择。有四种常见类型App Store Connect、Ad Hoc、Development、Enterprise。App Store Connect 是提交上架的Ad Hoc 和 Development 是给测试设备用的Enterprise 是企业内部发布普通个人账号没有。选 App Store Connect 之后Xcode 会做一遍校验接着叫你选择上传还是导出。导出 ipa 的好处是你手里有一个最终产物可以反复用 Transporter 上传不用每次重新 Archive直接上传则省了一步但万一网络中断可能要从头再来。我习惯先导出 ipa 到本地再打开 Transporter 上传因为 Transporter 有断点续传机制碰到网络波动比 Xcode 直传更稳。3.4 ipa 文件生成后怎么验证它确实可用导出完成后找到 ipa 文件别急着上传。可以先把它解压看看确认里面有 Payload 目录而 Payload 里是一个以你的 App 名称命名的.app目录。如果你 Mac 上装了爱思助手这类工具也可以直接安装到真机上验证但为了不引入额外变量我一般直接用 TestFlight 或 Xcode 管理。验证 ipa 是否包含正确签名可以用 macOS 的codesign命令查看签名信息和 entitlements。更简单的办法是在 App Store Connect 里上传后用 TestFlight 安装到真机这是苹果官方推荐的预发布测试通道能和正式审核走几乎一样的安装链路。TestFlight 能验证安装包是否损坏、权限是否生效还能在提审前让内部成员先玩一轮发现启动黑屏之类的问题。4. App Store Connect 创建与提审一次说透4.1 先建 App 记录版本信息别乱填打开 App Store Connect进入“我的 App”页面点新增按钮就能开始创建 App 记录。这里需要选择平台“iOS”然后填 Bundle ID、名称、主要语言、SKU。SKU 是你的内部商品编码不会暴露给用户一般填项目代号就行。建好 App 记录后左侧会有 App 信息、定价与销售范围、访问权限等功能页签。这里要注意“App 隐私”部分按苹果要求你需要在提审前回答隐私问题包括是否会收集数据、收集哪些类型的数据、是否用于跟踪等。如果不清楚怎么填可以照着游戏接入的统计 SDK 的隐私文档来核对别为了省事全选“不收集”审核期间一旦被查出实际有上报行为会被认定为违规。上传构建版本后你还需要在对应版本页签里选择这个构建版本填写“App 审核信息”、截图、审核备注等。现在 App Store Connect 对截图的种类要求比以前严格6.7 英寸、6.5 英寸、5.5 英寸等尺寸最好都准备直接用 Xcode 的模拟器截图工具生成会方便很多。4.2 隐私政策、用户协议与账号删除一个都不能少如果你的游戏需要注册账号或者会收集用户任何信息提审时必须有隐私政策 URL。这个政策页面可以放在官网二级域名下也可以托管在 GitHub Pages但一定要能正常访问并且内容要真的说明你收集了什么、怎么用、怎么删除。首次启动时的隐私弹窗逻辑也要处理好。正常情况下弹窗给“同意”和“不同意”两个按钮用户点“不同意”时App 应该退出。很多人会用process.exit(0)或者application.terminate()但在 iOS 上直接终止进程不是标准的推荐做法审核人员可能判定为崩溃。建议在用户点“不同意”后跳转到一个“需要同意才能继续”的界面并提供“退出 App”按钮再由按钮触发退出。这种设计既符合苹果对数据收集的合规要求也能避开“不同意就闪退”的差评。还有账号删除功能。如果你的游戏支持注册账号而没有在 App 内提供删除账号的入口审核基本百分百会被拒。删除入口一般放在“设置”或“用户中心”里调用后台接口把账号数据做注销处理别只在前端清个 token 就算删除了。4.3 虚拟支付和 ID 追踪是审核红线中的红线在游戏 App 里面如果你售卖的是虚拟道具、钻石、月卡、去广告这类数字内容必须接入苹果的 App 内购买项目 IAP并按规定把苹果 30% 抽成计算到定价里。你不能引导用户去网页支付、加微信转账也不能在 App 里说“官网充值更便宜”这种“规避苹果支付”的行为一旦被发现审核不通过只是小事账号可能被封。在 App Store Connect 里你需要提前创建 App 内购买项目至少包含消耗型项目。然后游戏客户端通过 StoreKit 拉起支付流程Cocos Creator 里面没有现成的 IAP 组件一般需要写原生扩展或接第三方支付 SDK本地工程里完成 StoreKit 逻辑后再回调给 TypeScript。这部分建议在游戏开发阶段就预留接口别等游戏做完了再临时嵌入。再说 ID 追踪。如果游戏接入了广告 SDK或者用了 IDFA 做广告归因提审时会被要求填写用于追踪的用途说明并且必须使用 App 跟踪透明度框架 ATT 弹窗。iOS 14.5 之后的规则是不弹窗就不能读取 IDFA弹窗后用户拒绝你就拿不到 IDFA。所以你需要在 Cocos 原生层封装 ATT 请求逻辑在启动或进入广告页时弹出系统授权框。很多新手以为只要 SDK 接好了就没问题结果提审被拒的原因写着“App 内未发现 ATT 弹窗”就是因为忘了处理这一步。4.4 提审被拒了先别慌按这个顺序排查被拒信息会显示在 App 审核信息里附带拒绝原因、截图甚至崩溃日志。常见的有四类2.1 性能问题通常表示 App 启动崩溃或卡死3.1.1 虚拟支付说明有实物交易或未走 IAP4.3 垃圾 App常见于上线内容过少或者与他人功能雷同的壳应用5.1.1 隐私政策账号删除或权限描述不符合要求。这些都没必要和审核员硬刚。先重现他们描述的问题。比如 2.1 启动崩溃先用 TestFlight 版本连上 Xcode 看日志再把崩溃设备型号、系统版本反馈到代码里。如果是 3.1.1赶紧检查有没有漏掉的越狱渠道或线下支付引导。如果是 4.3不要只改个包名就重新提那样几乎必拒第二次你应该在原 App 的版本更新里补充差异化内容并在审核备注里说明新增了什么功能。回复 Resolution Center 时用词专业简洁把问题定位、修改方式、复现步骤写清楚。大多数合理的问题都可以在两次审核内解决真正头铁到三次全拒的情况多半是你没有认真看条款就先改了提交。5. iOS 适配和性能优化别等被用户骂了才做5.1 刘海屏与安全区让 UI 不被“耳朵”挡住iOS 全面屏设备有安全区概念顶部刘海、底部 Home Indicator 区域都属于系统占用区直接让 UI 贴到屏幕最上方会被遮挡。Cocos 提供SafeArea组件可以挂载到根节点或顶栏节点上自动适配安全区。但 SafeArea 只是适配 UI 布局游戏主相机渲染的画面一般还是全屏渲染。如果你希望在刘海区域也显示游戏背景那就全程渲染把交互按钮放到安全区里这种做法最自然。如果你偷懒把所有 UI 都锁在安全区内界面上下会出现黑边视觉上很业余。推荐做法是游戏场景全幅铺满UI 层通过 Widget 组件绑定到安全区域。还要注意 iOS 的分屏和多任务。如果你的游戏声明支持 iPad那用户可能以分屏方式打开你的游戏游戏窗口会变得很窄。Cocos Creator 如果固定横屏且按设计分辨率缩放分屏时会强制拉伸或缩放玩家体验不好。较好的方案是判断window.innerWidth与innerHeight比例变化后重新计算可视区域并把主 UI 根节点整体缩放。这个适配不复杂但不能漏。5.2 内存优化iOS 墓碑机制教你学会“省着用”iOS 系统和 Android 不一样应用退到后台后并不会立刻被杀但系统会保留它进入一种挂起状态时刻准备回收内存。你开发的游戏如果在后台被系统回收了用户再点回来时通常会直接黑屏重启这是 iOS 常见的“墓碑机制”。这个机制对 Cocos 游戏的影响很大。iPhone 可用内存本来就紧Cocos 引擎加载的场景、纹理、音频如果不做释放切后台再回来时很容易触发内存警告。所以你要特别注意以下几点加载新场景前旧场景的内存必须释放干净纹理压缩格式选择 ASTC这是 iOS 主流设备最适合的压缩格式能省一半以上显存远程图片、音频资源用完后要调用assetManager.releaseAsset释放引用不能只依赖引擎自动回收。音频会话也是一个大坑。默认情况下游戏播放背景音乐时用户按 Home 键切到后台音乐可能还在响。苹果对后台音频有严格规则普通游戏应用不应该在后台播放。正常的处理方式是在 App 进入后台时暂停游戏循环和音频回到前台时再恢复这些生命周期回调需要在原生层监听并通知 Cocos 脚本层。Cocos 原生模板里有一些示例代码但大多数情况要自己补全。5.3 屏幕方向、横竖屏锁定与 iPad 兼容游戏界面上架前要确认 App 支持哪些屏幕方向。App Store 审核时会在 iPhone 和 iPad 上都简单操作一轮如果你不支持 iPad那么你的 App Store Connect 版本信息里需要说明“未针对 iPad 优化”但这样做会导致 App 在 iPad 上的体验打折扣。Cocos 构建出来的 Xcode 工程默认支持竖屏和横屏不同版本默认值不同。建议只在你真正需要的方向打勾例如你只做竖屏跑酷游戏就只保留 Portrait避免审核人员把设备横过来发现界面错乱。iPad 兼容性的另一个隐藏问题是用户界面比例。iPhone 的偏长屏和 iPad 的 4:3 屏在相同设计分辨率下表现差异巨大。如果你的 UI 采用自动拉伸方式在 iPad 上会出现两侧大量留白。可以针对 iPad 设置更宽的设计分辨率或者用 Widget 组件把关键按钮锚定到屏幕边缘让 UI 自动铺开。这些细节决定了你游戏在 iPad 上的用户评分也影响你的 App 是否会被归为“iPhone-only”。6. 打包上架途中我记录的避坑清单6.1 证书和描述文件类问题速查我见过最多的情况是 Bundle ID 填错导致无法签名。Xcode 报错“The bundle identifier cannot be changed”说明你正在用别人模板的工程。这时在 Xcode 的 Signing Capabilities 里重新选中自己的 Team并确认 Bundle ID 和 Apple 后台完全一致。第二种常见报错是“No profile for team found matching”通常因为你还没在设备列表里加入这台 iPhone。自动签名模式下Xcode 会尝试把所有已连接的设备加入开发者后台但如果连接不稳定就会失败。解决方法是拔掉数据线改用 Wi-Fi 连接手机或者先去 Apple Developer 后台手动把设备 UDID 加进去再回 Xcode 刷新。第三种是证书过期。个人开发者账号每年续费后证书其实不会自动更新需要去 Xcode 的 Preferences 里点 Manage Certificates手动创建新的开发证书并撤销旧证书。如果你有多台 Mac 共用同一账号别随便撤销证书否则另一台机器的人的签名权限会被立刻废掉。6.2 mac 能上网但 Xcode 和 Transporter 连不上服务器这类问题偶尔会出现具体症状是浏览器打开苹果官网正常但 Xcode 在创建描述文件或 Transporter 上传 ipa 时卡在“正在连接”或者提示网络连接超时。优先检查三件事Mac 系统日期时间是否准确证书和请求签名依赖时间校验误差太大会直接握手失败开发者账号是否已经过期或刚续费账号状态异常也会让上传接口直接拒绝还有就是代理类工具的配置是否影响了 Xcode 的 HTTP 请求如果本机配了系统代理建议临时关闭再试。如果这些都排除了最简单的办法是使用 Transporter 这款独立工具。它比 Xcode 的集成上传更稳定而且会输出更明确的上传日志。上传失败时Transporter 会明确提示是包太大、网络中断还是证书不符方便对症处理。别老盯着 Xcode 干等切换工具往往比反复杀进程快得多。6.3 提审时启动崩溃但本地怎么都复现不了这个场景很折磨人。本地跑得好好的审核人员拿过来就闪退。第一次遇到时我以为是设备型号问题后来发现多数原因是审核环境没有正常登录账号或者隐私弹窗的时序问题。比如游戏启动后立刻请求本地网络权限如果用户点了“不允许”后续逻辑没有兜底就会出现必崩路径。处理这类问题要善于把崩溃日志拿到手。App Store Connect 的“Xcode - Window - Devices and Simulators”里会同步崩溃日志如果你接入了友盟、Bugly后台也会自动上报。先把崩溃堆栈里面引擎层和原生层的函数调用链看明白再按当前版本在相同系统版本的真机上模拟“用户禁止权限启动”“用户未同意用户协议”“冷启动后快速切后台”三组场景。大多数启动崩溃都逃不出这三个范围。6.4 上线前最后一次自检清单每次提交前我都会把下面这张表过一遍实测能省下不少审核往返时间检查项要点状态Bundle ID 一致Creator、Xcode、App Store Connect、Apple 后台四处一致必须一致图标启动屏无透明通道、无黑边、各尺寸齐全必须通过权限用途描述相机、相册、麦克风等都写了使用理由必须完整用户协议与隐私政策弹窗不同意能退出不直接闪退必须合规删除账号入口设置或用户中心可见必须存在IAP 支付虚拟物品不走第三方支付必须合规ATT 隐私弹窗使用 IDFA 时一定弹必须可见审核备注写明测试账号、功能范围尽量详细内存与性能后台切换稳定、无崩溃日志尽量稳定网络权限提示首次启动有明确用途说明尽量避免歧义这张表看起来简单但我几乎每一次上架都能从里面翻出一两个遗漏点。游戏行业上架比普通工具类 App 麻烦一点因为涉及虚拟支付和账号系统不同时期苹果的审核重点也略有变化。如果条件允许建议提审前先发一版 TestFlight 给身边同事让他们在不同机型上真机测试相比审核员的铁面无私身边同事至少还能给你截图告诉你哪一步错了。最后再说点个人体会。做 iOS 上架这件事只要走过一次完整流程后面再做第二个、第三个 App 会顺手非常多。第一次折腾三四个通宵很正常尤其是签名和隐私政策那几关。但正因为每一步都有明确的系统约束它反而比安卓市场那套多端适配要来得清爽。只要 Cocos 构建的工程没动过、Xcode 签名干净、隐私合规处理完整上架这件事基本就是走流程而已。希望这份记录能让你少走我走过的弯路一次就把游戏送到全球玩家手里。
返回列表