证书与签名
没有证书也能编译,但装不进手机。准备好 .p12 和 .mobileprovision 放进证书目录,之后每次构建自动签名;工程里怎么指定证书、命令行怎么临时覆盖。
设置签名证书
把 .p12 证书、.mobileprovision 描述文件和密码文件 password.properties 放进 keychain 证书目录。还没有证书和描述文件的,先看下文创建证书和描述文件。
证书目录可以放在两个位置,两处的证书会合并使用:
- 工程目录/keychain/:只对这个工程生效
- KXBUILD_HOME/keychain/:所有工程共用。默认 Windows 是 %USERPROFILE%\kxbuild\keychain\,WSL、Linux、macOS 是 ~/kxbuild/keychain/
macOS 上也可以直接用系统钥匙串里的证书。
password.properties 每行一张证书,格式为「文件名=密码」,文件名和 .p12 完全一致,密码不加引号。
development.p12=123456
distribution.p12=123456放好之后每次构建按工程中的签名设置自动签名,不需要在 KXBuild 中配置。没有证书也能编译,只是产物不签名、装不进手机。
创建证书和描述文件
需要两个文件:包含私钥的 .p12 证书和 .mobileprovision 描述文件,类型见文末的证书类型和描述文件类型表。Development 描述文件换手机时,要在开发者账号里加入新手机的 UDID 后重新下载。
两个文件都来自 Apple 开发者账号,Windows 上有三种获取方式。
用 Appuploader 生成(推荐)
Windows 上的 App Store 辅助工具,用开发者账号登录后可以直接创建证书、导出 .p12、创建和下载描述文件。上架时也会用到它。
从 Mac 导出
在「钥匙串访问」中把证书连同私钥导出为 .p12,再从 developer.apple.com 下载描述文件。只有 .cer 文件不行,其中没有私钥。
用 OpenSSL 生成
生成私钥和 CSR,在 developer.apple.com 的 Certificates 页上传 CSR 下载 .cer,再合成 .p12。
> openssl req -new -newkey rsa:2048 -nodes -keyout ios.key -out ios.csr -subj "/emailAddress=you@example.com/CN=Your Name/C=CN"> openssl x509 -in development.cer -inform DER -out development.pem> openssl pkcs12 -export -inkey ios.key -in development.pem -out development.p12kxbuild 内部是如何选择证书的
和 Xcode 一样,按工程里的签名设置(工程设置编辑器的 General → Signing)从证书目录中挑选,分三步:
选证书类型
签名身份 CODE_SIGN_IDENTITY 是 Apple Development 就用开发证书,是 Apple Distribution 就用发布证书。
选团队
只用团队 DEVELOPMENT_TEAM 下的证书和描述文件。
选描述文件
自动签名(Automatic)按 Bundle ID 和团队自动匹配;手动签名(Manual)按 PROVISIONING_PROFILE_SPECIFIER 里填的描述文件名查找。
新建的工程默认是 Apple Development 加自动签名,日常开发不需要改。
命令行里不想改工程文件,可以用 -D 临时覆盖:
打 App Store 包时换成发布证书:
> kxbuild build .\MyApp.xcodeproj -c Release -D CODE_SIGN_IDENTITY="Apple Distribution"只编译,不签名:
> kxbuild build .\MyApp.xcodeproj -D CODE_SIGNING_ALLOWED=NO构建报 No signing certificate matching '…' found,说明证书目录里没有工程要求的证书类型或团队。放入对应的 .p12,或者用上面的 -D 换成目录里已有的证书。
证书类型
证书(.p12)证明 App 是谁签的。常用的几种:
| 证书 | 作用 | 搭配的描述文件 |
|---|---|---|
| Apple Development | 开发调试:装到测试手机上运行、断点调试 | Development |
| Apple Distribution | 发布:上传 App Store / TestFlight,Ad Hoc 测试分发,企业账号的内部分发 | App Store Connect、Ad Hoc、In-House |
| iOS App Development | 旧版开发证书,作用同 Apple Development,仍然可用 | Development |
| iOS Distribution | 旧版发布证书,作用同 Apple Distribution,仍然可用 | App Store Connect、Ad Hoc、In-House |
| Apple Push Notification service SSL | 服务器发送推送通知用,不用来给 App 签名,不要放进证书目录 | — |
描述文件类型
描述文件(.mobileprovision)规定这个 App 能用哪张证书签名、能装到哪些手机上。它绑定了 Bundle ID,必须和工程里的一致。常用的几种:
| 描述文件 | 作用 | 证书 | 设备限制 |
|---|---|---|---|
| Development | 开发调试,Debug 构建用 | Apple Development | 只能装到描述文件里登记了 UDID 的手机 |
| Ad Hoc | 不经过 App Store,把测试包发给少量测试人员 | Apple Distribution | 只能装到登记了 UDID 的手机,每类设备每年最多 100 台 |
| App Store Connect | 上传 App Store Connect,用于 TestFlight 和上架 | Apple Distribution | 不能直接装到手机,经 TestFlight 或 App Store 安装 |
| In-House | 企业账号内部分发,员工直接安装 | Apple Distribution(企业账号) | 不限设备,只能在企业内部使用 |