iOS 开发-Certificate、App ID和Provisioning Profile之间的关系

模拟器调试的时候有的时候不能检验出程序在真实手机上的差异,若是须要进行真机测试或者发布应用到App Store上去的时候, 公司若是没有开发过App,你能够从头开始弄,大部分都是后来接手的,那么当咱们进入https://developer.apple.com/account/ios/profile/profileList.action网站的时候咱们可能会有一些迷茫,会看到以下图片"
ios

能够很容易的发现这样的几个东西。xcode

 

Devices是设备,不须要解释,每一个开发者帐号能够关联100台设备,能够经过xcode直接添加你的设备,Certificate、App  ID和Provisioning Profile不是那么好理解。 安全

Certificate(证书)

证书是你有权利开发的凭证,是开发者的一种标识,至关于身份证,一个开发者帐号只有一套。一套含两个,Development和Distribution(也就是Production)。app

其中Development证书提供开发者在电脑上真机调试的权限,能够制做多个副本分发到多台电脑。测试

Distribution证书给开发者提供发布ios程序的权限,也就是说有了这个,你就有权力发布程序到App Store去了。只有一个,不能制做副本分发到多台电脑。网站

下面是证书的分类信息:(括号内为证书有效期)加密

  • Development
    • App Development (1年):用来开发和真机调试应用程序。
    • Push Development (1年):用来调试Apple Push Notification
  • Production
    • In-House and Ad Hoc (3年):用来发布In-House和AdHoc的应用程序。spa

    •  

         App Store :用来发布提交App Store的应用程序。
    • MDM CSR
    • Push Production (1年):用来在发布版本中使用Apple Push Notification。
    • Pass Type ID Certificate
    • Website Push ID Certificate

申请一个Certificate以前,须要先申请一个Certificate Signing Request (CSR) 文件,而这个过程当中其实是生成了一对公钥和私钥,保存在你Mac的Keychain中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。以下图所示,在你Mac的keychain的login中存储着相关的公钥和私钥,而证书中包含了公钥。你只能用私钥来进行签名,因此若是没有了私钥,就意味着你不能进行签名了,因此就没法使用这个证书了,此时你只能revoke以前的证书再申请一个。所以在申请完证书时,最好导出并保存好你的私钥。当你想与其余人或其余设备共享证书时,把私钥传给它就能够了。私钥保存在你的Mac中,而苹果生成的Certificate中包含了公钥。当你用本身的私钥对代码签名后,苹果就能够用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等。 调试

 

App ID

 App ID用于标识一个或者一组App,App ID应该是和Xcode中的Bundle ID是一致的或者匹配的。App ID主要有如下两种: code

  • Explicit App ID:惟一的App ID,这种App ID用于惟一标识一个应用程序,例如com.cnblogs.keso,标识Bundle ID为com.cnblogs.keso的程序。
  • Wildcard App ID:通配符App ID,用于标识一组应用程序。例如*能够表示全部应用程序,而com.ABC.*能够表示以com.ABC开头的全部应用程序。

 每建立一个App ID,咱们均可以设置该App ID所使用的APP Services,也就是其所使用的额外服务。每种额外服务都有着不一样的要求,例如,若是要使用Apple Push Notification Services,则必须是一个explicit App ID,以便能惟一标识一个应用程序。下面是目前全部可选的服务和相应的配置要求。

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中包含的设备上去。

如上所述,在一台设备上运行应用程序的过程以下:

与证书同样,Provisioning Profile也分为Development和Distribution两种:

(注:前面提到不一样帐户类型所能建立的证书种类不一样,显然Profile文件的种类是和你所能建立的证书种类相关的)

  • Development (1年)
  • Distribution (1年)
    • In House
    • Ad Hoc
    • App Store

In House 与Ad Hoc的不一样之处在于:In House没有设备数量限制,而Ad Hoc是用来测试用的,Ad Hoc的包只能运行在该帐户内已登记的可用设备上,显然是有最多100个设备的数量限制。因此这两种Provisioning Profile文件的区别就在于其中的设备限制不同而已,而他们所使用的Certificate是相同的。

 开发/发布流程

 进行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会更新这个文件。