?
免責(zé)申明(必讀!):本博客提供的所有教程的翻譯原稿均來(lái)自于互聯(lián)網(wǎng),僅供學(xué)習(xí)交流之用,切勿進(jìn)行商業(yè)傳播。同時(shí),轉(zhuǎn)載時(shí)不要移除本申明。如產(chǎn)生任何糾紛,均與本博客所有人、發(fā)表該翻譯稿之人無(wú)任何關(guān)系。謝謝合作!
原文鏈接地址: http://www.raywenderlich.com/2915/ios-code-signing-under-the-hood
?
注:本文由翻譯團(tuán)隊(duì)成員 skingTree翻譯。
教程截圖:
??? 下面是一篇有澳洲墨爾本的一名全職 iOS 開(kāi)發(fā)者 提供的文章。他在論壇上是一個(gè)很摩登的年輕人 – Adam Eberbach 。
· Bundle identifier
· provisioning profiles
· App ID
· certificate signing request
對(duì)于新手,的確很難一口氣搞清楚這些東東到底有什么區(qū)別。
下面我們來(lái)揭開(kāi)它們的神秘面紗,在讀完這篇文章后,你應(yīng)該可以把這些東西聯(lián)系起來(lái),你能夠理解它們是怎么工作,并能夠順利地在 device 上運(yùn)行你的應(yīng)用了。
當(dāng)然,這里假設(shè)你已經(jīng)是一個(gè) iOS 開(kāi)發(fā)者,擁有 IDP ,并已經(jīng)有一定的 xcode 和 iOS 開(kāi)發(fā)經(jīng)驗(yàn)了。如果你只是剛剛開(kāi)始學(xué)習(xí) iOS ,你可以先看看其它入門(mén)教程。
好吧,我們開(kāi)始了。
?
它們有多重要?
Code signing 對(duì)你來(lái)說(shuō),最主要的意義就是它能讓你的 App 在設(shè)備上運(yùn)行。不管是你自己的設(shè)備,甲方客戶(hù)的,還是在 App store 上購(gòu)買(mǎi)你的消費(fèi)者。
如果沒(méi)有 code signing ,你只可以在模擬器上,或者一臺(tái)越獄過(guò)的機(jī)器上運(yùn)行你的應(yīng)用 ---- 當(dāng)然,僅僅如此是不能滿(mǎn)足我們的。
模擬器的測(cè)試僅僅是一種初步測(cè)試,模擬器不能替代真機(jī)調(diào)試,因?yàn)椋?
·真正的設(shè)備會(huì)通常比模擬器慢
模擬器使用的是你的 MAC 機(jī)上的處理器,而一臺(tái)真正的 iphone 可遠(yuǎn)遠(yuǎn)沒(méi)有這種條件。所以如果你不在設(shè)備上真正運(yùn)行,你可能就會(huì)忽略實(shí)際的性能問(wèn)題。
比如你新建一個(gè)ViewBased應(yīng)用,然后在 viewDidLoad里面加入下列代碼:
int count=200000; NSMutableArray * array =[NSMutableArray arrayWithCapacity:count]; for (inti =0; i <count; ++i) { [array addObject:[NSString stringWithFormat:@"%d", i]]; } 上面這段代碼在模擬器上可能1-2秒就能運(yùn)行完,但是在真機(jī)上面(比如iphone 3GS),大約要花7秒左右的時(shí)間。
同理的,模擬器使用你 MAC 上的內(nèi)存,而一臺(tái)真正的 iphone 的內(nèi)存少得多。
特別是游戲,通常會(huì)使用大量的圖片,占用大量的內(nèi)存。在老一點(diǎn)型號(hào)的機(jī)器上,一個(gè)紋理圖片的大小上限是 24MB ,也就是 1024X1024 的 8bit 紋理圖。
內(nèi)存耗盡絕對(duì)是你不想見(jiàn)到的,因?yàn)檎加玫膬?nèi)存超過(guò)一定范圍, OS 會(huì)強(qiáng)行退出你的 app ,對(duì)用戶(hù)來(lái)說(shuō),就認(rèn)為是你的 app 崩潰了。
?
·有些 API 只在設(shè)備上有效
譬如 In-App purchase 的 API ,或者 Instrument 中的 Core Animation 。這些都要在真機(jī)上測(cè)試出來(lái)。(可能以后版本的 iOS 或者 xcode 能夠支持,但畢竟真機(jī)測(cè)試是一種保障)
總的來(lái)說(shuō),你沒(méi)有在真機(jī)上測(cè)試過(guò),等于你沒(méi)有真的測(cè)試完。
·(譯者注:一些視覺(jué)上的效果在模擬器上看到的可能會(huì)與真機(jī)不一致)
?
在 Xcode 中有一些懶人的方法:
在 organizer 的界面中,選中 devices 右鍵 Developer Profile ,你可以看到這樣一個(gè)菜單。
里面有大部分這篇文章將要講到的內(nèi)容 。
這里你可以 sign in 你的開(kāi)發(fā)者賬號(hào),自動(dòng)登記你的 app 并運(yùn)行到你的 device 上。
當(dāng)然,如果這樣總是好用的話(huà),這篇文章就沒(méi)有意義了。
作為一個(gè)開(kāi)發(fā)者,你應(yīng)該知道更多。
Public and Private Keys 公鑰私鑰
在繼續(xù)剖析之前,我們先簡(jiǎn)單地解析公鑰私鑰。
這世上有兩種加密方法: symmetric cryptography 對(duì)稱(chēng)密碼和 asymmetric cryptography 非對(duì)稱(chēng)密碼。
對(duì)于對(duì)稱(chēng)密碼,只有一種 key 。譬如你有一個(gè)密鑰,以及對(duì)應(yīng)的一個(gè)加密過(guò)的信息。
那只有知道密鑰的人可以解讀這個(gè)信息。
對(duì)于非對(duì)稱(chēng)密碼,有兩個(gè) key – 公鑰和私鑰。
? 譬如你用某個(gè)私鑰加密一些信息,別人收到這個(gè)信息后可以通過(guò)那個(gè)私鑰對(duì)應(yīng)的公鑰來(lái)加密。這樣他們就可以肯定,這個(gè)信息是從你那里來(lái)的(至少是你加密的)。
這個(gè)私鑰就相當(dāng)于一個(gè)“簽名”。 (你加的密,就是你簽的字)
而這個(gè),就是在 iOS 中 code signing 背后的原理。
?
Code Signing Objects
與 Code Signing 有關(guān)的東西有 :
Provisioning Profiles , App IDs , UDIDs …
在這一節(jié),我們會(huì)一個(gè)一個(gè)地解說(shuō)。
我用 Core Data 繪制了一個(gè)圖表,用來(lái)描述這些對(duì)象之間的關(guān)系。
這是針對(duì)開(kāi)發(fā)人員的 ( Development Profile ),發(fā)布人員的圖會(huì)有小小區(qū)別。
?
私鑰 Private Key :
在 Mac OS X 以后, key 由一個(gè)叫做 Keychain 的 app 來(lái)管理。 你可以在 Application\Utilities 中找到。
運(yùn)行 Keychain ,你可以看到在你的名下有哪些公鑰和私鑰。類(lèi)似這樣的:
(這是私隱,要加碼的)
如果你沒(méi)有看到任何 key 的列表,不用擔(dān)心。在你第一次使用認(rèn)證的時(shí)候, Keychain 會(huì)幫你創(chuàng)建。
在這里列出的 key 是你的 provisioning 或者 code signing 的基礎(chǔ)。
你必須有 key 才能 sign code 或者在 App store 中發(fā)布你的 app 。
如果 key 丟失了?
你必須把整個(gè)流程重新做一次 – 因?yàn)闆](méi)有 key ,你的認(rèn)證不再有效,你的 provisioning profile 只會(huì)生成 error 。你會(huì)浪費(fèi)很多時(shí)間,所以,好好保管它。
如果你沒(méi)有備份過(guò),我建議你馬上把它 export 出來(lái),通過(guò) File\Export Items ,保存在一個(gè)安全的地方,例如一個(gè)很小的分區(qū)中?;蛘咄ㄟ^(guò)你的 Mobile Me 賬號(hào)來(lái)同步保存。
?
有多個(gè) Key ?
如果你在不同的 Mac 機(jī)上創(chuàng)建過(guò) account ,你將會(huì)有多個(gè) key 。
這樣會(huì)帶來(lái)一個(gè)問(wèn)題,在機(jī)器 A 上生成的認(rèn)證,在沒(méi)有私鑰的機(jī)器 B 上會(huì)失效。
所以,你可以把你所有的 key 復(fù)制到你所有的 Mac 機(jī)上。(這樣就不用煩了)
或者,我更建議只用一個(gè) Key 。
UDID
UDID ( Unique Device Identifier )是區(qū)分物理設(shè)備的唯一標(biāo)識(shí)。
所有你的 iPhone 肯定有一個(gè)與眾不同的 UDID ,包括你的 iPad 等等。
通常, UDID 會(huì)是一個(gè) 40 位十六進(jìn)制字符串。
也就是下圖的 identifier :
如果 App 不是從 app store 上來(lái),你的代碼需要有 UDID 的信息才能運(yùn)行。
怎么知道你擁有的設(shè)備的 UDID ?有幾個(gè)方法。
1 如果你的設(shè)備連到 Xcode 的機(jī)器上,你可以在 Organizer 中看到 UDID 。
2 沒(méi)有 xcode 的朋友也可以,在 iTunes 的 Summary 界面,有 serial number (序列號(hào))的信息,點(diǎn)擊可以看到。
3 這是最簡(jiǎn)單的方法,在 App Store 中下載一個(gè) Ad Hoc Helper 吧。
?
Certificate 認(rèn)證
認(rèn)證,就是你的個(gè)人開(kāi)發(fā)者認(rèn)證,或者更華麗地說(shuō):“ Apple Worldwide Developer Relations Certification Authority Certificate ”(這不翻譯了),
這個(gè)本質(zhì)上就是一些代表著信任 - 授權(quán)的數(shù)據(jù)而已。
獲取一個(gè)認(rèn)證,你需要子啊 Keychain Access 中生成一個(gè) Certificate Signing Request ,并把它發(fā)給 Apple 。這會(huì)創(chuàng)建一對(duì) 公鑰 - 私鑰(如果還沒(méi)有的話(huà))。
Apple 收到后會(huì)驗(yàn)證信息,然后給你創(chuàng)建一個(gè)認(rèn)證。
?
App ID
在 Xcode4 中創(chuàng)建一個(gè)項(xiàng)目,你要提供 Product Name 和 Company Identifier 的信息。
Product Name ,就是你的 app 的一個(gè)較短的名稱(chēng)。
Company identifier ,通常會(huì)是一個(gè)反轉(zhuǎn)的 DNS 串,例如: com.mycompanyname
這兩者合起來(lái),就似乎 Bundle Identifier 。你會(huì)在 Info.plist 中找到。
對(duì)于每一個(gè)你要發(fā)布的 app ,你需要到 iTunes Developer Center 中注冊(cè)你的 App ID 。如下圖。
這個(gè)需要與你在 Info.plist 中設(shè)置的保持一致。 ?
Provisioning Profile
把前面講到的東西合起來(lái):
· App ID ( app 的唯一標(biāo)識(shí))
· UDID (在某臺(tái)設(shè)備上運(yùn)行的唯一標(biāo)識(shí))
· Certificate (開(kāi)發(fā)者認(rèn)證)
就是所謂的 Provisioning Profile 。
?
Provisioning Profile 通過(guò) xcode 或者 itunes 導(dǎo)入到 device 中,或者打包到一個(gè)包含 app 和 profile 的 .ipa 文件中。
你可以在 iOS Provisioning Portal 中創(chuàng)建你的 Provisioning Profile 。
新建一個(gè),有一下幾個(gè)步驟:
·為 profile 命名,以后你會(huì)在 xcode 的 organizer , Buid Settings 以及其它一些地方中看到
·選擇你的 certificate
·選擇你的 App ID ,要如 Info.plist 中的一致。
·選擇要應(yīng)用到的設(shè)備。通常,我都是把我的設(shè)備全選的。
?
個(gè)人用途的簽名 Signing
假設(shè)你已經(jīng)有一個(gè)準(zhǔn)備測(cè)試的 App ,而你有 IDP ,并且處理好 Provisioning Profile 的事情了。
現(xiàn)在你清楚已經(jīng)知道它們的邏輯了,如果你新加入,下面這些是你要做的:
1 檢查你的公鑰私鑰,為以后檢查方便,起個(gè)好名吧。
2 用 Keychain Access 來(lái)創(chuàng)建你的開(kāi)發(fā)認(rèn)證。然后下載 Apple 給你的認(rèn)證,雙擊安裝,然后你可以在 Keychain 中看到了吧。
3 下載“ Apple Worldwide Developer Relations Certification Authority Certificate ”( WWDR )也是雙擊安裝,也可以到 Keychain 中看到。
4 檢查你項(xiàng)目的 Bundle ID ,到 Provisioning Portal 中創(chuàng)建一個(gè)一致的 App ID 。
5 在 Provisioning Portal 中加入你想要的 UDID 。(全部加上好了)
6 針對(duì)你的 Certificate 創(chuàng)建 Provisioning Profile, 指定你的 app ID 和 UDID 。
7 下載剛剛創(chuàng)建的 Profile ,拖到你的 xcode Organizer 中。
然后,你就可以 sign 你的 project ,并讓它們?cè)谀愕? device 上運(yùn)行了。
在 Target – Build Settings ,往下滾動(dòng)到 Code Signing 一節(jié)。
試試編輯一下 Debug schema ,它適合于團(tuán)隊(duì)協(xié)作:
在 Automatic ProfileSelector 中選擇“ iPhone Developer ”,你會(huì)看到你的認(rèn)證已經(jīng)自動(dòng)選上了。
一切都搞定了,連接你的 device ,在 xcode 中選擇 Debug build , build & run 。
xcode 會(huì)到你的設(shè)備里裝上這個(gè) provisioning profile ,并運(yùn)行你的 App 。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
