轉(zhuǎn)自>曾夢想仗劍走天涯?
引言
? ? ? ? 關(guān)于開發(fā)證書配置(Certificates & Identifiers & Provisioning Profiles)瞻讽,相信做iOS開發(fā)的同學(xué)沒少被折騰。對于一個(gè)iOS開發(fā)小白饥悴、半吊子(比如像我自己)抑或老兵阐虚,或多或少會有或曾有過以下不詳宝剖、疑問乏冀、疑惑甚至困惑:
- 什么是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)試囊嘉?
- 多臺機(jī)器如何共享開發(fā)者賬號或證書温技?
- 遇到證書配置問題怎么辦?
本文將圍繞相關(guān)概念做個(gè)系統(tǒng)的梳理串燒扭粱。
寫在前面
1.假設(shè)你使用過Apple設(shè)備(iMac/iPad/iPhone)且注冊過Apple ID(Apple Account)舵鳞。
2.假設(shè)你或你所在的開發(fā)組已加入蘋果開發(fā)者計(jì)劃(Enroll in iOS Developer Program to become a member),即已注冊開發(fā)者賬號(Apple Developer Account)琢蛤。
- 只有擁有開發(fā)者賬號蜓堕,才可以申請開發(fā)/發(fā)布證書及相關(guān)配置授權(quán)文件,進(jìn)而在iOS真機(jī)上開發(fā)調(diào)試Apps或發(fā)布到App Store博其。
- 開發(fā)者賬號分為Individual和Company/Organization兩種類型套才。如無特別交代,下文基于$99/Year的普通個(gè)人開發(fā)者(Individual)賬號展開慕淡。
3.若要真機(jī)調(diào)試實(shí)踐背伴,你必須至少擁有一臺裝有Mac OS X/Xcode的Mac開發(fā)機(jī)(iMac or MacBook),其上自帶原生的Keychain Access峰髓。
一.App ID(bundle identifier)
App ID即Product ID傻寂,用于標(biāo)識一個(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全名會被追加Application Identifier Prefix(一般為TeamID.)眉孩,分為兩類:
- Explicit App ID:唯一的App ID个绍,用于唯一標(biāo)識一個(gè)應(yīng)用程序。例如“com.apple.garageband”這個(gè)App ID浪汪,用于標(biāo)識Bundle Identifier為“com.apple.garageband”的App巴柿。
- Wildcard App ID:含有通配符的App ID,用于標(biāo)識一組應(yīng)用程序死遭。例如“*”(實(shí)際上是Application Identifier Prefix)表示所有應(yīng)用程序广恢;而“com.apple.*”可以表示Bundle Identifier以“com.apple.”開頭(蘋果公司)的所有應(yīng)用程序。
用戶可在網(wǎng)站上刪除(Delete)已注冊的App IDs呀潭。
App ID被配置到【XcodeTarget|Info|Bundle Identifier】下钉迷;對于Wildcard App ID至非,只要bundle identifier包含其作為Prefix/Seed即可。
二.設(shè)備(Device)
Device就是運(yùn)行iOS系統(tǒng)用于開發(fā)調(diào)試App的設(shè)備糠聪。每臺Apple設(shè)備使用UDID來唯一標(biāo)識荒椭。
iOS設(shè)備連接Mac后,可通過iTunes->Summary或者Xcode->Window->Devices獲取iPhone的UDID(identifier)舰蟆。
Apple Member Center網(wǎng)站個(gè)人賬號下的Devices中包含了注冊過的所有可用于開發(fā)和測試的設(shè)備趣惠,普通個(gè)人開發(fā)賬號每年累計(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è)憑證塌鸯。
每個(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ù)字證書是一個(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)伟墙。安裝根證書意味著對這個(gè)CA認(rèn)證中心的信任翘鸭。
在天朝子民的一生中,戶籍證明可理解為等效的根證書:有了戶籍證明戳葵,才能辦理身份證就乓;有了上流的身份證,才能辦理下游居住證、結(jié)婚證生蚁、計(jì)劃生育證噩翠、駕駛執(zhí)照等認(rèn)證。
3.iOS(開發(fā))證書
iOS證書是用來證明iOS App內(nèi)容(executable code)的合法性和完整性的數(shù)字證書守伸。對于想安裝到真機(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ā)賬號最多可注冊iOS Development/Distribution證書各2個(gè)蠢涝,用戶可在網(wǎng)站上刪除(Revoke)已注冊的Certificate。下文主要針對開發(fā)調(diào)試階段的Development證書阅懦。
下文主要針對iOS App開發(fā)調(diào)試過程中的開發(fā)證書(Certificate for Development)和二。
4.iOS(開發(fā))證書的根證書
那么,iOS開發(fā)證書是誰頒發(fā)的呢耳胎?或者說我們是從哪個(gè)CA申請到用于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)類似注冊管理戶籍的公安機(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ā)賬號郵件和常用名稱羽戒,勾選【存儲到磁盤】。
keychain將生成一個(gè)包含開發(fā)者身份信息的CSR(Certificate Signing Request)文件虎韵;同時(shí)易稠,Keychain Access|Keys中將新增一對Public/Private?Key Pair(This?signing identity?consists of a public-private key pair that Apple issues)。
private key始終保存在Mac OS的Keychain Access中包蓝,用于簽名(CodeSign)對外發(fā)布的App驶社;public key一般隨證書(隨Provisioning Profile,隨App)散布出去养晋,對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對CSR中的public key和一些身份信息進(jìn)行加密簽名生成數(shù)字證書(ios_development.cer)并記錄在案(Apple Member Center)逊抡。
從Apple?Member Center網(wǎng)站下載證書到Mac上雙擊即可安裝(當(dāng)然也可在Xcode中添加開發(fā)賬號自動(dòng)同步證書和[生成]配置文件)。證書安裝成功后,在KeychainAccess|Keys中展開創(chuàng)建CSR時(shí)生成的Key Pair中的私鑰前面的箭頭冒嫡,可以查看到包含其對應(yīng)公鑰的證書(Your requested certificate will be the public half of the key pair.)拇勃;在Keychain Access|Certificates中展開安裝的證書(ios_development.cer)前面的箭頭,可以看到其對應(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對應(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)歷以下三步:
- 首先,需要證書對應(yīng)的私鑰來進(jìn)行簽名褂策,用于標(biāo)識這個(gè)APP是合法横腿、安全、完整的斤寂;
- 其次耿焊,需要指明它的App ID,并且驗(yàn)證Bundle ID是否與其一致遍搞;
- 然后罗侯,如果是真機(jī)調(diào)試,需要確認(rèn)這臺設(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賬號名书斜。
(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查看對應(yīng)證書ios_development.cer瞧哟,正常情況(公私鑰KeyPair配對)應(yīng)吻合;Windows下沒有足夠信息(WWDRCA.cer)枪向,無法驗(yàn)證該證書勤揩。
如果你用了一個(gè)不在這個(gè)列表中的證書進(jìn)行簽名,無論這個(gè)證書是否有效秘蛔,這個(gè)應(yīng)用都將CodeSign Fail陨亡。
(8)Entitlements鍵<key>對應(yīng)的<dict>:
keychain-access-groups:$(AppIdentifierPrefix),參見Code Signing Entitlements(*.entitlements)深员。
每個(gè)應(yīng)用程序都有一個(gè)可以用于安全保存一些如密碼负蠕、認(rèn)證等信息的keychain,一般而言自己的程序只能訪問自己的keychain倦畅。通過對應(yīng)用簽名時(shí)的一些設(shè)置遮糖,還可以利用keychain的方式實(shí)現(xiàn)同一開發(fā)者簽證(就是相同bundle seed)下的不同應(yīng)用之間共享信息的操作。比如你有一個(gè)開發(fā)者帳戶叠赐,并開發(fā)了兩個(gè)不同的應(yīng)用A和B欲账,然后通過對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ā)者賬號都對應(yīng)一個(gè)唯一的Team ID,Xcode3.2.3預(yù)發(fā)布版本中加入了Team Provisioning Profile這項(xiàng)新功能斜脂。
在Xcode中添加Apple Developer Account時(shí)抓艳,它將與Apple Member Center后臺勾兌自動(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注冊的所有設(shè)備上調(diào)試所有的應(yīng)用程序(不管bundleidentifier是什么)玷或。同時(shí),它還會為開發(fā)者自己創(chuàng)建的Wildcard/Explicit App IDs創(chuàng)建對應(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è)輕量級(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)識的共享資源區(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 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會被配置到【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í)是公鑰)對應(yīng)Key Pair中的私鑰會被用來對內(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í)候會被拷貝到iOS設(shè)備中。
Xcode使用指定證書配套的私鑰進(jìn)行簽名時(shí)需要授權(quán)茄蚯,選擇【始終允許】后压彭,以后使用該私鑰進(jìn)行簽名便不會再彈出授權(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ā)布凳谦,即證書來源可信;
- 再對證書本身使用哈希算法計(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ā)布,即來源可信送粱;
- 再對App(executable code)本身使用哈希算法計(jì)算摘要褪贵,若與上一步得到的摘要一致,則證明此App(executable code)未被篡改過抗俄,即內(nèi)容完整脆丁。
八.在多臺機(jī)器上共享開發(fā)賬戶/證書
1.Xcode導(dǎo)出開發(fā)者賬號(*.developerprofile)或PKCS12文件(*.p12)
進(jìn)入Xcode Preferences|Accounts:
- 選中Apple IDs列表中對應(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同步該賬號下所有的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è)備注冊到該開發(fā)者賬號名下,并下載對應(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配置是否正確颂碘。如果是別人提供的共享賬號(*.developerprofile)或共享證書(*.p12),請確保導(dǎo)出了對應(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)檢查對應(yīng)版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”鍵值是否與ProvisioningProfile中的Entitlements項(xiàng)相吻合(后者一般為前者的Prefix/Seed)。
(2)也可以將Build Settings|Code Signing的Provisioning Profile中對應(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ā)者賬號那些事兒》《iOS關(guān)於Provisioning
Profiles這些事》
《iOS Code Signing 學(xué)習(xí)筆記》《代碼簽名探析/Inside Code Signing》
《iOS Code Signing: 解惑/iOS Code Signing: Under The Hood》