這篇博客將會(huì)以一個(gè)完整的過(guò)程來(lái)實(shí)現(xiàn)一個(gè)iOS App提交審核的過(guò)程。在這個(gè)過(guò)程中,我們會(huì)涉及到證書(shū)、代碼簽名、授權(quán)文件、真機(jī)調(diào)試、開(kāi)發(fā)者賬號(hào)等一些概念,我也會(huì)有所解釋。推薦大家先去看《iOS應(yīng)用分發(fā)與內(nèi)測(cè)(一)》《iOS應(yīng)用分發(fā)與內(nèi)測(cè)(二)》《iOS開(kāi)發(fā)Provionsioning Profile解析》這幾篇博客,看完以后會(huì)對(duì)發(fā)布App的流程非常熟悉。
我先對(duì)一些概念做一個(gè)講解:
【證書(shū) Certification】
證書(shū)是對(duì)電腦開(kāi)發(fā)資格的認(rèn)證,每個(gè)開(kāi)發(fā)者賬號(hào)有一套。一個(gè)證書(shū)里面包含私鑰和公鑰。私鑰是保存在你的電腦上的,別人無(wú)法得到。公鑰是可以從蘋(píng)果開(kāi)發(fā)者網(wǎng)站下載后得到的。一個(gè)證書(shū)只有公鑰和私鑰配對(duì)成功后,才能認(rèn)證身份。比如說(shuō),你想要讓你的某個(gè)朋友的電腦也能使用你的證書(shū)真機(jī)調(diào)試或者發(fā)布應(yīng)用,于是你從你的開(kāi)發(fā)者網(wǎng)站上面下載了證書(shū),讓你的朋友在他的電腦上安裝,這還不夠,因?yàn)榇藭r(shí)他還只有公鑰,你需要從你的電腦上的“鑰匙串訪(fǎng)問(wèn)”中導(dǎo)出p12文件(保存了你的私鑰),讓你的朋友電腦安裝,這樣他的電腦才有“資格”真機(jī)調(diào)試。
當(dāng)然,證書(shū)也分為開(kāi)發(fā)證書(shū)(Developer Certification)和發(fā)布證書(shū)(Distribution Certification)。開(kāi)發(fā)證書(shū)可以用來(lái)真機(jī)測(cè)試。發(fā)布證書(shū)可以制作測(cè)試版和發(fā)布版的程序。
【代碼簽名 Code Signing】
可能大家學(xué)iOS剛開(kāi)始想要去真機(jī)調(diào)試的時(shí)候,都會(huì)去Build Setting里面配置Code Signing這個(gè)東西。但是其實(shí)我們不知道這個(gè)是什么東西。只要在提到上面的證書(shū)的時(shí)候,才能說(shuō)得清代碼簽名。當(dāng)我們真機(jī)調(diào)試的時(shí)候,程序會(huì)進(jìn)行打包,然后通過(guò)Xcode安裝到我們的手機(jī)上。 也只有在電腦安裝了證書(shū)之后,Build Setting里面的Code Signing才可以選擇,而選擇項(xiàng)恰恰就是你安裝的證書(shū),是哪些證書(shū)呢?你可以去鑰匙串訪(fǎng)問(wèn)中看到,兩者是一一對(duì)應(yīng)的。用簡(jiǎn)單粗暴的話(huà)說(shuō)就是:用這個(gè)證書(shū)來(lái)簽名你的應(yīng)用,以驗(yàn)證你這個(gè)應(yīng)用到底有什么權(quán)限(真機(jī)調(diào)試呢還是發(fā)布呢),確保了應(yīng)用的安全性和合法性。而目前為止,蘋(píng)果提供了三種簽名方式
(1)Ad-hoc:可以進(jìn)行真機(jī)調(diào)試和內(nèi)測(cè),只要你知道了那些設(shè)備的UDID(設(shè)備唯一標(biāo)識(shí)符)即可。
(2)In-house:企業(yè)賬號(hào)專(zhuān)用。
(3)App-Store:發(fā)布到App Store。
【授權(quán)文件 Provisioning Profile】
有時(shí)候也稱(chēng)為配置文件。授權(quán)文件是對(duì)iOS設(shè)備的授權(quán),文件內(nèi)主要記錄了三樣?xùn)|西:App ID(Bundle Identifier)、設(shè)備的唯一標(biāo)識(shí)符(UDID)、和證書(shū)。用一句話(huà)說(shuō)就是:使被授權(quán)的設(shè)備可以安裝或調(diào)試 授權(quán)文件中記錄的App ID對(duì)應(yīng)的程序。在開(kāi)發(fā)者網(wǎng)站上創(chuàng)建授權(quán)文件的時(shí)候會(huì)選擇App ID,UDID。同樣對(duì)于兩種證書(shū),也有兩種配置文件:開(kāi)發(fā)授權(quán)文件(Developer Provisioning Profile)和發(fā)布授權(quán)文件(Distribution Provisioning Profile)。
在真機(jī)調(diào)試或者發(fā)布的時(shí)候,也需要在Build Setting-->Code Signing-->Provisioning Profile選中對(duì)應(yīng)的授權(quán)文件。真機(jī)調(diào)試的過(guò)程其實(shí)就是一個(gè)檢查匹配的過(guò)程:檢查當(dāng)前App的Bundle Identifier和授權(quán)文件中的App ID是否匹配;檢查程序的代碼簽名和授權(quán)文件中包括的證書(shū)是否匹配;檢查當(dāng)前運(yùn)行設(shè)備的UDID和授權(quán)文件中寫(xiě)入的Device ID是否一致;只有成功完成匹配后,才能成功的運(yùn)行。詳細(xì)說(shuō)明請(qǐng)參考《iOS開(kāi)發(fā)Provionsioning Profile解析》。
【設(shè)備唯一標(biāo)識(shí)符 UDID 】
使用該標(biāo)識(shí)符可以區(qū)分每一臺(tái)唯一的iOS設(shè)備。可通過(guò)Xcode-->Window-->Device來(lái)獲取。
【開(kāi)發(fā)者賬號(hào)】
作為一個(gè)普通的開(kāi)發(fā)者,還是建議去買(mǎi)一個(gè)開(kāi)發(fā)者賬號(hào),99美元也不算太貴。在Xcode7之后其實(shí)不需要開(kāi)發(fā)者賬號(hào)就可以免證書(shū)調(diào)試了。但是發(fā)布應(yīng)用到App Store就必須要賬號(hào)了??赡芪覀?cè)诠竟ぷ鳎瑫?huì)有公司的證書(shū),但是我們自己私下開(kāi)發(fā),就必須要使用自己的賬號(hào)了。況且要用一些高級(jí)的功能,比如推送、應(yīng)用內(nèi)購(gòu)買(mǎi)j就必須要賬號(hào)了。
我下面開(kāi)始來(lái)講解整個(gè)發(fā)布流程:
(1)打開(kāi)鑰匙串訪(fǎng)問(wèn)-->證書(shū)助理-->從證書(shū)頒發(fā)機(jī)構(gòu)請(qǐng)求證書(shū),如下圖所示:
。
在用戶(hù)電子郵件地址中寫(xiě)入你想要收到的郵件地址,我一般寫(xiě)Apple ID的郵箱,下面的常用名稱(chēng)隨意即可,你也可以寫(xiě)入你的名字,最好是英文。下面的CA電子郵件地址默認(rèn)“必需”不用管。最后選擇"存儲(chǔ)到磁盤(pán)"即可。
保存到電腦上以后,是如下的一個(gè)文件:
。
可以看到這是一個(gè)CSR文件,也就是證書(shū)請(qǐng)求(簽名)文件,我們可以這個(gè)文件去蘋(píng)果的開(kāi)發(fā)者網(wǎng)站上請(qǐng)求一個(gè)證書(shū)。
(2)進(jìn)入蘋(píng)果開(kāi)發(fā)者網(wǎng)站: https://developer.apple.com/ 。然后選擇Account進(jìn)入,需要你輸入你的Apple ID和密碼進(jìn)入。最近我發(fā)現(xiàn)這個(gè)頁(yè)面又發(fā)生了改版。進(jìn)入后如圖所示:
。
配置證書(shū)、授權(quán)文件選擇左邊那個(gè)Certificates,Identifier &Profiles .等到可以發(fā)布的時(shí)候選擇右邊的iTunes Connect. 現(xiàn)在我們選擇左邊的Certificates進(jìn)入:
。
左邊導(dǎo)航欄列出了我們要配置的所有東西。Certificates就是證書(shū),Idetifiers就是配置我們的App ID,Devices就是添加我們的真機(jī)調(diào)試設(shè)備,最后的Provisioning Profile就是配置授權(quán)文件。
(3)首先配置證書(shū):
可以看到需要我們上傳Certificate Signing Request文件,就是我們剛剛從鑰匙串訪(fǎng)問(wèn)中導(dǎo)出的CSR文件,
。
如果是要開(kāi)發(fā)證書(shū),就選擇Development-->iOS App Development. 如果是要發(fā)布證書(shū),選擇下面的Pruduct-->App Store and Ad Hoc. 兩者的操作其實(shí)是一樣的,我這里以配置開(kāi)發(fā)證書(shū)為例。點(diǎn)擊Continue下一步,
。
需要我們創(chuàng)建CSR文件,蘋(píng)果也給出了如何創(chuàng)建CSR文件的步驟,應(yīng)該和我講的是一樣的,因?yàn)槲覀円呀?jīng)創(chuàng)建好了,所以直接Continue下一步:
。
直接選擇我們的CSR文件進(jìn)去即可。Continue下一步即可,
。
此時(shí)表示證書(shū)已經(jīng)創(chuàng)建完成了,點(diǎn)擊Download下載到電腦上。此時(shí)的這個(gè)開(kāi)發(fā)證書(shū)就可以讓我們進(jìn)行真機(jī)調(diào)試了。我們?cè)龠M(jìn)行同樣的步驟,在上面選擇一個(gè)發(fā)布證書(shū),創(chuàng)建完成后下載到本地。
。
如圖,后綴是.cer表示是一個(gè)證書(shū),很明顯,左邊的是開(kāi)發(fā)證書(shū),右邊的是發(fā)布證書(shū)。我們分別雙擊進(jìn)行安裝。安裝完成后,我們可以進(jìn)入鑰匙串訪(fǎng)問(wèn)查看,
。
可以看到我們的兩個(gè)證書(shū)都已經(jīng)成功安裝了。
(4)我們創(chuàng)建一個(gè)新項(xiàng)目,作為我們調(diào)試和發(fā)布的項(xiàng)目,名稱(chēng)為MyFirstApp. 當(dāng)然,現(xiàn)在這個(gè)是個(gè)空項(xiàng)目,就算提交審核了也是不會(huì)發(fā)布的。在這只是做一個(gè)演示。一個(gè)App發(fā)布的最低的要求就是要有icon圖標(biāo),否則打包是會(huì)失敗的。所以我需要導(dǎo)入圖標(biāo)。在等下提交審核的時(shí)候還需要App在各個(gè)屏幕下的截圖。對(duì)于這兩者的資源,都要提前準(zhǔn)備好。僅僅作為一個(gè)測(cè)試,我把這個(gè)資源已經(jīng)準(zhǔn)備好了,https://github.com/chenyufeng1991/iOS-ScreenshotsAndIcon- 。對(duì)于想快速測(cè)試這個(gè)流程,又不想麻煩的去生成圖標(biāo)截圖的,可以先暫時(shí)使用這里面的資源。
(5)應(yīng)用開(kāi)發(fā)完成后,我們繼續(xù)去開(kāi)發(fā)者網(wǎng)站上面配置App ID,選擇左側(cè)導(dǎo)航欄-->Identifier-->App IDs,這里可以看到我們創(chuàng)建的所有的應(yīng)用的ID . 此時(shí)我們新建一個(gè):
.
這里主要要填入兩個(gè)地方,在 App ID Description中填入這個(gè)app的簡(jiǎn)單描述,只要不輸入@,&等這些非法字符即可。在下面的Budle ID 中填入你應(yīng)用的Bundle Identifier,比如我這里的Bundle ID就是:com.chenyufengweb.MyFirstApp.
最下面你還可以選擇需要哪些應(yīng)用服務(wù),比如推送,Apple Pay,iCloud等服務(wù),如果你的應(yīng)用使用到,都需要勾選上。點(diǎn)擊Continue下一步,
。
這一步是讓你確認(rèn)App中包含的信息,確定無(wú)誤的話(huà)點(diǎn)擊Register注冊(cè)這個(gè)app。完成后,就可以在列表中看到我們注冊(cè)完成的應(yīng)用了,
。
(6)現(xiàn)在需要來(lái)注冊(cè)我們需要真機(jī)調(diào)試的設(shè)備了??梢钥吹竭@里可以注冊(cè)的設(shè)備有Apple TV,Apple Watch,iPad,iPhone,iPod這幾種,表示你的應(yīng)用可以在這些設(shè)備上真機(jī)調(diào)試。
.
Name可以輸入這臺(tái)設(shè)備的名稱(chēng),可以任意取。UDID輸入唯一標(biāo)識(shí)符,可以用上面提到的方式去獲取。
。
可以看到我們注冊(cè)的開(kāi)發(fā)者賬號(hào)可以添加各個(gè)類(lèi)型的設(shè)備各100臺(tái)。對(duì)于個(gè)人開(kāi)發(fā)者來(lái)說(shuō)已經(jīng)足夠了。上面的信息確認(rèn)無(wú)誤后,點(diǎn)擊Register注冊(cè)即可。注冊(cè)完成后,列表中就會(huì)顯示出該賬號(hào)下的所有設(shè)備:
。
(7)最后我們來(lái)配置授權(quán)文件,點(diǎn)擊manually generate profiles手動(dòng)創(chuàng)建一個(gè)授權(quán)文件,
。
。
在這里,我們可以看到,授權(quán)文件和證書(shū)一樣,也是分為開(kāi)發(fā)的和發(fā)布的。如我上面所說(shuō),授權(quán)文件會(huì)把App ID、設(shè)備UDID、證書(shū)都打包進(jìn)來(lái)。我這里以開(kāi)發(fā)的為例進(jìn)行創(chuàng)建。選擇iOS App Development,點(diǎn)擊Contunue下一步:
。
在這一步選擇我上面創(chuàng)建的App ID。點(diǎn)擊Continue下一步:
。
這一步是選擇證書(shū),因?yàn)槭且灰粚?duì)應(yīng)的,所在在這里只能選擇開(kāi)發(fā)證書(shū),而不能選擇發(fā)布證書(shū),點(diǎn)擊Continue下一步,
。
這里是要選擇真機(jī)調(diào)試的設(shè)備,只有選中的設(shè)備才能調(diào)試該應(yīng)用。
。
在這一步是為這個(gè)授權(quán)文件取一個(gè)名字,最好在名字里面說(shuō)明這是開(kāi)發(fā)的還是發(fā)布的,便于以后區(qū)分。點(diǎn)擊Continue下一步。
。
創(chuàng)建完成后,點(diǎn)擊Download[下載](http://m.2cto.com/soft)。對(duì)于發(fā)布授權(quán)證書(shū),也按同樣的方式進(jìn)行創(chuàng)建。兩個(gè)文件下載完成后,如下所示:
。
直接雙擊這兩個(gè)文件,授權(quán)文件就會(huì)自動(dòng)安裝到Xcode中去。
(8)來(lái)到我們Xcode的項(xiàng)目中,來(lái)配置證書(shū)和授權(quán)文件。
進(jìn)入Build Setting-->Code Signing-->Code Signing Identity,在Debug中選擇開(kāi)發(fā)證書(shū),在Release中選擇發(fā)布證書(shū)。(想要看電腦上安裝了哪些證書(shū),可以去鑰匙串訪(fǎng)問(wèn)哦)。
在下面的Provisioning Profile中選擇授權(quán)文件,Debug處選擇開(kāi)發(fā)授權(quán)文件,Release處選擇發(fā)布授權(quán)文件。配置完后如下所示:
。
經(jīng)過(guò)以上步驟,我們就可以在指定設(shè)備上運(yùn)行該應(yīng)用了。
(9)我們的應(yīng)用已經(jīng)開(kāi)發(fā)完畢,現(xiàn)在要提交到App Store了。要用到的工具就是iTunes Connect. 再次進(jìn)入蘋(píng)果開(kāi)發(fā)者網(wǎng)站,點(diǎn)擊iTunes Connect.進(jìn)入:
。
進(jìn)入后的主頁(yè)面如下,
。
可以看到在iTunes Connect.中可以管理我們已經(jīng)上線(xiàn)或者即將上線(xiàn)的應(yīng)用。點(diǎn)擊進(jìn)入“我的App”. 然后點(diǎn)擊左上角的“+”號(hào)創(chuàng)建一個(gè)新應(yīng)用,
。
可能你的Name已經(jīng)被占用了,那就換一個(gè)。點(diǎn)擊Create創(chuàng)建。
選擇左上角的App Information,這里可以簡(jiǎn)單配置App的信息,比如右側(cè)的Category,表示你App的分類(lèi),比如音樂(lè)、購(gòu)物等等,一級(jí)分類(lèi)是必須選擇的。點(diǎn)擊右上角Save保存。
左側(cè)第二個(gè)Pricing and Availiablity是一些價(jià)格和購(gòu)買(mǎi)信息,我這里選擇免費(fèi)。點(diǎn)擊右上角Save保存。
第三個(gè)1.0 Prepare for Submission則是一些發(fā)布的詳細(xì)信息,首先要有不同屏幕上的五張截屏,如果你的應(yīng)用不適配到iPad上,那么可以不上傳iPad的截圖。
。
。
同時(shí)可以添加這個(gè)應(yīng)用的描述,關(guān)鍵字,以及支持的網(wǎng)站。下面的Build構(gòu)建先不用,等下我們會(huì)使用Xcode上傳的。
。
同時(shí)還要上傳Icon,這里的Icon必須鑰匙1024*1024的,以及你應(yīng)用的分級(jí)、和你的地址、聯(lián)系方法等信息。可以按你的實(shí)際情況填寫(xiě)即可。
。
最下面的位置需要你提供一個(gè)測(cè)試賬號(hào),也就是使用該賬號(hào)可以登錄你的App,并使用所有的功能,方便為蘋(píng)果審核。Version Release則是說(shuō)你想要在審核通過(guò)后直接發(fā)布還是手動(dòng)設(shè)置時(shí)間發(fā)布。按你的實(shí)際需求設(shè)置。然后點(diǎn)擊右上角的Save保存。
(10)在iTunes Connect.上面的設(shè)置基本結(jié)束了。我們?cè)俅位氐絏code中,來(lái)打包我們的程序。
此時(shí)需要把你的手機(jī)連上Xcode或者在調(diào)試設(shè)備中選擇Generic iOS Device,然后選擇Product-->Archive(如果調(diào)試設(shè)備選擇了模擬器,則Archive不可點(diǎn)擊)。就會(huì)出現(xiàn)如下界面:
。
這里就是對(duì)你的應(yīng)用程序進(jìn)行打包。如果我們僅僅只是想要導(dǎo)出.ipa文件,可以直接選擇右側(cè)的Export,然后你可以把這個(gè)ipa文件放到其他的內(nèi)測(cè)平臺(tái)上去分發(fā)。由于我們就是直接想發(fā)布到App Store上面,并且已經(jīng)在iTunes Connect.上面做好了設(shè)置,所以我們直接點(diǎn)擊“Upload to App Store”即可。
.
在這過(guò)程中,可能會(huì)等的比較久。時(shí)候還會(huì)提交失敗,因?yàn)榭赡苁悄愠绦蛑械哪承﹩?wèn)題,或者提交了同一個(gè)版本,如下是因?yàn)槲抑貜?fù)提交了1.0版本,然后報(bào)錯(cuò)了。
。
在成功修復(fù)后,就可以再次upload了。成功以后出現(xiàn)如圖界面:
。
此時(shí),我們就把應(yīng)用成功提交到iTunes Connect.上面了。
(12)再次來(lái)到iTunes Connect.中,找到Build的地方,發(fā)現(xiàn)已經(jīng)跟剛才不一樣了。出現(xiàn)了"Select a build before you submit your app",也就是讓我們選擇一個(gè)版本提交。點(diǎn)擊后出現(xiàn)如下界面:
.
可以看到我們剛剛upload了兩個(gè)版本。比如我選擇2.0(2)進(jìn)行提交。此時(shí)的Build如下:
.
然后點(diǎn)擊Save保存。最后點(diǎn)擊旁邊的“Submit for Review”,也就是提交審核。最后還是會(huì)出現(xiàn)一個(gè)頁(yè)面讓你確認(rèn)一些信息:
。
其中包括加密確認(rèn)、顯示第三方內(nèi)容、和廣告問(wèn)題。根據(jù)實(shí)際情況選擇提交。提交成功后,上面就出現(xiàn)了Waiting For Review 等待審核的字樣:
。
等過(guò)幾天蘋(píng)果審核通過(guò)后,你就能發(fā)布這款A(yù)pp了。
看一百遍不如去做一次。流程看起來(lái)復(fù)雜,但是只要去做一次,就會(huì)發(fā)現(xiàn)其實(shí)還是很有邏輯的。希望大家能發(fā)布越來(lái)越好玩的App。