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