Certificates & Identifiers & Provisioning Profiles

轉(zhuǎn)自>曾夢(mèng)想仗劍走天涯?

引言

? ? ? ? 關(guān)于開發(fā)證書配置(Certificates & Identifiers & Provisioning Profiles)相信做iOS開發(fā)的同學(xué)沒少被折騰。對(duì)于一個(gè)iOS開發(fā)小白、半吊子(比如像我自己)抑或老兵或多或少會(huì)有或曾有過以下不詳、疑問、疑惑甚至困惑:

  1. 什么是App ID?Explicit/Wildcard App ID有何區(qū)別?什么是App Group ID?
  2. 什么是證書(Certificate)?如何申請(qǐng)?有啥用?
  3. 什么是Key Pair(公鑰/私鑰)?有啥用?與證書有何關(guān)聯(lián)?
  4. 什么是簽名(Signature)?如何簽名(CodeSign)?怎樣校驗(yàn)(Verify)?
  5. 什么是(Team)Provisioning Profiles?有啥用?
  6. Xcode如何配置才能使用iOS真機(jī)進(jìn)行開發(fā)調(diào)試?
  7. 多臺(tái)機(jī)器如何共享開發(fā)者賬號(hào)或證書?
  8. 遇到證書配置問題怎么辦?

本文將圍繞相關(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ā)者身份信息的CSRCertificate 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(0unlimited)。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 IDXcode3.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ī)范:

  1. 置于同一App Group下的App IDs必須是唯一的(Explicitnot Wildcard)
  2. 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 coderesources 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 ProfileCode 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

iOS發(fā)布遇到的一些問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評(píng)論 3 417
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,761評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,678評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,978評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容