概念介绍
1.Certificate
证书是用来给应用程序签名的,只有经过签名的应用程序才能保证它的来源是可信任的。在 Xcode Build Setting 的 Code Signing Identity 中,你可以设置用于为代码签名的证书。
众所周知,我们申请一个 Certificate 之前,需要先申请一个 Certificate Signing Request (CSR) 文件,而这个过程中实际上是生成了一对公钥和私钥,保存在你 Mac 的 Keychain 中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。如下图所示,在你 Mac 的 keychain 的 Login 中存储着相关的公钥和私钥,而证书中包含了公钥。你只能用私钥来进行签名,所以如果没有了私钥,就意味着你不能进行签名了,所以就无法使用这个证书了,此时你只能 revoke 之前的证书再申请一个。因此在申请完证书时,最好导出并保存好你的私钥。当你想与其他人或其他设备共享证书时,把私钥传给它就可以了。私钥保存在你的 Mac 中,而苹果生成的 Certificate 中包含了公钥。当你用自己的私钥对代码签名后,苹果就可以用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等。
![66560-68664d13d33664e6.png](https://i-blog.csdnimg.cn/blog_migrate/72e814ef256665cfd044c7ab24c8d534.png)
证书主要分为两类:Development 和 Production,Development 证书用来开发和调试应用程序,Production 主要用来分发应用程序(根据证书种类有不同作用)。
2.App ID
App ID 用于标识一个或者一组 App,App ID 和 Xcode中的 Bundle ID 是一致的或者匹配的。App ID 主要有以下两种:
- Explicit App ID: 唯一的 App ID,这种 App ID 用于唯一标识一个应用程序,例如 com.ABC.demo1,标识 Bundle ID 为 com.ABC.demo1 的程序。
- Wildcard App ID: 通配符App ID,用于标识一组应用程序。例如 * 可以表示所有应用程序,而 com.ABC.* 可以表示以com.ABC 开头的所有应用程序。
每创建一个 App ID,我们都可以设置该 App ID 所使用的 APP Services,也就是其所使用的额外服务。每种额外服务都有着不同的要求,例如,如果要使用 Apple Push Notification Services,则必须是一个 explicit App ID,以便能唯一标识一个应用程序。下图显示了所有可选的服务:
![66560-61f9fa896082cdff.png](https://i-blog.csdnimg.cn/blog_migrate/9e0d37c12feb3ecb39f92e64fd9e6fad.png)
3.Device
Devices 中包含了该账户中所有可用于开发和测试的设备,每台设备使用 UDID 来唯一标识。每个账户中的设备数量限制是 100 个。
4.Provisioning Profile
一个 Provisioning Profile 文件包含了上述的所有内容:证书、App ID、设备。
如果我们要打包或者在真机上运行一个应用程序:
我们首先需要证书来进行签名,用来标识这个应用程序是合法的、安全的、完整的等等;
然后需要指明它的 App ID,并且验证 Bundle ID 是否与其一致;
再次,如果是真机调试,需要确认这台设备能否用来运行程序。
Provisioning Profile 把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用,这样我们只要在不同的情况下选择不同的 profile 文件就可以了。而且这个 Provisioning Profile 文件会在打包时嵌入 .ipa 的包里。
如下图所示,一个用于 Development 的 Provisioning Profile 中包含了该 Provisioning Profile 对应的 App ID,可使用的证书和设备。这意味着使用这个 Provisioning Profile 打包程序必须拥有相应的证书,并且是将 App ID 对应的程序运行到 Devices 中包含的设备上去。
![66560-3c93e0fcc6bcc9d9.png](https://i-blog.csdnimg.cn/blog_migrate/aed099121dd418d6ef83c6288c9b1e48.png)
在一台设备上运行应用程序的过程如下:
![66560-7d0f96aba34fea29.png](https://i-blog.csdnimg.cn/blog_migrate/ce141a6ff12203a527c535d57bc2c0a9.png)
与证书一样,Provisioning Profile 也分为 Development 和 Distribution 两种:
- Development
- Distribution
- In House
- Ad Hoc
- App Store
In House 与 Ad Hoc 的不同之处在于:In House 没有设备数量限制,而 Ad Hoc 是用来测试用的,Ad Hoc 的包只能运行在该账户内已登记的可用设备上,有最多 100 个设备的数量限制。所以这两种 Provisioning Profile 文件的区别就在于其中的设备限制不一样而已,而它们所使用的 Certificate 是相同的。
开发/发布流程
了解了上面的概念,再来看开发及发布流程就非常简单了。
1.开发/真机调试流程
根据上面的介绍,可以知道进行 Development 主要有以下几个步骤:
- 申请证书
- 加入设备
- 生成Provisioning Profile
- 设置Xcode Code Sign Identifer
事实上第三步通常是不需要的,因为我们通常都是用 Xcode 生成和管理的 iOS Team Provisioning Profile 来进行开发,因为它非常方便,所以不需要自己手动生成 Provisioning Profile。
iOS Team Provisioning Profile 是第一次使用 Xcode 添加设备时,Xcode 自动生成的,它包含了 Xcode 生成的一个 Wildcard App ID(* ,匹配所有应用程序),账户里面所有的 Devices 和所有 Development Certificates,如下图所示。因此,team 中的所有成员都可以使用这个 iOS Team Provisioning Profile 在 team 中的所有设备上调试所有的应用程序。并且当有新设备添加进来时,Xcode 会更新这个文件。
![66560-2ae00b1afbaa539a.png](https://i-blog.csdnimg.cn/blog_migrate/6b0b95ab95d8db50bb109adcd7b8adbb.png)
2.发布流程
网上有很多关于发布 App Store 的流程,我就不缀述了,不过根据上面的概念介绍,不管是 App Store、In-House 还是 Ad-Hoc,打包流程都是差不多的,都包括了以下几个关键步骤:
- 创建发布证书
- 创建 App ID
- 创建对应的 Provisioning Profile 文件
- 设备 Bundle ID 和 App ID 一致
- 设置 Xcode Code Sign Identifer,选择合适的 Profile 和证书进行签名,打包。