ARTICLE DETAIL

资讯详情

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

Cocos2d-x iOS打包上架全流程:证书与描述文件配置避坑指南

Cocos2d-x iOS打包上架全流程:证书与描述文件配置避坑指南 从 Cocos2d-x 一路把游戏搓到上架最折磨人的往往不是 C 崩溃也不是内存泄漏而是你明明写好了游戏却在 Xcode 里卡在证书和描述文件那一步看着“No profiles for xxx were found”这种报错一脸懵。这篇文章我就把整个流程串一遍从打包前的工程配置到证书申请、描述文件创建再到最后 Archive、Export、用 Transporter 上传 App Store Connect连着一堆我踩过的坑一起给出来。不管你是第一版准备提审还是被证书过期、描述文件失效折腾到头皮发麻应该都能在这篇里找到对应的处理思路。1. 内容整体设计与思路拆解1.1 为什么证书和描述文件是 Cocos 上架的最大门槛用 Cocos2d-x 做 iOS 打包从引擎角度来说其实很成熟流程基本就是在 Mac 上用 Xcode 打开proj.ios里的工程文件配置好签名Archive导出 ipa上传。但问题就出在“签名”这两个字上。iOS 有一套强制性的代码签名机制所有在真机上运行或者准备上架的 App都必须由 Apple 签发的证书签名同时还要配上对应的描述文件Provisioning Profile告诉系统“这个 App 是谁的、能跑在哪些设备上、带哪些能力”。这跟 Android 那边随便找个 keystore 签个名就能跑完全不一样。Cocos 生成的 Xcode 工程默认的 Bundle Identifier 是一串com.xxx.xxx的占位符如果你没先注册、没生成描述文件就顺手 Build十有八九会报错。很多人第一次打包就是栽在“位置都找不到、功能搞不清楚、报错看不懂”这三件事上。1.2 整体流程拆解从工程到提审的完整链路我把整个上架过程拆成四个阶段理解了这个链路之后再动手就不慌了阶段一环境与工程准备。确认 Mac、Xcode、Cocos2d-x 版本兼容修改 Bundle Identifier把图标、启动屏、隐私描述这些基础项配置好。阶段二证书与描述文件创建。这一步在 Apple 开发者后台操作生成 Certificates 和 Profiles然后导入 Xcode。阶段三Xcode 打包导出。Archive 出 ipa 包选择 Distribution 方式导出期间会涉及签名校验、图标校验、权限声明一系列步骤。阶段四App Store Connect 上传与提审。用 Transporter 上传填好 App 信息、隐私政策、审核备注提交等待审核。这四个阶段里最容易出问题的不是第四步而是第二、三步之间衔接的时候。很多报错表面上说是签名不对根因其实是描述文件类型选错或者 App ID 配置漏了某项能力。所以后面我会把证书和描述文件这部分重点展开讲。2. 打包前的环境准备与工程配置2.1 版本兼容性自查Xcode、Cocos2d-x、iOS SDK 的匹配先说环境。Cocos2d-x 不像是 Unity每个版本对 Xcode 的适配窗口很短。我自己常用的是 Cocos2d-x 3.17.2对应的 Xcode 最高能流畅适配到 14 系列。如果你把老项目强行拿 Xcode 15 来编译可能遇到_Cocos2dUseFileSystem这种链接报错还有一堆deprecated警告虽然很多能靠改编译设置压下去但建议先确认一下自己的组合是否靠谱Cocos2d-x 版本推荐 Xcode 版本备注3.16 及以下Xcode 11 及以下语言标准和 bitcode 比较老新系统兼容性差3.17.xXcode 12 ~ Xcode 14目前大量上线项目在用相对稳定4.0 及以上Xcode 13 ~ Xcode 15需要新版本 CMake 生成工程不再用传统 proj.ios 的 xcodeproj 为主提示先看你手上 Cocos 工程的proj.ios是不是自带.xcodeproj。如果是老式工程Xcode 15 直接打开后大概率会弹出一堆签名和构建系统迁移提示。我自己碰到过把 Build System 改成 New Build System 后编译报一堆 Linked Framework 缺失的问题这种情况回到 Legacy Build System 反而能过。2.2 Bundle Identifier 的规划与修改Bundle Identifier下面简称 Bundle ID是你 App 在整个 App Store 生态里的身份证一旦上架了某 bundle id以后基本不能换同名的会被开发商后台强占。Cocos2d-x 模板工程默认生成的可能是一串带com.cocos2dx或者随意组合的字符串我建议在开始任何签名操作之前先做一次全局搜索替换。操作思路用 Xcode 打开工程点击根节点在General-Identity里把Bundle Identifier改成你自己的比如com.yourcompany.yourgame。同时检查Signing Capabilities里的 Team 是不是空的如果还没登录开发者账号就先登录。有些 Cocos 工程会把 bundle id 写在.plist或 build 配置里最好在工程文件里搜一遍原来的旧 id 全部换掉。这个 string 在证书和描述文件里都会被严格比对差一个字符都不行。常见报错The bundle identifier “xxx” is already taken就是因为你在开发者后台建了两个一样的 App ID或者你的 bundle id 已经被别人注册了。起名尽量用反向域名别用占用严重的大众词。注意Bundle ID 的修改一定要在正式申请描述文件之前完成因为在 Profiles 里选的 App ID 必须和 Xcode 工程里的 Bundle ID 完全一致。我就见过有人 Xcode 里写的是com.test.abc后台建 App ID 时填了com.test.abc1最后签名时无论如何都过不了。2.3 图标、启动屏与隐私声明提前补好避免导出时被拦Xcode 打包导出时会有很多自动化检查其中一个重灾区就是 App 图标和启动屏。Cocos 模板工程里图标经常是缺的或者尺寸不全。需要的图标套件包括App Store 列表用的 1024x1024 无透明通道图标。AppIcon.appiconset里各种尺寸的 iPhone / iPad 图标。启动屏现在建议用Launch Screen.storyboard而不是老的LaunchImage静态图。我的做法是生成一套 1024 的图再用脚本缩放出一整套小尺寸。很多导出报错像ITMS-90096其实就是缺少 1024 图标或者是 1024 图带 alpha 通道。把图标配置好之后在 Xcode 的Assets.xcassets里检查一遍所有图标位是否有图这样后面 Distribute App 时能少踩至少两个坑。隐私声明这块iOS 从 14 之后对隐私权限非常敏感。Cocos 游戏如果接了游戏中心的排行榜、广告 SDK、或者统计 SDK需要在Info.plist里配置NSUserTrackingUsageDescription、NSLocalNetworkUsageDescription等。这个不在打包时报错但提审时隐私政策、App 隐私标签对不上一样会被拒。3. 证书与描述文件手把手配置的完整实操3.1 先搞懂签名机制证书、私钥、描述文件三者关系我刚做 iOS 时老搞混证书和描述文件后来用一句话记住证书是证明“你是谁”的描述文件是说明“你能做什么、能跑在哪台设备上”的。两者配合缺一不可。证书Certificate分开发证书和发布证书文件格式一般是.cer里面包含公钥导入钥匙串后会和本地私钥一起组成签名身份。私钥Private Key生成 Certificate Signing Request 时由 Mac 钥匙串生成一般在你的登录钥匙串里导出为.p12可以换电脑使用。描述文件Provisioning Profile包含 App ID、证书、设备列表Ad Hoc/Development 需要、以及授权的能力文件格式是.mobileprovision。签名过程简单理解就是本地用私钥对 App 做数字签名系统用证书里的公钥验证开发者身份同时检查描述文件是否允许当前设备安装运行。你在开发者后台生成证书时上传的.csr文件里有公钥信息Apple 用他们的私钥签名证书再发给你。3.2 开发者账号准备与 Certificates 创建首先你需要一个 Apple Developer Program 的付费账号个人或公司都行登录 developer.apple.com 进入Certificates, Identifiers Profiles。创建证书的步骤在 Mac 上打开“钥匙串访问”点击菜单栏证书助理-从证书颁发机构请求证书。输入你的邮箱地址常用名称可以写你的名字或者公司名选择“存储到磁盘”生成.certSigningRequest文件。在开发者后台选择Certificates- 点击选择证书类型。上传.certSigningRequest文件点击继续下载生成的.cer文件。双击.cer文件导入钥匙串确认在“我的证书”里能看到带私钥的证书条目。证书类型要区分清楚。平时测试用 iOS App Development上架用 App Store and Ad Hoc如果你还要做企业分发就选 In-House但大多数 Cocos 游戏只需要前两种。实操心得证书和私钥是一对如果换了电脑只有.cer没有私钥Xcode 里会一直提示找不到 signing identity。正确做法是把证书和私钥组成的 identity 导出成.p12文件换机器时双击导入。团队开发时建议由一人统一管理发布证书把.p12安全分发给需要打包的成员避免每个人各建一套证书造成后台混乱。3.3 App ID 与描述文件的创建描述文件之前必须先创建 App IDIdentifiers。在后台Identifiers页面点击选择 App IDs继续。选择 App 类型一般选 iOS App。填写描述性的名称和 Bundle Identifier。这一步要选择是否支持 Capabilities比如 Game Center、In-App Purchase、Push Notifications。注意有些能力创建后不能随意修改比如 Associated Domains 这类建议按需勾选。注册完成后进入Profiles页面创建描述文件。描述文件也分类型和证书一样描述文件类型用途是否限制设备iOS App Development开发调试真机运行限制设备数量需要添加测试设备 UDIDApp Store Connect上架 App Store 用不限制设备Ad Hoc外部测试分发限制设备数量对于上架来说重点是创建App Store Connect类型的描述文件。步骤是选择 App Store Connect 类型选中刚创建的 App ID选中你已有的发布证书命名后下载.mobileprovision文件。3.4 在 Xcode 中配置 Signing Capabilities拿到证书和描述文件之后Xcode 的配置有两种方式Automatic Signing勾选自动签名Team 选择你的开发者账号Xcode 会自动管理和下载证书、描述文件。Manual Signing关闭自动签名手动选择Provisioning Profile和Signing Certificate。我自己的建议是如果是自己一个人做所有工程都在同一台电脑上用 Automatic Signing 最省心。但如果是 CI/CD 打包、多人协作或者同一个工程要在多台机器出包手动签名反而更可控可以避免 Xcode 在后台偷偷给你换掉证书。配置入口在Target-Signing Capabilities勾选Automatically manage signing之前先确认 Team 已选择。如果使用手动签名则取消勾选在Provisioning Profile里选择 App Store 的 profile在Signing Certificate里选择Apple Distribution证书。确保Bundle Identifier和后台 App ID 完全一致。常见问题Automatic Signing 开启后如果提示An App ID with identifier xxx is not available, please enter a different string说明后台没有这个 App ID或者 Xcode 想自动创建但 bundle id 被别的账号占用了。先去后台 Identifiers 里确认存在。4. 打包构建与上架流程一次通过的实操记录4.1 Archive 前的构建准备Cocos 工程在 Xcode 里直接点 Run默认连接真机或者模拟器都能跑。但真正上架时我们需要的是 Release 配置下的 archive 包。构建前要检查的几项Scheme 选择。如果工程里存在多个 scheme选对你游戏的那个一般就是工程名。点开Edit Scheme把Run、Archive的 Build Configuration 都设置成Release。有些 Cocos 工程 Debug/Release 的宏定义不一样Debug 包可能没开优化崩溃信息也全但上架无所谓Release 就行。目标设备选择。Archive 前 Xcode 顶部的设备选项要选Any iOS Device (arm64)不要选真机或者模拟器。如果选中模拟器Archive 按钮是灰的这是新手特别容易卡住的地方。确认通用配置。在Build Settings里搜bitcode如果你用的是 Cocos2d-x 3.x建议直接设为 No很多老 SDK 和 bitcode 不兼容而且 App Store 早就已经不强制 bitcode 了。Architectures里确认arm64在列表里虽然 iOS 12 之后纯 32 位已经不存在但很多老工程还可能残留 armv7保留 armv7 会让包变大也会引入额外编译错误。4.2 Archive 导出 ipa 的操作步骤配置完这些就可以正式打包了在 Xcode 菜单栏选择Product-Archive。等待 Xcode 编译、链接、签名。第一次 Archive 一般需要几分钟Cocos 工程如果在 Debug 版本上没编译过 Release可能还会触发全量构建耐心等不要强制中断。构建完成后Xcode Organizer 窗口会自动弹出或者从Window-Organizer打开你会看到刚才生成的 archive 记录。选中最新一条 archive点击右侧Distribute App。选择App Store Connect选项一路 Next。这里每一步都有细节要留意选择App Store Connect后系统会问你是Upload还是Export建议选 Upload 直接上传也可以选 Export 先导出.ipa再手动用 Transporter 上传后一条路线在 CI/CD 和网络波动时更常见。签名校验那一步Xcode 会重新验证你的证书和描述文件是否匹配 App Store Connect 发布要求确保选对了Apple Distribution证书和App Storeprofile。导出过程中可能有各种 warning比如ITMS-90428之类的图标警告如果不是致命的可以继续。但如果是Missing required icon file这类最好回上一步修完再重新导出。4.3 用 Transporter 上传到 App Store Connect其实新版 Xcode 已经把上传功能集成在 Organizer 里了但我个人更习惯单独用 Transporter App因为它独立于 Xcode网络异常中断后的重传策略更好而且能看到更明确的上传错误码。Transporter 的用法没什么难度Mac App Store 下载 Transporter登录你的 App Store Connect 账号。把.ipa文件直接拖进窗口。点击上传等待验证和上传完成。可能遇到的上传问题主要是plist parsing error这类我在搜索热词里也看到过类似的报错。一般是.ipa里的Info.plist格式不规范或者工程里 Assets.car 异常。用 Transporter 有一个好习惯先把 ipa 拖进去它会先做本地校验有格式问题早报出来比直接传完被 App Store Connect 弹回来要省时间。实操心得Transporter 上传前如果弹Unsupported Swift Version或者Missing Info.plist key这类提示不要慌。前者去 Xcode 里把SWIFT_VERSION改到当前 Xcode 支持的版本后者检查Info.plist里有没有CFBundleShortVersionString、CFBundleVersion这两个必填键。Cocos 工程的 plist 一般自带但如果你整体改过工程配置偶尔会丢。4.4 App Store Connect 后台配置与提审信息填写ipa 上传成功之后进入 appstoreconnect.apple.com。在我的 App里新建 App输入推广名称、主要语言、套装 ID就是你的 Bundle ID、SKU 等这些信息一次保存后续很难改所以想清楚再填。接着是设置 App 信息隐私政策 URL这是必填项。如果直升机式的个人开发者没有官网可以临时用 GitHub Pages 或者 Notion 页面放一份静态隐私政策。应用类别游戏类的还要选择分级。Cocos 游戏如果只是普通消除、卡牌一般选 4如果有联网对战、抽卡开箱分级会相应提高。截图。要求 6.7 寸、6.5 寸、5.5 寸等尺寸的截图Cocos 项目如果没做 iPad 适配至少要把 iPhone 截图补齐。你可以先在模拟器跑一遍用 Xcode 的截图工具拍几张再导到 Mac 上用预览改尺寸。App 审核信息里的联系方式和备注也建议认真填比如测试账号、特殊功能说明。很多被拒的情况其实可以通过审核备注提前解释。最后是“App 隐私”模块需要声明收集的数据类型、用途、是否关联用户身份。如果你的 Cocos 游戏只上传排行榜分数没有账号系统也没有广告 SDK可以全部选不收集审核会很快。一旦接了广告务必声明NSUserTrackingUsageDescription和 ATT 弹窗逻辑否则被 4.3 或 5.1.1 打回来是常事。5. 常见问题与排查技巧实录5.1 签名与描述文件相关报错速查表这部分我按常见报错整理了一张表都是实操里高频遇到的报错信息根因解决办法No profiles for xxx were foundXcode 没找到匹配当前 bundle id 的描述文件去后台确认 App ID 存在创建 App Store profile返回 Xcode 刷新签名Provisioning profile does not include signing certificate描述文件里的证书和本地钥匙串证书不匹配重新生成描述文件选择当前使用的发布证书Code signing is required for product type Application没有选择签名证书在 Signing Capabilities 中选好 Team让 Xcode 自动生成An App ID with identifier xxx is not availableBundle ID 与后台不一致或被占用修改工程 Bundle ID 或后台重新注册The identity used to sign the executable is no longer valid证书被吊销或过期到后台看看证书状态重新生成并下载新证书ITMS-90026 / ITMS-90096缺少 1024 图标或图标有 alpha 通道替换无透明通道的 1024x1024 图标Missing required icon fileAppIcon 配置不全在 Assets.xcassets 补全所有尺寸图标5.2 iOS 16 真机调试的开发者模式问题上架流程本身不需要真机但开发阶段免不了真机调试。iOS 16 之后苹果把“开发者模式”默认关掉了插线到 Xcode 会提示Could not locate device support files或者直接连不上。解决办法是先到手机设置-隐私与安全性-开发者模式打开开关并重启手机然后再连 Xcode。这个不是证书问题但很多人卡在它上面尤其从旧设备迁移过来之后甚至找不到这个入口。遇到这种问题先别怀疑签名先把开发者模式开了再说。5.3 多设备、多人协作时的证书泄漏与混乱问题团队协作时最大的坑是每个人都在自己的钥匙串里生成一份证书签出来的包各不相同后台描述文件里绑定了一个证书别人电脑上就是签名失败。解决思路指定一个证书管理员统一在后台生成证书和描述文件。证书管理员把.p12和描述文件导出分发给每个需要出包的同事。所有成员统一不用 Automatic Signing改用 Manual Signing选同一个证书和 profile。CI 机器上建议把.p12安装到登录钥匙串设置描述文件到~/Library/MobileDevice/Provisioning Profiles目录。这四条做好团队内就不会再因为签名不一致吵到项目经理那里。5.4 提审被拒的常见原因和规避思路提审被拒尤其是 Cocos2d-x 游戏最常见的几个理由4.3 设计重复。Cocos 同模板换皮游戏特别容易被算法判定为垃圾应用。规避方法是 UI 和玩法要有足够的差异化同时在审核备注里说明自己的独特功能。5.1.1 隐私数据收集。如果接入广告 SDK 却没有 ATT 弹窗必拒。要在 App 启动后、追踪用户前弹出 AppTrackingTransparency 授权框。2.1 性能问题。App 启动崩溃、长时间卡死。这个需要在提交前用 TestFlight 多跑几轮真机尤其是低配机型。3.2 最低功能要求。App 内容太少比如只有一个广告页或者空壳。Cocos 游戏如果是个 Demo 级别的内容建议先把核心循环做完再提。被拒之后不要想着去申诉硬刚改完重新提一个构建版本通常更快。App Store 审核周期一般 24~48 小时如果反复被拒新版本从构建上传到可用大概也是这个节奏。5.5 Cocos 工程特有的一些“隐藏坑”除了苹果生态本身的坑Cocos2d-x 工程还有几个容易忽略的问题静态库链接顺序。Cocos 的 lib 经常因为依赖顺序不对导致Undefined symbols for architecture arm64这种问题在 Xcode 升级后尤其明显。保守做法是把cocos2d相关的.a文件按字母序排放不要用$(inherited)偷懒。lua/js 工程的资源加密。如果游戏资源不加密审核人员其实无所谓但上架后很容易被竞争对手扒资源。推荐在构建脚本里做 XXTEA 加密或者 AESCocos 官方就带有 xxtea 模块。网络访问权限。游戏内联网请求如果走 HTTP 明文iOS 的 ATS 会直接拦掉。测试阶段可以在Info.plist加NSAppTransportSecurity例外上架前最好替换成 HTTPS否则特定地区审核会有网络超时风险。内存占用。Cocos 2d-x 对纹理缓存管理很敏感在低端 iPhone 上容易因内存告警被杀。上架前用 Instruments 的 Allocations 排查一遍特别是关卡切换后的纹理释放。6. 一点个人经验收尾我做 Cocos2d-x 上架也好几年了吃过最大的亏就是“懒”懒得做 App ID 规划结果一个游戏想加 Game Center发现 bundle id 已经挂在旧 App 下懒得导出 p12新电脑上打包时发现发布证书无效懒得看隐私协议一个 ATT 弹窗没接在审核环节被卡了一周。如果你现在就准备打包我建议顺序是先花十分钟把 Bundle ID、后台 App ID、证书、描述文件这四样东西的对应关系在纸上列清楚再动手点 Xcode。这样你大概率能避开帖子里百分之九十的报错。用 Cocos 上架 iOS 这件事本身不复杂真正的复杂度全在苹果这套签名和审核体系里把它理顺了剩下的流程基本就是流水线作业。
返回列表