iOS開發(fā)各種證書問題

引言

關(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)?如何申請?有啥用?

什么是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)或證書?

遇到證書配置問題怎么辦?

Xcode 7免證書調(diào)試真機(jī)調(diào)試

本文將圍繞相關(guān)概念做個(gè)系統(tǒng)的梳理串燒。

從 Xcode 7 開始支持普通 Apple 賬號(hào)進(jìn)行免證書真機(jī)調(diào)試,詳情參考最新官方文檔《Launching Your App on Devices》,或參考本文最后一節(jié)簡介。

寫在前面

1.假設(shè)你使用過Apple設(shè)備(iMac/iPad/iPhone)且注冊過Apple ID(Apple Account)。

2.假設(shè)你或你所在的開發(fā)組已加入蘋果開發(fā)者計(jì)劃(Enroll in iOS Developer Program to become amember),即已注冊開發(fā)者賬號(hào)(Apple Developer Account)。

只有擁有開發(fā)者賬號(hào),才可以申請開發(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)用程序。

用戶可在Developer MemberCenter網(wǎng)站上注冊(Register)或刪除(Delete)已注冊的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中包含了注冊過的所有可用于開發(fā)和測試的設(shè)備,普通個(gè)人開發(fā)賬號(hào)每年累計(jì)最多只能注冊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)已注冊的Device。本文的Devices是指連接到Xcode被授權(quán)用于開發(fā)測試的iOS設(shè)備(iPhone/iPad)。

三.開發(fā)證書(Certificates)

1.證書的概念

證書是由公證處或認(rèn)證機(jī)關(guān)開具的證明資格或權(quán)力的證件,它是表明(或幫助斷定)事理的一個(gè)憑證。證件或憑證的尾部通常會(huì)烙印公章。

每個(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)有效。

數(shù)字證書中的公開密鑰(公鑰)相當(dāng)于公章。

某一認(rèn)證領(lǐng)域內(nèi)的根證書是CA認(rèn)證中心給自己頒發(fā)的證書,是信任鏈的起始點(diǎn)。安裝根證書意味著對(duì)這個(gè)CA認(rèn)證中心的信任。

為了防止GFW進(jìn)行中間人攻擊(MitM),例如篡改github證書,導(dǎo)致無法訪問github網(wǎng)站等問題,可選擇不信任CNNIC

在[鑰匙串-系統(tǒng)]中雙擊CNNIC ROOT,在【信任】|【使用此證書時(shí)】下拉選擇【永不信任】。

在天朝子民的一生中,戶籍證明可理解為等效的根證書:有了戶籍證明,才能辦理身份證;有了上流的身份證,才能辦理下游居住證、結(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)用程序:Adevelopment certificateidentifies you, as a team member, in a development provisioning profile that allows apps signed by you tolaunchon devices.

Production主要用來分發(fā)應(yīng)用程序(根據(jù)證書種類有不同作用):Adistribution certificateidentifies your team or organization in a distribution provisioning profile and allows you tosubmityour app to the store. Only a team agent or an admin can create a distribution certificate.

普通個(gè)人開發(fā)賬號(hào)最多可注冊iOS Development/Distribution證書各2個(gè),用戶可在網(wǎng)站上刪除(Revoke)已注冊的Certificate。

下文主要針對(duì)iOS App開發(fā)調(diào)試過程中的開發(fā)證書(Certificate for Development)。

4.iOS(開發(fā))證書的根證書

那么,iOS開發(fā)證書是誰頒發(fā)的呢?或者說我們是從哪個(gè)CA申請到用于Xcode開發(fā)調(diào)試App的證書呢?

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)類似注冊管理戶籍的公安機(jī)關(guān)戶政管理機(jī)構(gòu),AppleWWDRCA.cer之于iOS(開發(fā))證書則好比戶籍證之于身份證。

如果Mac Keychain Access證書助理在申請證書時(shí)尚未安裝過該證書,請先下載安裝(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)。

5.申請證書(CSR:Certificate Signing Request)

可以在缺少證書時(shí)通過Xcode Fix Issue自動(dòng)請求證書,這里通過Keychain證書助理從證書頒發(fā)機(jī)構(gòu)請求證書:填寫開發(fā)賬號(hào)郵件和常用名稱,勾選【存儲(chǔ)到磁盤】。

keychain將生成一個(gè)包含開發(fā)者身份信息的CSR(Certificate Signing Request)文件;同時(shí),Keychain Access|Keys中將新增一對(duì)Public/PrivateKey Pair(Thissigning identityconsists 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 anentirely newidentity to sign code.

Worse, if someone else has your private key, that person may be able toimpersonateyou.

在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)已注冊的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)歷以下三步:

首先,需要指明它的App ID,并且驗(yàn)證Bundle ID是否與其一致;

其次,需要證書對(duì)應(yīng)的私鑰來進(jìn)行簽名,用于標(biāo)識(shí)這個(gè)APP是合法、安全、完整的;

然后,如果是真機(jī)調(diào)試,需要確認(rèn)這臺(tái)設(shè)備是否授權(quán)運(yùn)行該APP。

Provisioning Profile把這些信息全部打包在一起,方便我們在調(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)用簽名的所有證書。

證書是基于Base64編碼,符合PEM(PrivacyEnhanced Mail, RFC 1848)格式的,可使用OpenSSL來處理(opensslx509 -text -in file.pem)。

從DeveloperCertificates提取之間的內(nèi)容到文件cert.cer(cert.perm):

-----BEGIN CERTIFICATE-----

將之間的內(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鍵對(duì)應(yīng)的:

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 。

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.TeamProvisioning 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è)team注冊的所有設(shè)備上調(diào)試所有的應(yīng)用程序(不管bundle identifier是什么)。同時(shí),它還會(huì)為開發(fā)者自己創(chuàng)建的Wildcard/Explicit App IDs創(chuàng)建對(duì)應(yīng)的iOS Team Provisioning Profile。

2.TeamProvisioning 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)已注冊的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 IDProvisioning 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

Xcode中配置的Code Signing Identity(entitlements、certificate)必須與Provisioning Profile匹配,并且配置的Certificate必須在本機(jī)Keychain Access中存在對(duì)應(yīng)Public/Private Key Pair,否則編譯會(huì)報(bào)錯(cuò)。

Xcode所在的Mac設(shè)備(系統(tǒng))使用CA證書(WWDRCA.cer)來判斷Code Signing Identity中Certificate的合法性:

若用WWDRCA公鑰能成功解密出證書并得到公鑰(Public Key)和內(nèi)容摘要(Signature),證明此證書確乃AppleWWDRCA發(fā)布,即證書來源可信;

再對(duì)證書本身使用哈希算法計(jì)算摘要,若與上一步得到的摘要一致,則證明此證書未被篡改過,即證書完整。

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)。

Xcode使用指定證書配套的私鑰進(jìn)行簽名時(shí)需要授權(quán),選擇【始終允許】后,以后使用該私鑰進(jìn)行簽名便不會(huì)再彈出授權(quán)確認(rèn)窗口。

3.Verify Code Signature with Certificate

上面已經(jīng)提到,公鑰被包含在數(shù)字證書里,數(shù)字證書又被包含在描述文件(Provisioning File)中,描述文件在應(yīng)用被安裝的時(shí)候會(huì)被拷貝到iOS設(shè)備中。

第一步,App在Mac/iOS真機(jī)上啟動(dòng)時(shí),需要對(duì)配置的bundle ID、entitlements和certificate與Provisioning Profile進(jìn)行匹配校驗(yàn):

第二步,iOS/Mac真機(jī)上的ios_development.cer被AppleWWDRCA.cer中的 public key解密校驗(yàn)合法后,獲取每個(gè)開發(fā)證書中可信任的公鑰對(duì)App的可靠性和完整性進(jìn)行校驗(yàn)。

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)容完整。

小結(jié):

基于Provisioning Profile校驗(yàn)了CodeSign的一致性;

基于Certificate校驗(yàn)App的可靠性和完整性;

啟動(dòng)時(shí),真機(jī)的device ID(UUID)必須在Provisioning Profile的ProvisionedDevices授權(quán)之列。

八.在多臺(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",其中Name中為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 theprivate keyandcertificate。

其他Mac機(jī)器上雙擊Certificates.p12(如有密碼需輸入密碼)即可安裝該共享證書。有了共享證書之后,在開發(fā)者網(wǎng)站上將欲調(diào)試的iOS設(shè)備注冊到該開發(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),請確保導(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 matchprofile

"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試試。

十.Xcode7 免證書真機(jī)調(diào)試

在 Xcode 7 中,蘋果改變了自己在許可權(quán)限上的策略:

此前 Xcode 只開放給注冊開發(fā)者下載,現(xiàn)在 Xcode 7 改變了這種慣有的做法,無需注冊開發(fā)者賬號(hào),僅使用普通的Apple ID就能下載和上手體驗(yàn)。

此前開發(fā)者需每年支付99美元的費(fèi)用成為注冊開發(fā)者才能在 iPhone/iPad 真機(jī)上運(yùn)行調(diào)試APP,蘋果新的開發(fā)者計(jì)劃則放寬要求,無需購買,只要你感興趣同樣可以在設(shè)備上測試app?!?a target="_blank" rel="nofollow">Developers would be able to test apps on deviceswithouta paid Apple developer account in Xcode 7.

所謂“免證書”真機(jī)調(diào)試,并不是真的不需要證書,Xcode真機(jī)調(diào)試原有的證書配置體系仍在——All iOS, tvOS, and watchOS appsmust becode signed and provisioned to launch on a device.所以,上文啰嗦幾千字還是有點(diǎn)用的。

自 Xcode7 開始,原來基于付費(fèi)開發(fā)者賬號(hào)及自助生成證書及配置文件的繁瑣過程被蘋果簡化,Xcode將針對(duì)任何普通賬號(hào)自動(dòng)為聯(lián)調(diào)真機(jī)生成所需相關(guān)的證書及配置文件。當(dāng)你打算向 App Store 提交發(fā)布應(yīng)用,才需要付費(fèi)。

第一步:進(jìn)入 Xcode Preferences|Accounts,添加自己的 Apple ID 賬號(hào)。

第二步:Build Settings|Code Signing 下的 Provisioning Profile 選擇Automatic,Code Signing Identity 選擇 Automatic 下的iOS Developer。

第三步:General 配置 Bundle identifier,Team 下拉選擇蘋果Member Center自動(dòng)為你的賬號(hào)生成的Personal TeamID。

自己的賬號(hào)在調(diào)試公司或其他第三方APP代碼時(shí),若填寫B(tài)undle identifier 為他人賬號(hào)注冊的 APP ID(例如蘋果相機(jī)應(yīng)用com.apple.camera),會(huì)報(bào)錯(cuò):

No provisioning profiles with a valid signing identity (i.e. certificate and private key pair) matching the bundle identifier “com.apple.camera” were found.

即使編譯通過了,可能運(yùn)行時(shí)APP自身與服務(wù)器校驗(yàn)也可能會(huì)報(bào)簽名錯(cuò)誤,腫么辦???

Her skill:此時(shí),可以在他人原有App ID基礎(chǔ)上添加后綴(例如com.apple.camera.extension),配置成應(yīng)用的衍生插件(相當(dāng)于置于同一App Group下)就可以快樂的玩耍了。

如果啟動(dòng)APP時(shí),Xcode報(bào)錯(cuò)“process launch failed: Security”或iPhone報(bào)錯(cuò)【不受信任的開發(fā)者】,此時(shí)需要到iPhone通用配置中的描述文件(最新系統(tǒng)中可能叫設(shè)備管理)中,在描述文件(開發(fā)商應(yīng)用)中選擇對(duì)應(yīng)的描述文件(你的Apple ID)點(diǎn)擊?信任?或?驗(yàn)證?即可。

OK,All Done!

參考:

iPhone真機(jī)調(diào)試應(yīng)用程序》《iOS Developer:真機(jī)測試》《Xcode5 & iOS 7 及以下版本免證書真機(jī)調(diào)試記錄

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行貨自動(dòng)打包》《解決Xcode無法生成Archive的問題》《iOS程序完成后如何生成ipa進(jìn)行真機(jī)測試

發(fā)布iOS應(yīng)用程序(Application Loader)》《iOS發(fā)布遇到的一些問題

Xcode打包ipa包》《iOS程序生成ipa進(jìn)行真機(jī)測試

轉(zhuǎn)載:http://blog.csdn.net/zhaobingxu24/article/details/50679912

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容