解析并解決iPhone開發(fā)中代碼簽名問題
解析并解決iPhone開發(fā)中代碼簽名問題是本文要介紹的內(nèi)容,絕大多數(shù)iPhone Developer/Distribution 的代碼簽名生成錯(cuò)誤是因?yàn)樽C書和Provisioning profiles沒有在開發(fā)系統(tǒng)上正確安裝引起的。
本文描述在開發(fā) iPhone OS 應(yīng)用程序時(shí)所需要的文件以及如何安裝它們。這個(gè)技術(shù)說(shuō)明為“Program User Guide”提供支持,Program User Guide 可以在 Portal Resources 下的 iPhone Developer Program Provisioning Portal 找到。如果你對(duì) iPhone 開發(fā)剛?cè)腴T,請(qǐng)先閱讀 Program User Guide.
需要什么
所有 iPhone 應(yīng)用程序在iPhone OS設(shè)備上運(yùn)行之前必須用合法的 signing identity 進(jìn)行簽名。
為了在自己的iPhone OS設(shè)備開發(fā)而做應(yīng)用程序簽名,需要:
私鑰
iPhone 開發(fā)者證書
Development Provisioning profile
上 App Store 需要:
私鑰
iPhone Distribution 證書
App Store Distribution Provisioning profile
要用在 Ad Hoc 上需要:
私鑰
iPhone Distribution 證書
Ad Hoc Distribution Provisioning profile
私鑰是在生成認(rèn)證簽名請(qǐng)求(CSR)時(shí)創(chuàng)建的,在CSR提交和通過(guò)之后,可以在 iPhone Developer Program Provisioning Portal 里創(chuàng)建和下載證書以及provisioning profiles。
注意:為了更好的區(qū)分不同的provisioning profile,在創(chuàng)建的時(shí)候注意命名,例如 "wild card dev profile", "MyApp Push distribution profile", “Ad Hoc Testers profile” 等等。
這些東西的作用
Signing identity 由私有加密key和數(shù)字證書組成。在iPhone OS開發(fā)中,Xcode 用私鑰來(lái)簽署程序,這樣程序就可以在iPhone OS開發(fā)設(shè)備上運(yùn)行或者提交到app store。
公鑰包含 iPhone開發(fā)者/發(fā)布商證書,用來(lái)認(rèn)證已簽名的程序。
Provisioning pfofiles 用來(lái)告知Xcode用哪個(gè)證書/私鑰組合來(lái)簽署程序。開發(fā)設(shè)備也通過(guò)它來(lái)決定如何認(rèn)證安裝在設(shè)備上的程序。
證書 - 安裝/校驗(yàn)
下載 iPhone Development 證書或者 iPhone Distribution 證書之后,雙擊下載的 .cer 文件啟動(dòng) Keychain Access并安裝證書。如果詢問將證書安裝到哪,請(qǐng)選擇 "login" keychain。
要確定證書是否正確安裝,選擇 "login" keychain 并且選擇 "My Certificates" 類別。如果想要部署到你的開發(fā)設(shè)備,選擇以"iPhone Developer Certificate"為標(biāo)題開頭的證書。如果要發(fā)布程序,選擇以"iPhone Distribution Certificate"標(biāo)題開頭的證書。
在 Information view 里應(yīng)該有一個(gè)帶選中標(biāo)志的綠圈告訴你證書合法,意思就是 WWDR Intermediate Certificate 已經(jīng)安裝在系統(tǒng)里,并且證書已校驗(yàn)。要是看不見綠圈就應(yīng)該從 iPhone Developer Program Provisioning Portal 下載 WWDR Intermediate Certificate 并且像安裝iPhone Developer 或者 Distribution Certificate那樣給它裝上。
選中的證書旁有個(gè)小三角,點(diǎn)擊它會(huì)顯示證書關(guān)聯(lián)的私鑰。要是沒有,看看你是不是在“My Certificates”類別下。要對(duì)程序進(jìn)行簽名必須需要私鑰,要是當(dāng)前確實(shí)在"My Certificates"下并且還是沒有小三角,需要作廢舊證書并且創(chuàng)建并提交一個(gè)新的CSR來(lái)創(chuàng)建新的私鑰和證書。
注意:如果創(chuàng)建了新私鑰或者證書,關(guān)聯(lián)到舊證書的配置文件就失效了,需要重新生成新 pfofiles。***在拷貝新證書之前把舊的從開發(fā)機(jī)器和設(shè)備上刪除掉,這樣可避免新舊證書/配置文件混淆。這么做不影響已經(jīng)在app store里的程序。
警告:安裝 iPhone 證書后不要改動(dòng)默認(rèn)的 "Use System Defaults" 信任設(shè)置。如果信任設(shè)置不是'Use System Defaults',在生成應(yīng)用程序的時(shí)候會(huì)得到一個(gè) CSSMERR_TP_NOT_TRUSTED 簽名錯(cuò)誤。
Provisioning Profiles - 安裝/校驗(yàn)
要把從iPhone Developer Program Provisioning Portal下載回來(lái)的Provisioning Profile安裝到開發(fā)機(jī)器,首先需要啟動(dòng) Xcode然后點(diǎn)擊"Window > Organizer"來(lái)打開Organizer。把provisioning profile拖到標(biāo)記為"Provisioning Profiles"的區(qū)域內(nèi)即可。
如果是為了開發(fā)而安裝 Provisioning Profile,還需要把它裝在開發(fā)設(shè)備上。在 iPhone OS 設(shè)備已經(jīng)插到電腦上的時(shí)候,在 Devices 三角下選擇設(shè)備,然后在Organizer里把開發(fā)provisioning profile拖進(jìn)去。這就把 Provisioning profile裝到 iPhone OS設(shè)備里了。
注意:確保安裝在開發(fā)設(shè)備和Mac里的 Development Provisioning完全相同對(duì)成功生成并安裝測(cè)試程序是非常重要的。
注意:跟 Development Provisioning Profiles不同,App Store Distribution Provisioning Profiles不能安裝在iPhone OS設(shè)備里。用App Store Distribution Provisioning生成的程序是用來(lái)通過(guò) iTunes Connect上傳到App Store的。
要告訴 Xcode 使用哪個(gè) Provisioning profile,打開 Xcode 項(xiàng)目,打開 Target build settings,滾動(dòng)到 Code Signing。在 Code Signing 區(qū)域有個(gè)帶小三角的 Code Signing Identity。確定設(shè)置是為任何 iPhone OS 設(shè)備,之后在Value列點(diǎn)擊彈出菜單并且選擇要使用的 Provisioning Profile。為了開發(fā),建議選擇 "iPhone Developer",要發(fā)布,建議選擇"iPhone Distribution"。這些都在彈出菜單的"Auto matic Profile Selector"區(qū)域里,這樣就可以使 Xcode來(lái)為你找到正確的Provisioning Profile。
注意:要是丟失了 iPhone devloper/Distribution證書的私鑰,就無(wú)法選擇證書關(guān)聯(lián)到的 Provisioning Profile。從備份中導(dǎo)入 iPhone developer/Distribution 證書的私鑰可以解決這個(gè)問題。如果丟了或者刪了私鑰,就得生成一個(gè)新的CSR并且下載新的 iPhone Developer/Distribution 證書和Provisioning Profile。
程序的 Bundle Identifier 必須跟Provisioning profiles的Bundle Identifier APP ID匹配。要編輯程序的 Bundle Identifier,打開 target's properties settings,在 Identifier 欄輸入 Bundle Identifier。如果在 App id的bundle identifier里使用星號(hào)通配符,就可以替換為反向DNS格式的字符。
下面有一些可以輸入到 Identifier 框的例子。
如果AppID是 A1B2C3D4E5.com.domainname.applicationname。輸入com.domainname.applicationname 作為 Bundle Identifier
AppID是 A1B2C3D4E5.*,輸入反向DNS格式的字符串作為 Bundle Identifier。
關(guān)于 Profiles 和 App IDs
創(chuàng)建 Provisioning Profiles 時(shí)可以關(guān)聯(lián)兩種類型的 App ID。***個(gè)類型叫做通用App ID(Wildcard App ID)。推薦大多數(shù)iPhone OS開發(fā)用通用App ID的Provisioning Profiles,因?yàn)檫@樣單個(gè)通用App ID可以用來(lái)生成和安裝大多數(shù)程序,包括 iPhone Reference Libary 里的示例代碼。通用App ID通過(guò)在 Identifier 里輸入星號(hào)創(chuàng)建。星號(hào)必須是App ID字符串的***一個(gè)字符。如果使用通用App ID,記著在Xcode項(xiàng)目里輸入Bundle Identifier時(shí)把星號(hào)替換為反向DNS格式。
假設(shè)有 App ID ABCDE12345.*:
ABCDE12345是Bundle種子ID(由Apple生成)
*是App ID的Bundle Identifier。在xcode里輸入bundle identifier時(shí)需要把星號(hào)替換為反向DNS格式。
假設(shè)有 App ID: ABCDE12345.com.yourcompany.*
ABCDE12345是Bundle種子ID(由Apple生成)
com.yourcompany.* 是App ID的Bundle Identifier。并且xcode項(xiàng)目里的bundle identifier必須以'com.yourcompany.'開頭,星號(hào)可以替換成任意字串。
第二類 App ID 稱作固定AppID(Explicit App ID)。這類 APP ID限定了一個(gè)provisioning profile只允許一個(gè)程序安裝。啟用iPhone OS 3.0特性需要固定 App ID,例如 In App Purchase或者 App Push Notification 服務(wù)。固定ID通過(guò)輸入指定字串創(chuàng)建。推薦做法是用反向DNS格式。
重要:一個(gè)避免將來(lái)可能產(chǎn)生問題的提示:修改 yourcompany 為真正的名字。
Ad Hoc
為 Ad Hoc發(fā)布生成應(yīng)用程序跟生成App Store程序類似,只是多了兩步。***,需要用 iPhone Developer Program Provisioning Portal 創(chuàng)建一個(gè) Ad Hoc Distribution provisioning Profile并添加發(fā)布目標(biāo)設(shè)備的 UDID。第二,創(chuàng)建一個(gè)代碼簽名Entitlements file。關(guān)于如何創(chuàng)建Entitlements file請(qǐng)閱讀 iPhone 開發(fā)者指南的 Managing Application Entitlements部分。
創(chuàng)建完 Entitlements file并把它添加到 Code Signing Entitlements build settings之后,打開EntitleMents File并且田間或編輯 get-task-allo把它設(shè)為false。
小結(jié):解析并解決iPhone開發(fā)中代碼簽名問題的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!



















