本文轉(zhuǎn)載自
鏈接 http://blog.csdn.net/close_marty/article/details/38441903
作者 close_marty
最近設(shè)計(jì)的同事找到我毅舆,說有沒有什么方法可以很方便的獲取和安裝我們應(yīng)用最新的測試包,然后還給我看了別人通過微信朋友圈分享測試包的做法御滩。好吧箕肃,雖然我手頭沒有外網(wǎng)服務(wù)器盅安,那我就在內(nèi)網(wǎng)搭一個(gè)吧,然后先在內(nèi)網(wǎng)實(shí)現(xiàn)通過wifi直接安裝測試包。
首先大概說下OTA吧畅姊,OTA就是over the air反粥,是一種無線發(fā)布方式卢肃,它可以實(shí)現(xiàn)app的在線安裝疲迂,不再需要數(shù)據(jù)線。目前國內(nèi)有不少團(tuán)隊(duì)通過使用企業(yè)證書+OTA的方式來發(fā)布自己的應(yīng)用莫湘,所以你會看到有的網(wǎng)頁上有某個(gè)應(yīng)用的廣告尤蒿,你點(diǎn)擊之后就直接提示你是否安裝這個(gè)app,一旦你確定幅垮,它就直接在你的手機(jī)上安裝了腰池,這中間完全沒有經(jīng)過appstore的參與和審核。這也是實(shí)現(xiàn)在不越獄的手機(jī)上安裝未經(jīng)審核app的方法忙芒。不過我們自己的測試包都是使用開發(fā)者證書來打包的示弓,所以只有指定的設(shè)備才可以安裝。
要實(shí)現(xiàn)OTA呵萨,需要準(zhǔn)備下面這三個(gè)文件奏属,然后把他們放到自己的web服務(wù)器上,通過訪問你的web頁面來實(shí)現(xiàn)在線安裝甘桑。
*.ipa文件拍皮,也就是你的安裝包,可以是開發(fā)者證書簽名的跑杭,也可以是企業(yè)證書铆帽,看你的用途和目的
*.plist文件,這個(gè)描述文件主要是用來說明應(yīng)用的安裝信息的德谅,下面一個(gè)簡單的sample
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<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>http://${YOUR_DOMAIN_DOTCOM}/${PATH_TO_BETA_IF_ANY}/${APPLICATION_NAME}.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>${BUNDLE_IDENTIFIER}</string>
<key>bundle-version</key>
<string>${APPLICATION_VERSION}</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>${DISPLAY_NAME}</string>
</dict>
</dict>
</array>
</dict>
</plist>
其中指定了ipa文件的具體存放路徑爹橱。這個(gè)plist可以在打包的過程中自動(dòng)生成,具體方法可以參考這里窄做,我不再贅述
http://aaronparecki.com/articles/2011/01/21/1/how-to-distribute-your-iOS-apps-over-the-air
也可以通過正常流程打包完ipa包之后愧驱,根據(jù)ipa文件來生成plist文件,可參考第三方的工具
https://github.com/sveinungkb/ios-ota-buddy
還可以自己手動(dòng)去編寫這么一個(gè)文件或者自己寫個(gè)腳本去生成椭盏,只要包含這些主要信息即可组砚。
- 一個(gè)或簡單或復(fù)雜的發(fā)布頁面,目的是提供一個(gè)itms-services協(xié)議的鏈接掏颊,讓用戶訪問這個(gè)鏈接即可實(shí)現(xiàn)在線安裝糟红。一個(gè)最簡單的html頁面就是下面這樣。
<a href="itms-services://?action=download-manifest&url=https://xxx.xxx.xxx/xxx.plist">Install App</a>
整個(gè)OTA的核心就是蘋果的itms-services協(xié)議乌叶, safari通過解析類似于itms-services://?action=download-manifest&url=https://xxx.xxx.xxx/xxxx.plist 這樣的一個(gè)鏈接來實(shí)現(xiàn)在線安裝盆偿。url就是你的*.plist文件所在的地址,在iOS7.1以前准浴,這個(gè)url是沒有限制的事扭,在7.1之后,蘋果做了修改乐横,要求這個(gè)url必須是可信任的https鏈接求橄。其他地方的鏈接并沒有要求今野。
對于https鏈接,目前主流的有三種解決方案罐农。
方案1:交給公司解決腥泥,讓公司提供一個(gè)可信的https連接,這個(gè)最直接啃匿。
方案2:采用第三方的網(wǎng)站提供的https連接,比較常見的就是把plist上傳到dropbox蛆楞,然后分享出去溯乒,它的外鏈就是https的(不過dropbox已經(jīng)被墻了,so...),國內(nèi)網(wǎng)盤的外鏈貌似都是http的豹爹,基本可以忽略
方案3:使用自建的https連接
我們是個(gè)小團(tuán)隊(duì)裆悄,采用的方案3,但是這里有個(gè)問題臂聋,https是需要有證書的光稼,而可信的證書必須是由知名的CA所頒發(fā),當(dāng)然孩等,向這些知名的CA申請證書是需要money的艾君。由于我使用OTA的目的只是在團(tuán)隊(duì)內(nèi)部分發(fā)一下測試包而已,所以我們采用自簽名的證書來加密https肄方。
自簽名分為兩個(gè)步驟冰垄,首先生成自己的CA根證書,再用這個(gè)根證書去簽名我們服務(wù)器所使用的證書权她。
- 生成自己的根證書
生成自己的密鑰對
openssl genrsa -out ca.key 1024
生成證書請求文件虹茶,并使剛剛的key來加密CA根證書
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
其中-x509選項(xiàng)表示生成自簽名的證書,生成證書會要求填一系列的東西隅要,此時(shí)可以任意填寫蝴罪,也可以直接回車,Common Name (e.g. server FQDN or YOUR name) []:步清,這一項(xiàng)建議填寫一個(gè)便于識別的名字要门,比如可以是你的名字或者代號。
完成到這里你就已經(jīng)生成了自己的根證書了尼啡,你也和那些知名CA機(jī)構(gòu)一樣暂衡,用根證書給別人的證書簽名啦。崖瞭。撒花狂巢。。书聚。不過由于你不知名唧领,沒有人會認(rèn)可你的證書藻雌,所以你簽名的所有證書都是不會被信任的。
- 生成服務(wù)器使用的證書斩个,并用自己的根證書簽名
步驟基本同上:
生成一個(gè)密鑰對
openssl genrsa -out server.key 1024
生成證書請求文件
openssl req -new -key server.key -out server.csr
這里又需要填寫之前的那一堆東西胯杭,值得注意的是,
Common Name (e.g. server FQDN or YOUR name) []:
這里一定要填寫你的https連接所對應(yīng)的域名或者是服務(wù)器Ip, 比如xxx.xxx.com或者是192.168.25.68這樣受啥。
接下來我們需要使用根證書對這個(gè)證書進(jìn)行簽名做个,但是在簽名之前,需要做一些準(zhǔn)備工作滚局, 我們需要構(gòu)建這樣一個(gè)目錄結(jié)構(gòu)居暖,在當(dāng)前目錄新建文件夾demoCA,
進(jìn)入demoCA藤肢,在demoCA下創(chuàng)建兩個(gè)文件index.txt和serial 太闺,以及文件夾newcerts,其中index.txt的內(nèi)容為空嘁圈,serial的內(nèi)容為01省骂。
完成之后,就可以開始簽名了
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
這條命令中涉及的所有文件都是在之前步驟中生成的最住,如果缺少了什么文件钞澳,最好回去檢查一下步驟是否有問題。
命令執(zhí)行后會要求確認(rèn)是否進(jìn)行簽名涨缚,確認(rèn)即可略贮。
到這里,證書的構(gòu)造已經(jīng)完成仗岖,最終的目錄結(jié)構(gòu)應(yīng)該是這個(gè)樣子
- 讓iOS設(shè)備信任你的根證書
之前說過了逃延,自簽名的證書是不可信的,所以你需要讓通過OTA方式來安裝app的手機(jī)去信任你的證書轧拄。
方式1:把你的根證書文件揽祥,也就是ca.crt 放到web服務(wù)器的某個(gè)位置,然后iOS設(shè)備通過safari去訪問這個(gè)文件就會直接提示用戶安裝證書檩电,點(diǎn)擊安裝即可拄丰。(只能是safari,不能是其他瀏覽器)
方式2:通過email方式俐末,把ca.crt作為附件通過郵件發(fā)送到iOS設(shè)備上料按,然后也可以打開安裝
方式3:其他我不知道的方式,比如什么iPhone配置實(shí)用工具之類的卓箫,總之呢载矿,就是讓iOS設(shè)備去打開并安裝ca.crt這個(gè)文件。
我采用的方式1烹卒,我把ca.crt的url和itms-services鏈接一起放在一個(gè)簡單的發(fā)布頁面install.html里面的闷盔,然后把html的地址生成個(gè)了一個(gè)二維碼弯洗,發(fā)給大家。其他人掃描二維碼逢勾,訪問這個(gè)頁面牡整,然后點(diǎn)擊兩下,第一下安裝證書溺拱,第二下安裝app逃贝,就可以搞定了。
安裝之后迫摔,這個(gè)證書文件就會變?yōu)榭尚诺牧饲镉尽?梢栽趇OS設(shè)備上的通用-描述文件中查看這個(gè)證書的狀態(tài)攒菠。
- 修改itms-services協(xié)議中的url為https
比如itms-services://?action=download-manifest&url=https://172.16.8.53/OTA-Install/xxxxxxx..plist,當(dāng)然如果已經(jīng)是https的歉闰,那就不用改了辖众。
至于ipa文件是否使用https并不重要,蘋果只要求itms-services協(xié)議中的url字段使?用https和敬。
至此就可以在iOS7.1及以上的設(shè)備中通過OTA方式安裝了凹炸。
附1:
前面的 openssl req 和 openssl ca 命令,有可能需要增加一個(gè)config參數(shù)
-config ..\conf\openssl.cnf
不過我沒有加昼弟,所以默認(rèn)使用的
Using configuration from /System/Library/OpenSSL/openssl.cnf
附2:Apache服務(wù)器的openssl配置(mac OSX 環(huán)境)
- 確保 httpd.conf 中 LoadModule ssl_module 這項(xiàng)設(shè)置是有效的
- 在 httpd-ssl.conf 中啤它,確保下?面的配置有效,并且對應(yīng)的crt和key文件正確(這兩個(gè)文件就是我們之前自己生成的服務(wù)器使用的證書和密鑰)
SSLCertificateFile "/private/etc/apache2/ssl/server.crt"
SSLCertificateKeyFile "/private/etc/apache2/ssl/server.key" - 記得重啟服務(wù)器
- 檢查https是否生效可以訪問 https:localhost