解析並解決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 IDWildcard 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開發中代碼簽名問題的內容介紹完了,希望本文對你有所協助!