轉(zhuǎn)載于:
原文鏈接:Code Signing in Xcode 8
譯文鏈接:Xcode 8 中的代碼簽名
譯者: leoxu
代碼簽名和管理開(kāi)發(fā)證書(shū)配置多年來(lái)一直是開(kāi)發(fā)者揮之不去的煩惱。為此我進(jìn)行了大量的寫作和演講來(lái)幫助人們理解代碼簽名和開(kāi)發(fā)證書(shū)配置到底是什么,以及如何才能對(duì)其較好的管理。所以你就可以想象得到當(dāng)Matthew Firlik在今年的WWDC大會(huì)上《聯(lián)盟的平臺(tái)現(xiàn)狀》(53:30)上提到代碼簽名和開(kāi)發(fā)證書(shū)配置時(shí),我是有多么的驚訝和興奮。另外據(jù)其透露大會(huì)的日程安排包含了一完整的會(huì)議,討論 Xcode App 簽名會(huì)有什么新的東西,而且有兩個(gè)專注于于該話題的實(shí)際操作。那么,Xcode 8 是否能擺平過(guò)去我在代碼簽名和開(kāi)發(fā)證書(shū)配置上所受到的委屈呢? 確實(shí)好多了。
在過(guò)去,代碼簽名被隱藏在Xcode的“構(gòu)建設(shè)置(Build Settings)”Tab中。CODE_SIGN_IDENTITY 和 PROVISIONING_PROFILE 兩個(gè)設(shè)置項(xiàng)很難對(duì)付而且它們相互之間沒(méi)有直接的鏈接。開(kāi)發(fā)者經(jīng)常會(huì)碰到“沒(méi)有找到匹配的開(kāi)發(fā)正式配置(No Matching Provisioning Profiles Found)”錯(cuò)誤,或者是一個(gè)“應(yīng)用程序代碼簽名授權(quán)文件中指定的權(quán)限不能匹配開(kāi)發(fā)證書(shū)配置中指定的權(quán)限(The entitlements specified in your application’s Code Signing Entitlements file do not match those specified in your provisioning profile)?!卞e(cuò)誤, 這還是在他們幸運(yùn)的情況下。如果他們不夠走運(yùn),構(gòu)建倒是會(huì)成功,但構(gòu)建出來(lái)的APP會(huì)在設(shè)備上運(yùn)行失敗,或者奔潰掉,就因?yàn)槿鄙倭薃pp組權(quán)限。Xcode 8 完全重構(gòu)的開(kāi)發(fā)證書(shū)系統(tǒng),其所做出的變化會(huì)解決所有這些問(wèn)題。
現(xiàn)在你在如何對(duì)你的APP進(jìn)行代碼簽名和證書(shū)配置上有了選擇權(quán) 。自動(dòng)代碼簽名令許多人感到興奮。自動(dòng)代碼簽名使用了一個(gè)新的由Xcode管理的,獨(dú)立于你已經(jīng)創(chuàng)建的配置的專用配置。這確實(shí)是對(duì)令人感到可怕的“(解決問(wèn)題)Fix Issue”按鈕進(jìn)行的一個(gè)擴(kuò)展,但確實(shí)是隔離獨(dú)立的,因此并不會(huì)影響到你現(xiàn)在已經(jīng)管理的配置。自動(dòng)代碼簽名看起來(lái)很棒,而且它很有可能將會(huì)被大量的開(kāi)發(fā)者使用到,
不過(guò),這并非 Xcode 8 代碼簽名的改進(jìn)中最令我感到興奮之處。在大型團(tuán)隊(duì)中工作的人們或者沒(méi)有APP團(tuán)隊(duì)和開(kāi)發(fā)者門戶訪問(wèn)權(quán)限的開(kāi)發(fā)者,需要對(duì)其APP中的代碼簽名進(jìn)行更細(xì)粒度的控制。自定義的代碼簽名提供了那樣的東西。自定義代碼簽名就是我們多年來(lái)如何對(duì)配置和APP進(jìn)行管理的方式,它讓我們能對(duì)APP如何進(jìn)行代碼簽名擁有最大程度的控制。 Xcode 8 將自定義代碼簽名和開(kāi)發(fā)證書(shū)配置的從暗箱操作帶到了陽(yáng)光下。沒(méi)有被埋沒(méi)在構(gòu)建設(shè)置(Build Settings), 代碼簽名現(xiàn)在被通用(General)Tab的前頭和中心位置。當(dāng)“自動(dòng)管理簽名(Automatically manage signing)”沒(méi)有被選中的時(shí)候,我們可以特別地選擇我們希望用于每個(gè)配置的開(kāi)發(fā)證書(shū)配置。目前這個(gè)在其自身中沒(méi)有新東西,我們總是能夠在 構(gòu)建設(shè)置(Build Settings)Tab中做這個(gè)事情。真正棒的地方是 Xcode 8在這里所展示出來(lái)的機(jī)智。配置的下拉列表可選項(xiàng)現(xiàn)在對(duì)合格配置和不合格配置進(jìn)行了分組,前者在后者之上。這意味著完全或者通配符匹配捆綁標(biāo)識(shí)符的配置將會(huì)顯示在那些不匹配的配置之上。
不僅如此,如果你選擇了一個(gè)不匹配捆綁標(biāo)識(shí)符的配置,現(xiàn)在就回得到一個(gè)錯(cuò)誤消息,告訴你具體出了什么問(wèn)題。
這是同我們的過(guò)去相比的一個(gè)巨大改善。XCode不再為我們隱藏細(xì)節(jié)。我們也不再為了找到哪里可能出了問(wèn)題而東想西想。 Xcode 8 就會(huì)告訴你到底哪里出了問(wèn)題,不會(huì)張冠李戴,丟三落四。如果我們止步于此,我也會(huì)對(duì)代碼簽名的變化感到完全地滿足。我知道我的描述聽(tīng)起來(lái)像是一檔電視購(gòu)物節(jié)目,但其實(shí)要更好!
Xcode 團(tuán)隊(duì)已經(jīng)在報(bào)告導(dǎo)航(Report Navigator)中引入了一份新的報(bào)告,概述了Xcode為你所做的跟代碼簽名相關(guān)的事情。
這一報(bào)告完全揭掉了在Xcode用來(lái)同開(kāi)發(fā)者門戶打交道的“API”的面紗。老版本的Xcode會(huì)神不知鬼不覺(jué)的同Apple開(kāi)發(fā)者門戶通信?,F(xiàn)在則是當(dāng)Xcode 8代你處理代碼簽名的時(shí)候,你可以具體地看到執(zhí)行了什么檢查,還有Xcode8做了什么來(lái)修復(fù)它識(shí)別出來(lái)的問(wèn)題。
還有一件令我感到驚喜的事情就是有了一個(gè)新的構(gòu)建配置設(shè)置,PROVISIONING_PROFILE_SPECIFIER。過(guò)去你可能要根據(jù)名稱指定 PROVISIONING_PROFILE,而Xcode轉(zhuǎn)而會(huì)像后面這樣引用項(xiàng)目中的配置的UUID: PROVISIONING_PROFILE = “9b7bca71-29ac-44de-a96d-131d06b46501”。如果帶有特定的那個(gè)UUID的配置丟失了,Xcode沒(méi)辦法自己去擺平這個(gè)事情。你就不得不到構(gòu)建設(shè)置 (Build Settings )中你的列表里去找到配置名稱,為了讓Xcode獲取到新的UUID。 PROVISIONING_PROFILE_SPECIFIER 讓你可以指定開(kāi)發(fā)證書(shū)配置名稱,而現(xiàn)在Xcode8將會(huì)在你的項(xiàng)目文件中保存后面這樣的東西: PROVISIONING_PROFILE_SPECIFIER = “9K9F9LCV74/KeyGrinder Dev”— 一個(gè) Team ID 和配置名稱的組合(由于它是在開(kāi)發(fā)者門戶中被命名的,并沒(méi)有必要時(shí)一個(gè)實(shí)際的文件名稱)。這樣X(jué)code就總是會(huì)使用這個(gè)名稱的最新的配置,而不管什么UUID了。在你做過(guò)更新之后,Xcode就不會(huì)再使用老的過(guò)時(shí)的配置。有了這個(gè)附加的功能,Apple為我們放開(kāi)了自己的 set_project_profiles腳本。而沒(méi)有什么會(huì)比這更讓我們感到高興了。

最后一件我要重點(diǎn)提一提的事情就是Apple在會(huì)議和實(shí)際操作中都提到過(guò)的一個(gè)最佳實(shí)踐。應(yīng)用程序發(fā)布是一個(gè)兩步走的過(guò)程:編譯然后進(jìn)行代碼簽名。你的應(yīng)用首先應(yīng)該被編譯成一個(gè) XCArchive 然后被導(dǎo)出成一個(gè)用于發(fā)布的IPA。因此,你并不需要在你的發(fā)布配置中有確切的證書(shū)和配置設(shè)定。只要APP是使用正確的發(fā)布標(biāo)識(shí)、優(yōu)化等等進(jìn)行的編譯,它就可以用一個(gè)AdHoc或者甚至是一個(gè)開(kāi)發(fā)配置來(lái)簽名。你只需要在導(dǎo)出IPA或者提交到 App Store時(shí)使用正確的 App Store 或者 Enterprise 配置就行了。這可以幫助那些不必接觸發(fā)布憑證和證書(shū)的開(kāi)發(fā)者避免遇到那些他們拿著沒(méi)有任何辦法的錯(cuò)誤。
Xcode 8 的發(fā)布讓我感覺(jué)Apple已經(jīng)在傾聽(tīng)并提供我們所訴求的東西了。