前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版

React Native 打包前奏之 iOS 证书与描述文件配置详解

首页2019-10-03 19:10:12Front-End
RNIOS证书iOS描述文件推送证书

第一次配 iOS 证书的人,基本都会卡在同一个地方:明明按教程一步步点完了,Xcode 还是飘红说 No signing certificate "iOS Distribution" found,或者包打出来了装到测试机上直接闪退。原因不是哪一步点错了,是根本没搞清楚 App ID、证书、描述文件、设备这四样东西之间的依赖关系,出问题时不知道该回头查哪一环。

这篇专门讲证书这一层,不讲打包。从钥匙串生成 CSR 开始,把 App ID、开发证书、发布证书、推送证书、描述文件挨个走一遍,每一步说清楚它在整条链路里管什么、做完应该看到什么。打包和分发的部分在另一篇里: React Native iOS 打包发布全流程。

在本篇文章中,我们将从浅入深,和大家一起学习以下知识:

  • App ID、证书、描述文件、设备这四样东西各自管什么,谁依赖谁
  • 为什么要先生成 CSR,它和钥匙串里那对公私钥是什么关系
  • Explicit App ID 和 Wildcard App ID 的区别,什么时候一定不能用通配符
  • 开发证书和发布证书的差别,团队里应该怎么共用
  • 推送证书怎么申请、怎么导出 p12 传给友盟或极光后台
  • Provisioning Profiles 里到底打包了哪些信息,为什么加了设备就必须重新生成
  • 几个高频报错的定位思路

iOS 证书与描述文件配置的整体流程示意

# 一、先把整套体系理顺

我们都知道开发一款应用需要配置苹果常用证书、App ID、Provisioning Profiles,如果有推送还需要配置推送证书等。这几个名词长得都差不多,先花两分钟把关系捋清楚,后面所有操作就都有的放矢了。

# 1.1 App ID

App ID 是每个应用的独立标识,在设置中可以配置该应用的权限,比如 Push Notifications、Network Extensions 等。

它对应的就是 Xcode 里的 Bundle Identifier,形如 com.company.appname。这个值一旦注册就改不了,命名之前想清楚。它除了当身份用,还负责声明这个 App 要开哪些能力,推送、App Groups、Sign in with Apple 都在这里勾。

# 1.2 开发者证书

  • iOS 证书是用来证明 iOS App 内容(executable code)的合法性和完整性的数字证书。对于想安装到真机或发布到 AppStore 的应用程序(App),只有经过签名验证(Signature Validated)才能确保来源可信,并且保证 App 内容是完整、未经篡改的。
  • 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。具有时效性,只在特定的时间段内有效。
  • 开发证书类型分为两种,一种开发证书(iOS Development)一种发布证书(iOS Distribution)。开发证书(iOS Development)用于开发和调试应用程序,可用于真机调试;生产证书用于打包上传 App Store,用于验证开发者身份。

补一句时效性说明:这两个名字在苹果后台已经改过了,现在列表里显示的是 Apple Development 和 Apple Distribution,含义没变,只是从「iOS 专属」扩成了跨平台通用。不同时期进后台看到的措辞可能对不上,认准 Development 和 Distribution 这两个词就行。

证书这东西的关键在于,它和具体哪个 App 无关。一张开发证书可以给团队里所有 App 用,它证明的是「签这个包的人是谁」,不是「这个包是哪个 App」。

# 1.3 推送证书

如果项目中集成了推送功能,同样需要配置推送证书。推送证书同样也分两种:开发(Apple Development iOS Push Services)、生产(Apple Production iOS Push Services)。推送证书在 App ID 中创建生成,同时生成的 p12 文件需要上传到服务端后台(友盟后台、极光后台或自己服务端后台)。

注意推送证书和签名证书是两条独立的线。签名证书管「谁签的包」,推送证书管「谁有资格往这个 App ID 推消息」,所以它必须绑定到具体的 App ID 上,而普通签名证书不用。这也是为什么通配符 App ID 开不了推送。

# 1.4 配置文件(Provisioning Profiles)

配置文件同样也分两种,分为开发(Development)和发布(Distribution),配置文件(Provisioning Profiles)中包含了证书、App ID、设备(Devices),后缀名为 .mobileprovision。它在开发者账号体系中扮演着配置和验证的角色,是真机调试和打包上架必须的文件。

  • 一个 Provisioning Profile 对应一个 Explicit App ID 或 Wildcard App ID
  • Provisioning Profile 决定 Xcode 用哪个证书(公钥)/ 私钥组合(Key Pair / Signing Identity)来签名应用程序(Signing Product),将在应用程序打包时嵌入到 .ipa 包里
  • Provisioning Profile 把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用。这样,只要在不同的情况下选择不同的 Provisioning Profile 文件就可以了
  • Provisioning Profile 也分为 Development 和 Distribution 两类,有效期同 Certificate 一样。Development 版本的 Provisioning Profile 用于开发调试,Distribution 版本的 Provisioning Profile 主要用于提交 App Store 审核,其不指定开发测试的 Devices

先说结论,这四样里最容易出问题的永远是描述文件,因为只有它是个「组合体」。上游任何一项动了(换了证书、加了设备、改了 Bundle ID),它就作废了,得重新生成,而且重新生成之后必须重新打包,旧包不会自己变好。

ps:打 Ad-hoc 包的时候,如果遇到刚添加的设备 UDID 没添加进去,可以将开发模式的配置文件下载下来,打包后直接选中即可。

Provisioning Profile 与证书、App ID、设备三者的关联关系

这张图把依赖关系画出来了,看懂它,后面出问题基本都能自己定位到是哪一环断了。

# 二、账号先选对再动手

在配置证书之前我们需要有一个开发账号。个人账号和公司账号类似,每年都需要支付 99 刀,其中公司账号需要邓白氏编码而个人账号并不需要。

如果项目需要不通过 App Store 进行安装,可以申请企业账号。当然了,也可以找一些第三方直接打企业包,比如蒲公英之类的。

这里补三句实操经验。第一,邓白氏编码(D-U-N-S Number)申请周期不短,公司账号要提前规划,别等到要上架了才去办。第二,企业账号(Apple Developer Enterprise Program)年费是 299 美元,而且苹果这些年对它的审核越来越严,明确规定只能给自己员工内部分发,拿来对外发应用是会被封的。第三,账号类型直接决定了你能用哪些分发方式,个人和公司账号只能走 App Store、TestFlight 和 Ad Hoc,企业账号才有 In-House。

选错账号类型,后面所有证书都得推倒重来。

# 三、创建 CSR 文件(证书请求文件)

CSR(Certificate signing request)即证书请求文件。证书申请者在申请数字证书时由 CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件(CSR 文件),证书申请者只要把 CSR 文件提交给证书颁发机构后(在苹果后台创建 Certificate 时上传),证书颁发机构使用其根证书私钥签名生成证书公钥文件(开发者证书)。

这一步在做的事,说到底就是本机先造一对公私钥,私钥留在自己的钥匙串里绝不外传,把公钥连同身份信息打包成 CSR 交给苹果,苹果盖个章还给你,那就是证书。

理解这一点很重要,因为它解释了一个高频困惑:为什么同事把证书发给我,我导入之后 Xcode 还是说找不到签名身份? 因为他给你的是证书(公钥部分),私钥还在他电脑上。没有私钥就没法签名,正确做法是让他导出 .p12,那个文件里才同时包含证书和私钥。

关于 CSR 文件的创建,我们可以直接使用 Mac 上的钥匙串访问直接请求。

具体步骤为:钥匙串访问 -> 钥匙串访问 -> 证书助理 -> 从证书颁发机构请求证书

1、打开电脑上的钥匙串访问,选中证书助理

在钥匙串访问的菜单中依次选择证书助理和从证书颁发机构请求证书

点开之后如果这个菜单项是灰的,多半是当前没有选中「登录」这个钥匙串,先在左侧点一下再试。

2、用户电子邮件地址填开发者账号的邮箱,名称可以随意填,然后保存到磁盘上

在证书信息表单中填写邮箱与名称并选择存储到磁盘

这一屏有两个要点。一是必须勾「存储到磁盘」而不是「发送给 CA」,选错了不会生成文件。二是「CA 电子邮件地址」那一栏留空即可,苹果不需要它。保存完你会在桌面上拿到一个 .certSigningRequest 文件,这就是待会儿要上传的东西。

3、Keychain 将生成一个包含开发者身份信息的 CSR(Certificate Signing Request)文件。同时,Keychain Access -> Keys(密钥)中增加一对 Public / Private Key Pair

回钥匙串的「密钥」分类里确认一下,应该多出一对同名的公钥和私钥。这对钥匙千万别删,删了之后所有用它签发的证书全部作废。这个我踩过,重装系统没导出钥匙串,团队那张发布证书直接没法用了,只能吊销重来。稳妥的做法是配完之后立刻把私钥导出成 .p12 存一份到安全的地方。

# 四、创建 App ID

1、登录苹果开发者中心,或者直接登录 Apple Member Center 选择 Certificates, Identifiers & Profiles

登录苹果开发者中心后进入 Certificates, Identifiers & Profiles 板块

进来第一件事是确认右上角的团队名对不对。同时挂在个人账号和公司账号下的人特别容易在这里选错,证书全建到另一个团队去了,Xcode 里怎么都匹配不上。

2、选择 Identifiers 中的 App IDs,然后点上方的加号

在 Identifiers 列表页点击加号新建 App ID

点完加号会先让你选类型,选 App IDs 那一项。同一屏里还有 Services IDs、Pass Type IDs 之类,那是给网页登录、Wallet 卡券用的,别点错。

3、添加 App ID Description 和 Bundle ID

  • 在「Explicit App ID」栏下的「Bundle ID」项中输入 App ID(反域名格式,如 com.company.test)
  • 这里「Bundle ID」对应 Xcode 中的「Bundle identifier」。Explicit App ID 是唯一的 App ID,用于唯一标识一个应用程序。例如 com.apple.garageband 这个 App ID,用于标识 Bundle Identifier 为 com.apple.garageband 的 App
  • Wildcard App ID:含有通配符的 App ID,用于标识一组应用程序。例如 *(实际上是 Application Identifier Prefix)表示所有应用程序;而 com.apple.* 可以表示 Bundle Identifier 以 com.apple. 开头(苹果公司)的所有应用程序
  • 在「App Services」栏下选择应用要使用到的服务(如要使用推送功能,勾选「Push Notifications」)
  • 点击 continue -> 点击 submit -> 点击 done,申请 App IDs 完成。点击 All IDs 可查看申请的 ID,点击该 ID
  • 点击对应名称可对该 App ID 进行编辑
fe
  • 一、先把整套体系理顺
    • 1.1 App ID
    • 1.2 开发者证书
    • 1.3 推送证书
    • 1.4 配置文件(Provisioning Profiles)
  • 二、账号先选对再动手
  • 三、创建 CSR 文件(证书请求文件)
  • 四、创建 App ID
  • 五、创建开发者证书和推送证书
  • 六、推送证书导出 p12
  • 七、创建配置文件(Provisioning Profiles)
  • 八、几个高频报错的定位思路
  • 总结
  • 参考

← React Native iOS 打包发布全流程 从离线 bundle 到内测分发React Native原理浅析从JavaScriptCore到Bridge →