到這個月,參加工作正好一年,期間忙于各種需求,雖說業(yè)務(wù)熟悉了,但是技術(shù)方面還是有待提高,尤其對證書那一塊不太熟悉,寫下這篇博客主要還是自己學(xué)習(xí)過程中的一些記錄。
主要是一些概念的解釋:
1. bundle ID?
bundle ID是用來唯一標識一個app的字符串,bundle ID不論是在開發(fā)過程中還是在app上架發(fā)布之后都會用到,例如,當你的app使用Game Center 或 In-App Purchase(應(yīng)用內(nèi)購買)等某些服務(wù)時,這些服務(wù)就會用bundle ID當做唯一標識符去識別。手機里的偏好設(shè)置也是用bundle ID來區(qū)分每個app從而對不同的app應(yīng)用不同的設(shè)置。類似的,Launch Services會用bundle ID去判斷一個app是否能夠打開某個特定的文件。bundle ID也同樣被用來驗證一個app的簽名。
bundle ID一般是反向域名(reverse-DNS format)的格式,比如,你的公司域名是abc.com,你創(chuàng)建了一個app叫hello,那么你可以設(shè)置你的app的bundle ID為com.abc.hello。
在開發(fā)的過程中,你會在許多地方用到bundle ID:
1> 在Xcode project中,bundle ID被存儲在Info.plist中。當你編譯你的項目的時候,這個文件將會被拷貝進你的app bundle 中。
2> 在iTunes Connect中,bundle ID被用來識別你的app,當你向iTunes Connect的提交過一次之后,bundle ID就不能修改了。
3> 在developer account中,Xcode會創(chuàng)建一個匹配bundle ID 的APP ID,如果這個APP ID是一個explicit App ID(唯一的APP ID,這里后面會說到),那么這個APP ID 應(yīng)該是和bundle ID完全一樣的(需要注意的是,bundle ID是區(qū)分大小寫的,所以如果這個explicit App ID全是小寫的,對應(yīng)的bundle ID也應(yīng)該是全小寫的)
4> 在iCloud中,你在Xcode中指定的container ID就是基于bundle ID創(chuàng)建的。

APP ID是用來標識單個development team(開發(fā)組)中一個或一組app的字符串。它由兩部分組成,Team ID和bundle ID search string(這里可以理解為就是某個app的bundle ID),中間由 . 連接。Team ID是由蘋果提供的,對每一個development team(開發(fā)組)是唯一的,bundle ID則是由開發(fā)者自己指定的。

APP ID分為2種:
Explicit App ID:唯一的App ID,這種App ID用于唯一標識一個應(yīng)用程序,例如com.ABC.demo1,標識Bundle ID為com.ABC.demo1的程序。
Wildcard App ID:通配符App ID,用于標識一組應(yīng)用程序。例如*可以表示所有應(yīng)用程序,而com.ABC.*可以表示以com.ABC開頭的所有應(yīng)用程序。
服務(wù)是與App ID相關(guān)的。每創(chuàng)建一個App ID,我們都可以設(shè)置該App ID所使用的APP Services,也就是其所使用的額外服務(wù)。每種額外服務(wù)都有著不同的要求,例如,如果要使用Apple Push Notification Services,則必須是一個explicit App ID,以便能唯一標識一個應(yīng)用程序。下面是一些可選的服務(wù)和相應(yīng)的配置要求。

3. Code signing
簡單來說就是運用加密技術(shù)對app或者安裝包進行簽名,從而保證該app的來源是可信任的,并且代碼是完整的, 未經(jīng)修改的。一個app如果想要在設(shè)備上運行,使用某些額外服務(wù),發(fā)布到應(yīng)用商店都需要被Code signing。Code signing后,app就被這個簽名保護著,因為只要這個app的代碼被改動了,這個簽名將會失效,手機系統(tǒng)將無法確認這個app是可信任的,那這個app將無法被啟動。(需要注意的是,像圖片或者nib文件這類的資源將不會被簽名,所以這些文件的改動將不會導(dǎo)致簽名失效)
4. certificate
證書是用來給應(yīng)用程序簽名的,只有經(jīng)過簽名的應(yīng)用程序才能保證他的來源是可信任的,并且代碼是完整的, 未經(jīng)修改的。在Xcode Build Setting的Code Signing Identity中,你可以設(shè)置用于為代碼簽名的證書。
我們申請一個Certificate之前,需要先申請一個Certificate Signing Request (CSR) 文件,而這個過程中實際上是生成了一對公鑰和私鑰,保存在你Mac的Keychain中。代碼簽名正是使用這種基于非對稱秘鑰的加密方式,用私鑰進行簽名,用公鑰進行驗證。如下圖所示,在你Mac的keychain的login中存儲著相關(guān)的公鑰和私鑰,而證書中包含了公鑰。你只能用私鑰來進行簽名,所以如果沒有了私鑰,就意味著你不能進行簽名了,所以就無法使用這個證書了,此時你只能revoke之前的證書再申請一個。因此在申請完證書時,最好導(dǎo)出并保存好你的私鑰。當你想與其他人或其他設(shè)備共享證書時,把私鑰傳給它就可以了。私鑰保存在你的Mac中,而蘋果生成的Certificate中包含了公鑰。當你用自己的私鑰對代碼簽名后,蘋果就可以用證書中的公鑰來進行驗證,確保是你對代碼進行了簽名,而不是別人冒充你,同時也確保代碼的完整性等。

certificate主要分為2類:
Development certificates:開發(fā)證書,用來開發(fā)和調(diào)試應(yīng)用程序,對應(yīng)著一個development team中的某一個成員
Distribution certificates:發(fā)布證書,主要用來分發(fā)應(yīng)用程序(根據(jù)證書種類有不同作用),對應(yīng)著一個development team(開發(fā)組)
一個development team中所有的成員都能創(chuàng)建自己的開發(fā)證書,但是只有team agent或者team admin可以創(chuàng)建發(fā)布證書。
5.Device
Device就是運行iOS系統(tǒng)用于開發(fā)調(diào)試app的設(shè)備, 每臺設(shè)備使用UDID來唯一標識。Apple Member Center 網(wǎng)站個人賬號下的 Devices 中包含了注冊過的所有可用于開發(fā)和測試的設(shè)備,普通個人開發(fā)賬號每年累計最多只能注冊100個設(shè)備。Disable 一臺設(shè)備也不會增加名額,只能在membership year 開始的時候才能通過刪除設(shè)備來增加名額。
6.Provisioning Profile
Provisioning是配置一個app可以運行在哪些設(shè)備上,可以使用哪些服務(wù),用哪張證書簽名的過程,這個過程最后產(chǎn)生的文件,就叫做Provisioning Profile(配置文件)。
一個Provisioning Profile文件包含了:證書、App ID、設(shè)備。
試想一下,如果我們要打包或者在真機上運行一個應(yīng)用程序,我們首先需要證書來進行簽名,用來標識這個應(yīng)用程序是合法的、安全的、完整的等等;然后需要指明它的App ID,并且驗證Bundle ID是否與其一致;再次,如果是真機調(diào)試,需要確認這臺設(shè)備能否用來運行程序。而Provisioning Profile就把這些信息全部打包在一起,方便我們在調(diào)試和發(fā)布程序打包時使用,這樣我們只要在不同的情況下選擇不同的profile文件就可以了。
例如,如下圖所示,一個Provisioning Profile中包含了該Provisioning Profile對應(yīng)的App ID,可使用的證書和設(shè)備。這意味著使用這個Provisioning Profile打包程序必須擁有相應(yīng)的證書,并且是將App ID對應(yīng)的程序運行到Devices中包含的設(shè)備上去。

與證書一樣,Provisioning Profile也分為Development和Distribution兩種。
當你build你的程序時,Provisioning Profile會嵌入app bundle中,而整個bundle又是被Code signing簽名過的。在一個app第一次運行在某個設(shè)備上之前,嵌入在其中的配置文件會先在該設(shè)備上安裝,如果這個配置文件不滿足某些特定的條件,這個app將不會被啟動,這些特定條件大概如下圖:

參考:
1.https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html#//apple_ref/doc/uid/TP40012582-CH31-SW6
2. http://blog.it985.com/11375.html
3.https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppStoreDistributionTutorial/CreatingYourTeamProvisioningProfile/CreatingYourTeamProvisioningProfile.html#//apple_ref/doc/uid/TP40013839-CH33-SW1