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