轉(zhuǎn)自>曾夢(mèng)想仗劍走天涯?
引言
? ? ? ? 關(guān)于開發(fā)證書配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS開發(fā)的同學(xué)沒少被折騰。對(duì)于一個(gè)iOS開發(fā)小白、半吊子(比如像我自己)抑或老兵,或多或少會(huì)有或曾有過以下不詳、疑問、疑惑甚至困惑:
- 什么是App ID?Explicit/Wildcard App ID有何區(qū)別?什么是App Group ID?
- 什么是證書(Certificate)?如何申請(qǐng)?有啥用?
- 什么是Key Pair(公鑰/私鑰)?有啥用?與證書有何關(guān)聯(lián)?
- 什么是簽名(Signature)?如何簽名(CodeSign)?怎樣校驗(yàn)(Verify)?
- 什么是(Team)Provisioning Profiles?有啥用?
- Xcode如何配置才能使用iOS真機(jī)進(jìn)行開發(fā)調(diào)試?
- 多臺(tái)機(jī)器如何共享開發(fā)者賬號(hào)或證書?
- 遇到證書配置問題怎么辦?
本文將圍繞相關(guān)概念做個(gè)系統(tǒng)的梳理串燒。
寫在前面
1.假設(shè)你使用過Apple設(shè)備(iMac/iPad/iPhone)且注冊(cè)過Apple ID(Apple Account)。
2.假設(shè)你或你所在的開發(fā)組已加入蘋果開發(fā)者計(jì)劃(Enroll in iOS Developer Program to become a member),即已注冊(cè)開發(fā)者賬號(hào)(Apple Developer Account)。
- 只有擁有開發(fā)者賬號(hào),才可以申請(qǐng)開發(fā)/發(fā)布證書及相關(guān)配置授權(quán)文件,進(jìn)而在iOS真機(jī)上開發(fā)調(diào)試Apps或發(fā)布到App Store。
- 開發(fā)者賬號(hào)分為Individual和Company/Organization兩種類型。如無特別交代,下文基于$99/Year的普通個(gè)人開發(fā)者(Individual)賬號(hào)展開。
3.若要真機(jī)調(diào)試實(shí)踐,你必須至少擁有一臺(tái)裝有Mac OS X/Xcode的Mac開發(fā)機(jī)(iMac or MacBook),其上自帶原生的Keychain Access。
一.App ID(bundle identifier)
App ID即Product ID,用于標(biāo)識(shí)一個(gè)或者一組App。
App ID應(yīng)該和Xcode中的Bundle Identifier是一致(Explicit)的或匹配(Wildcard)的。
App ID字符串通常以反域名(reverse-domain-name)格式的Company Identifier(Company ID)作為前綴(Prefix/Seed),一般不超過255個(gè)ASCII字符。
App ID全名會(huì)被追加Application Identifier Prefix(一般為TeamID.),分為兩類:
- Explicit App ID:唯一的App ID,用于唯一標(biāo)識(shí)一個(gè)應(yīng)用程序。例如“com.apple.garageband”這個(gè)App ID,用于標(biāo)識(shí)Bundle Identifier為“com.apple.garageband”的App。
- Wildcard App ID:含有通配符的App ID,用于標(biāo)識(shí)一組應(yīng)用程序。例如“*”(實(shí)際上是Application Identifier Prefix)表示所有應(yīng)用程序;而“com.apple.*”可以表示Bundle Identifier以“com.apple.”開頭(蘋果公司)的所有應(yīng)用程序。
用戶可在網(wǎng)站上刪除(Delete)已注冊(cè)的App IDs。
App ID被配置到【XcodeTarget|Info|Bundle Identifier】下;對(duì)于Wildcard App ID,只要bundle identifier包含其作為Prefix/Seed即可。
二.設(shè)備(Device)
Device就是運(yùn)行iOS系統(tǒng)用于開發(fā)調(diào)試App的設(shè)備。每臺(tái)Apple設(shè)備使用UDID來唯一標(biāo)識(shí)。
iOS設(shè)備連接Mac后,可通過iTunes->Summary或者Xcode->Window->Devices獲取iPhone的UDID(identifier)。
Apple Member Center網(wǎng)站個(gè)人賬號(hào)下的Devices中包含了注冊(cè)過的所有可用于開發(fā)和測試的設(shè)備,普通個(gè)人開發(fā)賬號(hào)每年累計(jì)最多只能注冊(cè)100個(gè)設(shè)備。
- Apps signed by you or your team run only on designated development devices.
- Apps run only on the test devices you specify.
用戶可在網(wǎng)站上啟用/禁用(Enable/Disable)已注冊(cè)的Device。
本文的Devices即連接到Xcode被授權(quán)用于開發(fā)測試的iOS設(shè)備(iPhone/iPad)。
三.開發(fā)證書(Certificates)
1.證書的概念
證書是由公證處或認(rèn)證機(jī)關(guān)開具的證明資格或權(quán)力的證件,它是表明(或幫助斷定)事理的一個(gè)憑證。
每個(gè)中國人一生可能需要70多個(gè)證件,含15種身份證明。證件中“必需的”有30到40個(gè)。將這些證件按時(shí)間順序鋪開,那就是一個(gè)天朝子民的一生——持準(zhǔn)生證許可落地,以戶籍證明入籍,以身份證認(rèn)證身份,持結(jié)婚證以合法同居,最終以死亡證明注銷。
2.數(shù)字證書的概念
數(shù)字證書就是互聯(lián)網(wǎng)通訊中標(biāo)志通訊各方身份信息的一串?dāng)?shù)字,提供了一種在Internet上驗(yàn)證通信實(shí)體身份的方式,其作用類似于司機(jī)的駕駛執(zhí)照或日常生活中的身份證。它是由一個(gè)由權(quán)威機(jī)構(gòu)——CA機(jī)構(gòu),又稱為證書授權(quán)(Certificate Authority)中心發(fā)行的,人們可以在網(wǎng)上用它來識(shí)別對(duì)方的身份。
- 數(shù)字證書是一個(gè)經(jīng)證書授權(quán)中心數(shù)字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個(gè)公開密鑰、名稱以及證書授權(quán)中心的數(shù)字簽名。
- 數(shù)字證書還有一個(gè)重要的特征就是時(shí)效性:只在特定的時(shí)間段內(nèi)有效。
某一認(rèn)證領(lǐng)域內(nèi)的根證書是CA認(rèn)證中心給自己頒發(fā)的證書,是信任鏈的起始點(diǎn)。安裝根證書意味著對(duì)這個(gè)CA認(rèn)證中心的信任。
在天朝子民的一生中,戶籍證明可理解為等效的根證書:有了戶籍證明,才能辦理身份證;有了上流的身份證,才能辦理下游居住證、結(jié)婚證、計(jì)劃生育證、駕駛執(zhí)照等認(rèn)證。
3.iOS(開發(fā))證書
iOS證書是用來證明iOS App內(nèi)容(executable code)的合法性和完整性的數(shù)字證書。對(duì)于想安裝到真機(jī)或發(fā)布到AppStore的應(yīng)用程序(App),只有經(jīng)過簽名驗(yàn)證(Signature Validated)才能確保來源可信,并且保證App內(nèi)容是完整、未經(jīng)篡改的。
iOS證書分為兩類:Development和Production(Distribution)。
- Development證書用來開發(fā)和調(diào)試應(yīng)用程序:A?development certificate?identifies you, as a team member, in a development provisioning profile that allows apps signed by you to?launch?on devices.?
- Production主要用來分發(fā)應(yīng)用程序(根據(jù)證書種類有不同作用):A?distribution certificate?identifies your team or organization in a distribution provisioning profile and allows you to?submit ?your app to the store. Only a team agent or an admin can create a distribution certificate.
普通個(gè)人開發(fā)賬號(hào)最多可注冊(cè)iOS Development/Distribution證書各2個(gè),用戶可在網(wǎng)站上刪除(Revoke)已注冊(cè)的Certificate。下文主要針對(duì)開發(fā)調(diào)試階段的Development證書。
下文主要針對(duì)iOS App開發(fā)調(diào)試過程中的開發(fā)證書(Certificate for Development)。
4.iOS(開發(fā))證書的根證書
那么,iOS開發(fā)證書是誰頒發(fā)的呢?或者說我們是從哪個(gè)CA申請(qǐng)到用于Xcode開發(fā)調(diào)試的證書呢?
iOS以及Mac OS X系統(tǒng)(在安裝Xcode時(shí))將自動(dòng)安裝AppleWWDRCA.cer這個(gè)中間證書(Intermediate Certificates),它實(shí)際上就是iOS(開發(fā))證書的證書,即根證書(Apple Root Certificate)。
AppleWWDRCA(Apple Root CA)類似注冊(cè)管理戶籍的公安機(jī)關(guān)戶政管理機(jī)構(gòu),AppleWWDRCA.cer之于iOS(開發(fā))證書則好比戶籍證之于身份證。
如果Mac Keychain Access證書助理在申請(qǐng)證書時(shí)尚未安裝過該證書,請(qǐng)先下載安裝(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)。
![]()
5.申請(qǐng)證書(CSR:Certificate Signing Request)
可以在缺少證書時(shí)通過Xcode Fix Issue自動(dòng)請(qǐng)求證書,這里通過Keychain證書助理從證書頒發(fā)機(jī)構(gòu)請(qǐng)求證書:填寫開發(fā)賬號(hào)郵件和常用名稱,勾選【存儲(chǔ)到磁盤】。
![]()
keychain將生成一個(gè)包含開發(fā)者身份信息的CSR(Certificate Signing Request)文件;同時(shí),Keychain Access|Keys中將新增一對(duì)Public/Private?Key Pair(This?signing identity?consists of a public-private key pair that Apple issues)。
![]()
private key始終保存在Mac OS的Keychain Access中,用于簽名(CodeSign)對(duì)外發(fā)布的App;public key一般隨證書(隨Provisioning Profile,隨App)散布出去,對(duì)App簽名進(jìn)行校驗(yàn)認(rèn)證。用戶必須保護(hù)好本地Keychain中的private key,以防偽冒。
- Keep a secure backup of your public-private key pair. If the private key is lost, you’ll have to create an?entirely new identity to sign code.?
- Worse, if someone else has your private key, that person may be able to?impersonate?you.
在Apple開發(fā)網(wǎng)站上傳該CSR文件來添加證書(Upload CSR file to generate your certificate):
![]()
Apple證書頒發(fā)機(jī)構(gòu)WWDRCA(Apple Worldwide Developer Relations Certification Authority)將使用private key對(duì)CSR中的public key和一些身份信息進(jìn)行加密簽名生成數(shù)字證書(ios_development.cer)并記錄在案(Apple Member Center)。
![]()
從Apple?Member Center網(wǎng)站下載證書到Mac上雙擊即可安裝(當(dāng)然也可在Xcode中添加開發(fā)賬號(hào)自動(dòng)同步證書和[生成]配置文件)。證書安裝成功后,在KeychainAccess|Keys中展開創(chuàng)建CSR時(shí)生成的Key Pair中的私鑰前面的箭頭,可以查看到包含其對(duì)應(yīng)公鑰的證書(Your requested certificate will be the public half of the key pair.);在Keychain Access|Certificates中展開安裝的證書(ios_development.cer)前面的箭頭,可以看到其對(duì)應(yīng)的私鑰。
![]()
![]()
Certificate被配置到【Xcode?Target|Build Settings|Code Signing|Code Signing Identity】下,下拉選擇Identities from Profile "..."(一般先配置Provisioning Profile)。以下是Xcode配置示例:
![]()
四.供應(yīng)配置文件(Provisioning Profiles)
1.Provisioning Profile的概念
Provisioning Profile文件包含了上述的所有內(nèi)容:證書、App ID和設(shè)備。
![]()
一個(gè)Provisioning Profile對(duì)應(yīng)一個(gè)Explicit App ID或Wildcard App ID(一組相同Prefix/Seed的App IDs)。在網(wǎng)站上手動(dòng)創(chuàng)建一個(gè)Provisioning Profile時(shí),需要依次指定App ID(單選)、證書(Certificates,可多選)和設(shè)備(Devices,可多選)。用戶可在網(wǎng)站上刪除(Delete)已注冊(cè)的Provisioning Profiles。
Provisioning Profile決定Xcode用哪個(gè)證書(公鑰)/私鑰組合(Key Pair/Signing Identity)來簽署應(yīng)用程序(Signing Product),將在應(yīng)用程序打包時(shí)嵌入到.ipa包里。安裝應(yīng)用程序時(shí),Provisioning Profile文件被拷貝到iOS設(shè)備中,運(yùn)行該iOS App的設(shè)備也通過它來認(rèn)證安裝的程序。
如果要打包或者在真機(jī)上運(yùn)行一個(gè)APP,一般要經(jīng)歷以下三步:
- 首先,需要證書對(duì)應(yīng)的私鑰來進(jìn)行簽名,用于標(biāo)識(shí)這個(gè)APP是合法、安全、完整的;
- 其次,需要指明它的App ID,并且驗(yàn)證Bundle ID是否與其一致;
- 然后,如果是真機(jī)調(diào)試,需要確認(rèn)這臺(tái)設(shè)備是否授權(quán)運(yùn)行該APP。
Provisioning Profile把這些信息全部打包在一起,方便我們?cè)谡{(diào)試和發(fā)布程序打包時(shí)使用。這樣,只要在不同的情況下選擇不同的Provisioning Profile文件就可以了。
Provisioning Profile也分為Development和Distribution兩類,有效期同Certificate一樣。Distribution版本的ProvisioningProfile主要用于提交App Store審核,其中不指定開發(fā)測試的Devices(0,unlimited)。App ID為Wildcard App ID(*)。App Store審核通過上架后,允許所有iOS設(shè)備(Deployment Target)上安裝運(yùn)行該App。
Xcode將全部供應(yīng)配置文件(包括用戶手動(dòng)下載安裝的和Xcode自動(dòng)創(chuàng)建的Team Provisioning Profile)放在目錄~/Library/MobileDevice/Provisioning Profiles下。
2.Provisioning Profile的構(gòu)成
以下為典型供應(yīng)配置文件*.mobileprovision的構(gòu)成簡析:
(1)Name:該mobileprovision的文件名。
(2)UUID:該mobileprovision文件的真實(shí)文件名。
(3)TeamName:Apple ID賬號(hào)名。
(4)TeamIdentifier:Team Identity。
(5)AppIDName:explicit/wildcard App ID name(ApplicationIdentifierPrefix)。
(6)ApplicationIdentifierPrefix:完整App ID的前綴(TeamIdentifier.*)。
(7)DeveloperCertificates:包含了可以為使用該配置文件應(yīng)用簽名的所有證書<data><array>。
證書是基于Base64編碼,符合PEM(PrivacyEnhanced Mail, RFC 1848)格式的,可使用OpenSSL來處理(opensslx509 -text -in file.pem)。
從DeveloperCertificates提取<data></data>之間的內(nèi)容到文件cert.cer(cert.perm):
-----BEGIN CERTIFICATE-----
將<data></data>之間的內(nèi)容拷貝至此
-----END CERTIFICATE-----`
Mac下右鍵QuickLook查看cert.cer(cert.perm),在Keychain Access中右鍵Get Info查看對(duì)應(yīng)證書ios_development.cer,正常情況(公私鑰KeyPair配對(duì))應(yīng)吻合;Windows下沒有足夠信息(WWDRCA.cer),無法驗(yàn)證該證書。
如果你用了一個(gè)不在這個(gè)列表中的證書進(jìn)行簽名,無論這個(gè)證書是否有效,這個(gè)應(yīng)用都將CodeSign Fail。
(8)Entitlements鍵<key>對(duì)應(yīng)的<dict>:
keychain-access-groups:$(AppIdentifierPrefix),參見Code Signing Entitlements(*.entitlements)。
每個(gè)應(yīng)用程序都有一個(gè)可以用于安全保存一些如密碼、認(rèn)證等信息的keychain,一般而言自己的程序只能訪問自己的keychain。通過對(duì)應(yīng)用簽名時(shí)的一些設(shè)置,還可以利用keychain的方式實(shí)現(xiàn)同一開發(fā)者簽證(就是相同bundle seed)下的不同應(yīng)用之間共享信息的操作。比如你有一個(gè)開發(fā)者帳戶,并開發(fā)了兩個(gè)不同的應(yīng)用A和B,然后通過對(duì)A和B的keychain access group這個(gè)東西指定共用的訪問分組,就可以實(shí)現(xiàn)共享此keychain中的內(nèi)容。
application-identifier:帶前綴的全名,例如$(AppIdentifierPrefix)com.apple.garageband。
com.apple.security.application-groups:App Group ID(group. com.apple),參見Code Signing Entitlements(*.entitlements)。
com.apple.developer.team-identifier:同Team Identifier。
(9)ProvisionedDevices:該mobileprovision授權(quán)的開發(fā)設(shè)備的UDID <array>。
Provisioning Profile被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下,然后在Code Signing Identity下拉可選擇Identities from Profile "..."(即Provisioning Profile中包含的Certificates)。
五.開發(fā)組供應(yīng)配置文件(Team Provisioning Profiles)
1.Team?Provisioning Profile的概念
每個(gè)Apple開發(fā)者賬號(hào)都對(duì)應(yīng)一個(gè)唯一的Team ID,Xcode3.2.3預(yù)發(fā)布版本中加入了Team Provisioning Profile這項(xiàng)新功能。
在Xcode中添加Apple Developer Account時(shí),它將與Apple Member Center后臺(tái)勾兌自動(dòng)生成iOS Team Provisioning Profile(Managed by Xcode)。
![]()
Team Provisioning Profile包含一個(gè)為Xcode iOS Wildcard App ID(*)生成的iOS Team Provisioning Profile:*(匹配所有應(yīng)用程序),賬戶里所有的Development Certificates和Devices都可以使用它在這個(gè)eam注冊(cè)的所有設(shè)備上調(diào)試所有的應(yīng)用程序(不管bundleidentifier是什么)。同時(shí),它還會(huì)為開發(fā)者自己創(chuàng)建的Wildcard/Explicit App IDs創(chuàng)建對(duì)應(yīng)的iOS Team Provisioning Profile。
![]()
2.Team?Provisioning Profile生成/更新時(shí)機(jī)
- Add an Apple ID account to Xcode
- Fix issue "No Provisioning Profiles with a valid signing identity" in Xcode
- Assign Your App to a Team in Xcode project settings of General|Identity
- Register new device on the apple development website or Xcode detected new device connected
利用Xcode生成和管理的iOS Team Provisioning Profile來進(jìn)行開發(fā)非常方便,可以不需要上網(wǎng)站手動(dòng)生成下載Provisioning Profile。
Team Provisioning Profile同Provisioning Profile,只不過是由Xcode自動(dòng)生成的,也被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下。
六.App Group (ID)
1.App Group的概念
WWDC14除了發(fā)布了OS X v10.10和switf外,iOS 8.0也開始變得更加開放了。說到開放,當(dāng)然要數(shù)應(yīng)用擴(kuò)展(App Extension)了。顧名思義,應(yīng)用擴(kuò)展允許開發(fā)者擴(kuò)展應(yīng)用的自定義功能和內(nèi)容,能夠讓用戶在使用其他應(yīng)用程序時(shí)使用該項(xiàng)功能,從而實(shí)現(xiàn)各個(gè)應(yīng)用程序間的功能和資源共享。可以將擴(kuò)展理解為一個(gè)輕量級(jí)(nimble and lightweight)的分身。
擴(kuò)展和其Containing App各自擁有自己的沙盒,雖然擴(kuò)展以插件形式內(nèi)嵌在Containing App中,但是它們是獨(dú)立的二進(jìn)制包,不可以互訪彼此的沙盒。為了實(shí)現(xiàn)Containing App與擴(kuò)展的數(shù)據(jù)共享,蘋果在iOS 8中引入了一個(gè)新的概念——App Group,它主要用于同一Group下的APP實(shí)現(xiàn)數(shù)據(jù)共享,具體來說是通過以App Group ID標(biāo)識(shí)的共享資源區(qū)——App Group Container。
App Group ID同App ID一樣,一般不超過255個(gè)ASCII字符。用戶可在網(wǎng)站上編輯Explicit App IDs的App Group Assignment;可以刪除(Delete)已注冊(cè)的AppGroup (ID)。
2.App Group的配置
Containing App與Extension的Explicit App ID必須Assign到同一App Group下才能實(shí)現(xiàn)數(shù)據(jù)共享,并且Containing App與Extension的App ID命名必須符合規(guī)范:
- 置于同一App Group下的App IDs必須是唯一的(Explicit,not Wildcard)
- Extension App ID以Containing App ID為Prefix/Seed
假如Garageband這個(gè)App ID為“com.apple.garageband”,則支持從語音備忘錄導(dǎo)入到Garageband應(yīng)用的插件的App ID可能形如“com.apple.garageband.extImportRecording”。
?
App(ex)
?
App Group ID
Provisioning Profile
Code Signing Identity
(Certificate Key Pair)
App ID
(bundle identifier)
Devices
(test)
GarageBand
置于同一分組:
group.com.apple
(1)共用同一證書:ios_development.cer
(2)共用證書Key Pair中的Private Key進(jìn)行CodeSign
com.apple.garageband
授權(quán)開發(fā)測試設(shè)備的UDIDs
GarageBand擴(kuò)展插件
com.apple.garageband.extImportRecording
關(guān)于Provisioning Profile,可以使用自己手動(dòng)生成的,也可以使用Xcode自動(dòng)生成的Team Provisioning Profile。
App Group會(huì)被配置到【Xcode Target|Build Settings|Code Signing|Code Signing Entitlements】文件(*.entitlements)的鍵com.apple.security.application-groups下,不影響Provisioning Profile生成流程。
七.證書與簽名(Certificate& Signature)
1.Code Signing Identity
![]()
![]()
2.Code Signing
每個(gè)證書(其實(shí)是公鑰)對(duì)應(yīng)Key Pair中的私鑰會(huì)被用來對(duì)內(nèi)容(executable code,resources such as images and nib files aren’t signed)進(jìn)行數(shù)字簽名(CodeSign)——使用哈希算法生成內(nèi)容摘要(digest)。上面已經(jīng)提到,公鑰被包含在數(shù)字證書里,數(shù)字證書又被包含在描述文件(Provisioning File)中,描述文件在應(yīng)用被安裝的時(shí)候會(huì)被拷貝到iOS設(shè)備中。
Xcode使用指定證書配套的私鑰進(jìn)行簽名時(shí)需要授權(quán),選擇【始終允許】后,以后使用該私鑰進(jìn)行簽名便不會(huì)再彈出授權(quán)確認(rèn)窗口。
![]()
3.Verify Code Signature with Certificate
![]()
iOS/Mac機(jī)上的ios_development.cer可以被AppleWWDRCA.cer中的 public key解密,從而獲取每個(gè)開發(fā)證書中可信任的公鑰。
(1).iOS/Mac設(shè)備(系統(tǒng))使用CA證書(WWDRCA.cer)來判斷App Provisioning Profile(Code Signing Identity)中的開發(fā)證書的合法性:
- 若用WWDRCA公鑰能成功解密出證書并得到公鑰(Public Key)和內(nèi)容摘要(Signature),證明此證書確乃AppleWWDRCA發(fā)布,即證書來源可信;
- 再對(duì)證書本身使用哈希算法計(jì)算摘要,若與上一步得到的摘要一致,則證明此證書未被篡改過,即證書完整。
(2).iOS/Mac設(shè)備(系統(tǒng))使用App Provisioning Profile(Code Signing Identity)中的開發(fā)證書來判斷App的合法性:
- 若用證書公鑰能成功解密出App(executable code)的內(nèi)容摘要(Signature),證明此App確乃認(rèn)證開發(fā)者發(fā)布,即來源可信;
- 再對(duì)App(executable code)本身使用哈希算法計(jì)算摘要,若與上一步得到的摘要一致,則證明此App(executable code)未被篡改過,即內(nèi)容完整。
八.在多臺(tái)機(jī)器上共享開發(fā)賬戶/證書
1.Xcode導(dǎo)出開發(fā)者賬號(hào)(*.developerprofile)或PKCS12文件(*.p12)
進(jìn)入Xcode Preferences|Accounts:
- 選中Apple IDs列表中對(duì)應(yīng)Account的的Email,點(diǎn)擊+-之后的?|Export Accounts,可導(dǎo)出包含account/code signing identity/provisioning profiles信息的*.developerprofile(Exporting a Developer Profile)文件供其他機(jī)器上的Xcode開發(fā)使用(Import該Account)。
選中右下列表中某行Account Name條目|ViewDetails,可以查看Signing Identities和Provisioning Profiles。
- 選中欲導(dǎo)出的Signing Identity條目,點(diǎn)擊欄底+之后的?|Export,必須輸入密碼,并需授權(quán)export key "privateKey" from keychain,將導(dǎo)出Certificates.p12。
點(diǎn)擊左下角的刷新按鈕可從Member Center同步該賬號(hào)下所有的Provisioning Profile到本地。
選中右擊列表中某個(gè)Provisioning Profile可以【Show in Finder】到[~/Library/MobileDevice/Provisioning\ Profiles]目錄,其中Provisioning Profile的真實(shí)名稱為$(UUID).mobileprovision,名如"2488109f-ff65-442e-9774-fd50bd6bc827.mobileprovision",其中<key>Name</key>中為Xcode中看到的描述性別名。
2.Keychain Access導(dǎo)出PKCS12文件(*.p12)
在Keychain Access|Certificates中選中欲導(dǎo)出的certificate或其下private key,右鍵Export或者通過菜單File|Export Items導(dǎo)出Certificates.p12——PKCS12 file holds the private key and?certificate。
其他Mac機(jī)器上雙擊Certificates.p12(如有密碼需輸入密碼)即可安裝該共享證書。有了共享證書之后,在開發(fā)者網(wǎng)站上將欲調(diào)試的iOS設(shè)備注冊(cè)到該開發(fā)者賬號(hào)名下,并下載對(duì)應(yīng)證書授權(quán)了iOS調(diào)試設(shè)備的Provisioning Profile文件,方可在iOS真機(jī)設(shè)備上開發(fā)調(diào)試。
九.證書配置常見錯(cuò)誤
1.no such provisioning profile was found
Xcode Target|Genera|Identity Team下提示"Your build settings specify a provisioning profile with the UUID "xxx",howerver, no such provisioning profile was found."
Xcode Target|BuildSettings|Code Signing|當(dāng)前配置的指定UDID的provisioning profile在本地不存在,此時(shí)需要更改Provisioning Profile。必要時(shí)手動(dòng)去網(wǎng)站下載或重新生成Provisioning Profile或直接在Xcode中Fix issue予以解決(可能自動(dòng)生成iOS Team ProvisioningProfile)!
2.No identities from profile
Build Settings|CodeSigning的Provisioning Profile中選擇了本地安裝的provisioning profile之后,Code Signing Identity中下拉提示No identities from profile “…”or No identities from keychain.
Xcode配置指定UDID的provisioning profile中的DeveloperCertificates在本地KeyChain中不存在(No identities are available)或不一致(KeyPair中的Private Key丟失),此時(shí)需去網(wǎng)站檢查ProvisioningProfile中的App ID-Certificate-Device配置是否正確。如果是別人提供的共享賬號(hào)(*.developerprofile)或共享證書(*.p12),請(qǐng)確保導(dǎo)出了對(duì)應(yīng)Key Pair中的Private Key。必要時(shí)也直接在Xcode中Fix issue予以解決(可能自動(dòng)生成iOS Team ProvisioningProfile)。
3.Code Signing Entitlements file do not match profile
"Invalid application-identifier Entitlement" or "Code Signing Entitlements file do not match those specified in your provisioning profile.(0xE8008016)."
(1)檢查對(duì)應(yīng)版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”鍵值是否與ProvisioningProfile中的Entitlements項(xiàng)相吻合(后者一般為前者的Prefix/Seed)。
(2)也可以將Build Settings|Code Signing的Provisioning Profile中對(duì)應(yīng)版本(Debug)的Entitlements置空。
4.Xcode配置反應(yīng)有時(shí)候不那么及時(shí),可刷新、重置相關(guān)配置項(xiàng)開關(guān)(若有)或重啟Xcode試試。
參考:
《iPhone真機(jī)調(diào)試應(yīng)用程序》《iOS Developer:真機(jī)測試》
《iOS Development--Certificates, Provisioning Profiles》
《關(guān)于Certificate、Provisioning
Profile、App ID的介紹及其關(guān)系》
《數(shù)字簽名和數(shù)字證書》《iOS keyChain 研究》
《蘋果開發(fā)者賬號(hào)那些事兒》《iOS關(guān)於Provisioning
Profiles這些事》
《iOS Code Signing 學(xué)習(xí)筆記》《代碼簽名探析/Inside Code Signing》
《iOS Code Signing: 解惑/iOS Code Signing: Under The Hood》