當(dāng)開(kāi)發(fā)者歷經(jīng)磨難、披荊斬棘,完成了一個(gè)iOS項(xiàng)目后,最后的臨門(mén)一腳就是應(yīng)用的內(nèi)測(cè)、部署。那么,在這最后的射門(mén)動(dòng)作中,都有哪些地方需要開(kāi)發(fā)者注意?有哪些方式能夠更好地幫助我們進(jìn)行iOS應(yīng)用的發(fā)布部署?
本文針對(duì)iOS App開(kāi)發(fā)的最后階段來(lái)詳解如何在真機(jī)上進(jìn)行調(diào)試,將App發(fā)送給其他測(cè)試人員進(jìn)行內(nèi)測(cè),以及內(nèi)測(cè)完成后如何將App上傳至App Store進(jìn)行應(yīng)用審核,針對(duì)蘋(píng)果賬號(hào)的類(lèi)型、真機(jī)調(diào)試、打包與崩潰收集進(jìn)行深度剖析。
蘋(píng)果賬號(hào)的類(lèi)型
蘋(píng)果開(kāi)發(fā)者計(jì)劃分為個(gè)人、公司、企業(yè)和教育開(kāi)發(fā)者四個(gè)類(lèi)型。個(gè)人開(kāi)發(fā)者證書(shū)費(fèi)用為$99一年,該賬號(hào)在A(yíng)pp Store銷(xiāo)售者只能顯示個(gè)人的ID。并且,個(gè)人賬號(hào)只能有一個(gè)開(kāi)發(fā)者,100個(gè)蘋(píng)果的iOS設(shè)備UDID測(cè)試。

公司開(kāi)發(fā)者費(fèi)用為$99一年,該賬號(hào)在A(yíng)pp Store銷(xiāo)售者可以顯示類(lèi)似Studios,或者自定義的團(tuán)隊(duì)名稱(chēng)。公司賬號(hào)可以允許多個(gè)開(kāi)發(fā)者協(xié)作開(kāi)發(fā),比個(gè)人多一些帳號(hào)管理的設(shè)置,可以設(shè)置多個(gè)Apple ID,分4種管理級(jí)別權(quán)限,100個(gè)蘋(píng)果的iOS設(shè)備UDID測(cè)試。但是,申請(qǐng)時(shí)需要填寫(xiě)公司的鄧白氏編碼(D-U-N-S),D-U-N-S鄧白氏碼可以在 蘋(píng)果官方網(wǎng)站免費(fèi)申請(qǐng)。
企業(yè)開(kāi)發(fā)者賬號(hào)費(fèi)用為$299一年, 該賬號(hào)開(kāi)發(fā)應(yīng)用不能發(fā)布到App Store,只能企業(yè)內(nèi)部應(yīng)用,蘋(píng)果的iOS設(shè)備UDID數(shù)量不限制。企業(yè)賬號(hào)適合不希望上線(xiàn)App Store,但是需要企業(yè)內(nèi)部,比如1000人的iOS設(shè)備都部署。

特別需要注意的是,其他渠道提供的所謂的企業(yè)證書(shū)實(shí)際上是與他人共用一張企業(yè)證書(shū),蘋(píng)果會(huì)偵測(cè)到這種情況,并進(jìn)行封號(hào)處理。封號(hào)后,包括已經(jīng)使用該證書(shū)安裝了的App都會(huì)無(wú)法繼續(xù)使用。
這些開(kāi)發(fā)者賬號(hào)的申請(qǐng)都需要一個(gè)重要的條件,那就是有一張支持Visa或MasterCard的信用卡。
真機(jī)調(diào)試
使用真機(jī)調(diào)試,必須要使用開(kāi)發(fā)者證書(shū),以及正確填寫(xiě)App ID,配置好Provision Profile,具體流程如下:
- 安裝調(diào)試證書(shū)
- 填寫(xiě) App ID
- 根據(jù) App ID 填寫(xiě) provision profile ,并下載安裝到 Xcode
- 真機(jī)調(diào)試運(yùn)行
怎樣申請(qǐng)開(kāi)發(fā)者證書(shū)?
需要下列幾步:
1.請(qǐng)求CSR文件
- 打開(kāi)鑰匙串訪(fǎng)問(wèn), 從證書(shū)頒發(fā)機(jī)構(gòu)請(qǐng)求證書(shū)
-
填寫(xiě)電子郵件地址,常用名稱(chēng),勾選存儲(chǔ)到磁盤(pán),最后保存CSR文件到指定位置
5.png -
最后保存CSR文件到指定位置
6.png
2.創(chuàng)建調(diào)試證書(shū)
-
選擇CSR文件
7.png -
點(diǎn)擊Download下載,雙擊安裝到鑰匙串匙串
8.png
- 雙擊安裝
可以看到鑰匙串中有了我們剛安裝的證書(shū),左側(cè)有個(gè)三角,點(diǎn)擊展開(kāi)可以看到證書(shū)私鑰,如果沒(méi)有私鑰,則證書(shū)是不可用的,一般這種情況是你在開(kāi)發(fā)者網(wǎng)站上下載了其他Mac上制作的證書(shū),可以從這臺(tái)Mac導(dǎo)出證書(shū)安裝到自己的電腦上。

創(chuàng)建AppID
1. 填寫(xiě)AppID Name
2. 支持推送、Game Center等功能的話(huà)不能創(chuàng)建含有通配符的AppID,所以這里我們選擇Explicit App ID*
3. 勾選需要的服務(wù),然后Continue
添加設(shè)備
1. 填寫(xiě)設(shè)備名稱(chēng)、設(shè)備UDID
2. Register

注意:最多添加100臺(tái)設(shè)備
創(chuàng)建Provisioning Profile
- iOS App Development:真機(jī)調(diào)試Profile(需要選擇iOS設(shè)備,只有包含的設(shè)備可以真機(jī)調(diào)試)
- App Store:上傳到AppStore商店P(guān)rofile
- In House:企業(yè)內(nèi)發(fā)布Profile(所有設(shè)備可以安裝)
- Ad Hoc:Ad Hoc Profile(需要選擇iOS設(shè)備,除了只有包含的設(shè)備可以安裝外與AppStore、Inhouse版本基本沒(méi)有區(qū)別)
1. 選擇AppID

2. 選擇證書(shū)

3. 選擇設(shè)備(只有Development、AdHoc需要選擇設(shè)備)
4. 填寫(xiě)Profile Name

5. 點(diǎn)擊Download下載,雙擊安裝到Xcode
XCode打包
Configurations
默認(rèn)Configurations包含兩個(gè)配置,Debug、Release,可以看到Build Setting里好多配置都區(qū)分了Debug、Release,可以根據(jù)不同的情況配置不同的選項(xiàng),最常用的就是根據(jù)真機(jī)調(diào)試、打包發(fā)布,分別在Debug、Release選擇合適的證書(shū)、Profile。
個(gè)人認(rèn)為,現(xiàn)在的Xcode不用再Duplicate Release配置來(lái)建立專(zhuān)門(mén)打包AppStore或者Adhoc或其它的Configuration,因?yàn)楦杏X(jué)并不會(huì)方便多少,只是省去了選擇證書(shū),但是你還是設(shè)置Archive選項(xiàng)。
一般來(lái)說(shuō),Adhoc、AppStore\Inhouse,二者用的都是同一個(gè)證書(shū),只是Profile不同而已,簡(jiǎn)單的選擇一下Profile,是不是更省事一些呢。
指令集
先說(shuō)一下iOS設(shè)備的指令集:
- arm64:
iPhone 5s, iPhone 6, iPhone6 Plus;
iPad Air, iPad Air 2;
iPad Mini 2, iPad Mini 3;
- armv7s:
iPhone 5, iPhone 5c;
iPad 4;
- armv7:
iPhone 3GS, iPhone 4, iPhone 4S;
iPad, iPad 2, iPad 3, iPad Mini;
- armv6:
iPhone, iPhone 3G;

Architectures
該編譯選項(xiàng)指定了工程支持哪些指令集,如果支持的指令集數(shù)目有多個(gè),就會(huì)編譯出包含多個(gè)指令集二進(jìn)制包,造成最終編譯的包很大。Valid Architectures
該編譯項(xiàng)指定可能支持的指令集,該列表和Architectures列表的交集,將是Xcode最終生成二進(jìn)制包所支持的指令集。
如上圖所示,Architectures 支持的指令集為 armv7、arm64、Valid Architectures 支持的指令集為armv7、armv7s、arm64,這時(shí)只會(huì)生成一個(gè) armv7、arm64 指令集的二進(jìn)制包。
-
Build Active Architecture Only
該編譯項(xiàng)用于設(shè)置是否只編譯當(dāng)前使用的設(shè)備對(duì)應(yīng)的arm指令集。通常情況下,該編譯選項(xiàng)在Debug模式都設(shè)成YES,Release模式都設(shè)成NO。該選項(xiàng)起作用的條件有兩個(gè),必須同時(shí)滿(mǎn)足才會(huì)起作用:
注意:許多用戶(hù)可能會(huì)發(fā)現(xiàn)自己的應(yīng)用安裝不了,這時(shí)候可以看看自己的App支持的指令集,遇到過(guò)幾個(gè)用戶(hù)的指令集只支持arm64,這樣的App在設(shè)備不是arm64的情況下是安裝不了的。
Code Signing

上圖中Code Signing Identity包含的Debug和Release兩項(xiàng),其中,Debug指選擇真機(jī)調(diào)試證書(shū),Release指選擇發(fā)布證書(shū)(AdHoc、AppStore/Inhouse打包都使用發(fā)布證書(shū))。而在 Provisioning Profile中,無(wú)論真機(jī)調(diào)試,還是發(fā)布App,選擇的Profile的App ID要與項(xiàng)目工程的BundleId匹配。
注意:Provisioning Profile的Release這里選擇的Profile,并不一定就是簽名ipa用的Profile,后面會(huì)講到。
導(dǎo)出ipa
導(dǎo)出ipa首先需要選擇ipa版本,導(dǎo)出App Store/AdHoc/企業(yè)版ipa,然后點(diǎn)擊Next。如果Xcode 沒(méi)有登錄企業(yè)開(kāi)發(fā)者賬號(hào),選擇導(dǎo)出企業(yè)版ipa的時(shí)候會(huì)提示添加企業(yè)開(kāi)發(fā)者賬號(hào)到xcode。
選擇證書(shū)

這里就是上面說(shuō)的在工程選擇的證書(shū)、profile可能并不是簽名用的,關(guān)鍵在這里,這里會(huì)顯示已經(jīng)添加到Xcode的開(kāi)發(fā)者賬號(hào)對(duì)應(yīng)的證書(shū)列表,可以選擇簽名用的證書(shū)。如果跟工程設(shè)置的證書(shū)一致,并且Profile匹配,則會(huì)根據(jù)工程配置的證書(shū)、Profile來(lái)簽名導(dǎo)出。如果跟工程配置的證書(shū)不一致,則會(huì)根據(jù)選擇的證書(shū)自動(dòng)查找匹配的Profile來(lái)簽名導(dǎo)出ipa。

這里會(huì)顯示導(dǎo)出的ipa用的是哪一個(gè)證書(shū)、Profile簽名的,Profile旁邊那個(gè)箭頭并不是選擇Profile,然后在Finder中顯示當(dāng)前Profile。 所以導(dǎo)出的最后一步,盡量確認(rèn)一下簽名的證書(shū)、Profile是不是自己指定的。
內(nèi)測(cè)分發(fā)ipa文件
內(nèi)測(cè)分發(fā)ipa文件給測(cè)試人員主要有3種方法:
- 使用iTunes將iPa同步到手機(jī)中;
- 使用itms-services協(xié)議進(jìn)行下載分發(fā);
- 使用第三方工具進(jìn)行下載分發(fā)。
請(qǐng)注意,無(wú)論使用何種形式分發(fā),內(nèi)測(cè)的人數(shù)限制,以及App的UDID限制始終是存在的。如果想新增加測(cè)試人員,開(kāi)發(fā)者仍然需要將UDID寫(xiě)入Provision Profile,重新生成ipa文件進(jìn)行分發(fā)。
使用iTunes進(jìn)行內(nèi)測(cè)分發(fā)
使用iTunes進(jìn)行分發(fā)比較麻煩,需要測(cè)試用戶(hù)使用數(shù)據(jù)線(xiàn)連接裝有iTunes的電腦上,先將ipa文件添加到iTunes,再將iTunes的App同步到手機(jī)上。由于國(guó)內(nèi)用戶(hù)對(duì)iTunes熟悉程度不高,故不推薦大家使用這種方式進(jìn)行內(nèi)測(cè)分發(fā)。
使用itms-services協(xié)議進(jìn)行下載分發(fā)
相比iTunes的分發(fā)方式,使用itms-service 分發(fā)的最大好處是測(cè)試用戶(hù)無(wú)需使用數(shù)據(jù)線(xiàn),只需打開(kāi)Safari中訪(fǎng)問(wèn)包含itms-service連接的頁(yè)面,單擊連接后即可下載IPA文件。
itms-services的原理是itms-services指向一個(gè)plist文件,這個(gè)plist文件包含了ipa文件下載的地址,iOS設(shè)備的Safari會(huì)自動(dòng)將plist中指定的ipa文件下載安裝到本地。
itms-services的麻煩之處就是開(kāi)發(fā)者需要自己搭建一個(gè)服務(wù)器,之后蘋(píng)果在iOS 7.1 以后安裝ipa,寫(xiě)入ipa地址的plist文件的存放地址必須是一個(gè)https的地址.
itms的結(jié)構(gòu)參考如下
<a href="itms-services://?action=download-manifest&url=https://xxx/test.plist">安裝IOS BetaV1.0 </a>
plist 的結(jié)構(gòu)參考如下
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0"><dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string><![CDATA[http://fir.im/xxxxxx]]></string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<integer>0</integer>
<key>url</key>
<string><![CDATA[http://fir.im/xxx]]></string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string><![CDATA[http://fir.im/xxx]]></string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>im.fir</string>
<key>bundle-version</key>
<string><![CDATA[1.3.0]]></string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string><![CDATA[Fir plist Demo]]></string>
</dict>
</dict>
</array>
</dict></plist>
我們可以看到,雖然說(shuō)用戶(hù)比較方便,但對(duì)開(kāi)發(fā)者而言需要寫(xiě)很多東西,還得搭建服務(wù)器,上OpenSSL等,比較麻煩。
使用第三方工具進(jìn)行內(nèi)測(cè)分發(fā)
為了避免開(kāi)發(fā)者使用itms-services而帶來(lái)的額外工作量,可以使用第三方工具如 fir.im ,將ipa快速地進(jìn)行內(nèi)測(cè)分發(fā)。
本文整理自:【CSDN技術(shù)公開(kāi)課】iOSApp研發(fā)的最后沖刺:內(nèi)測(cè)與部署,作者紀(jì)承,演講PPT>>下載地址。