背景
首先来点背景——为什么会有「签名」。
1970年代,在Unix上运行program/软件,不需要额外获取权限,就能访问系统的硬件、数据(因为程序是自己写的——你应该不会给自己电脑「下毒」)。
后来,第三方软件出现,出于安全原因,需要对第三方软件的权限做出限制(请求同意后才能获取权限)——你应该不想出现这种情况:别人开发的软件,在不经你同意的情况下,读取了你D盘「Cooking」文件夹里面《第一次做鸭的经历》这个文件——虽然你的鸭做得真的很好。
所以,为了解决上面这个问题,Apple的工程师,想到的解决方案是App Sandbox——就是把第三方软件框在一个盒子里,想要用你的硬件(摄像头、麦克风),或者访问你的数据,都要经过你的同意。
这个看这张图:
「RW APP」就表示第三方软件,黄色区域就是Sanbox,左边就是你电脑的一些资源——第三方软件在经过你同意后,才能访问。
而今天讨论的「签名」,就隐藏在右边的「Provisioning Profile」,这个术语,这里就不作翻译了,后面会介绍定义。
术语
这里涉及几个术语:App ID,Entitlement,Certificate,Provisioning Profile
先看一张图:
App ID
是你的App在苹果平台上的唯一识别码。并通过这个App ID,和你的开发团队绑定在一起。(App ID
,Bundle ID
,Identifier
,可以当作是同一样东西)
如图所述,它回答的问题是:Who are you?
Entitlement
Xcode中点击Capability
的+
按钮,会增加一个entitlements
后缀的文件。
(这里的Entitlement
,Capability
,Capabilities
,可以简单看做是同一样东西)
也可以看作是「permission」的同义词。
这些文件,描述了你的App要访问哪些系统资源。如图所示,就是「你想干嘛」—— What do you want to do?
注意,在操作层面,Entitlement是App ID的一部分,因为在苹果开发者网站中,你想修改Entitlement,就是去到修改Identifier的地方:
另外,如果修改了这里的Entitlement,就需要重新生成「Provisioning Profile」去打包。
Certificate
我们常说的「证书」,用于确认开发者的身份。回答问题:Can I trust you?
常用的是两种类型:
- Development:你用Xcode跑App到真机,用的就是这个「开发证书」。因为开发者很多,所以可以有很多的「Development Certificate」
- Distribution:打包上传到App Store,用的就是这个「打包证书」。有一定权限才能生成、使用这个证书,所以不是每个开发者都能打包App。
证书有1年的有效期,过期了,「Provisioning Profile」也就用不了了。
Provisioning Profile
「 Provisioning Profile」将上述的3样东西,整合在一起,让你可以打包你的App。
注意,如果是用Ad Hoc这种发布方式,Provisioning Profile里面还会包含一个额外的Device List——哪些设备能安装这个App。
Ad Hoc是Apple提供的一种内部分发方式,主要是方便小规模的(内部)测试。
除了发布到App Store,苹果还提供了以下5种非公开的「内部」分发方式:
- Personal Team distribution:就是你自己用Xcode安装App到真机
- Ad hoc distribution:只能装100台机器,而且「Provisioning Profile」要包含一个能安装App的设备列表——换言之,你需要在打包前取得所有安装手机的UDID。
- TestFlight:内部100,外部1万——更强大的分发、测试App的方式
- In-house distribution:大企业的内部分发
- Custom App Distribution:后出的非公开分发方式,和TestFlight,App Store Connect整合,推荐大企业使用。
(签名)打包
下面演示两种分发方式:「App Store发布」和「Ad Hoc发布」
App Store发布
一些额外的术语
- CSR(Certificate Signing Request):
- 用Mac的Keychain Access这个软件,生成的「
.certSigningRequest
」文件 - 里面包含了「公钥」、「私钥」、「证书/Certificate」
- 上传到苹果开发者网站,让苹果「签名」,就会得到一个
.cert
文件。这样就能确认你的身份了(下载后双击安装)
- 用Mac的Keychain Access这个软件,生成的「
黑框部分,是「发布证书」的生成,解决的是上述的「Can I trust you」这个问题。
黄框部分的Entitlement,解决的是上述「What do you want to do」这个问题。
红框部分,就是将「发布证书」、「App ID」(提前创建好的)、「Entitlement」这3个东西整合在一起,生成「App Store」类型的「Provisioning Profile」
蓝框部分:打包、上传了——利用Xcode得Archive & Upload
Ad Hoc发布
粉色框部分:因为Ad Hoc只能分发到特定手机,所以要到开发者网站,注册要安装App的手机(需要拿到手机的UDID)
黑框部分,是「发布证书」,因为上面「App Store发布」的时候,已经创建过「发布证书」了,这里可以用同样的「发布证书」,无需再重复创建。
红框部分,就是将「发布证书」、「App ID」(提前创建好的)、「Entitlement」、「Device List」这4个东西整合在一起,生成「Ad Hoc」类型的「Provisioning Profile」(和「App Store」类型会有些许差异)
蓝框部分:打包、导出ipa文件——利用Xcode得Archive & Upload。然后ipa文件,可以手动安装到手机,也可以上传到第三方平台(DeployGate, 蒲公英 etc),进行「无线安装」。或者自建服务器也可以。
毕。
下回预告:《Build Settings的那些破事儿》