去年8月份的時候由于公司的需求镐确,開發(fā)了一個只在司機(jī)間使用的企業(yè)內(nèi)部的iOS應(yīng)用辫塌,當(dāng)時就打算寫一篇文章來總結(jié)一下了,然而我是重度拖延癥患者臼氨,一直拖著沒完成芭届。一年過去了感耙,今天才想起來這回事持隧,才開始動手寫這篇文章。
企業(yè)內(nèi)部應(yīng)用
企業(yè)內(nèi)部應(yīng)用屡拨,即只在企業(yè)部門和員工內(nèi)部使用、不對外公開的應(yīng)用裂允。蘋果提供了專門的In-House
證書用來發(fā)布這種應(yīng)用,可以分發(fā)給任意的手機(jī)绝编,只要通過一個URL即可下載安裝貌踏,不用上傳到App Stroe
審核。我把企業(yè)內(nèi)部應(yīng)用也叫做In-House
應(yīng)用祖乳。
In-House
應(yīng)用,有時需要根據(jù)部門需求進(jìn)行版本的快速迭代眷昆,因為不需要App Store
審核,所以可以做到隨時修改垦藏,隨時發(fā)布梆暖,節(jié)省了大量的時間。In-House
證書還可以用于應(yīng)用的內(nèi)測分發(fā)厚掷,現(xiàn)在大部分的內(nèi)測分發(fā)平臺如蒲公英,F(xiàn)ir.im等的公測功能就是使用In-House
證書實現(xiàn)的冒黑。
必須具備的兩個條件:
- 企業(yè)開發(fā)者賬號勤哗。99$的普通開發(fā)者賬號不行,必須以企業(yè)的名義申請一個299$的企業(yè)開發(fā)者賬號
Apple Developer Enterprise Program
- 帶SSL證書的域名芒划。企業(yè)內(nèi)部應(yīng)用需要把ipa文件上傳到服務(wù)器欧穴,然后通過一個鏈接來下載安裝泵殴,而蘋果很重視安全性,要求這個鏈接的域名必須具有SSL證書笑诅,支持 https ,否則無法安裝弦叶。
SSL證書其實并不是必需的,可以使用一些知名的云存儲服務(wù)湾蔓,比如亞馬遜的AWS,阿里云等默责,這些大公司的云存儲都支持Https咸包,我用的就是AWS的S3云存儲,但299$的企業(yè)開發(fā)者賬號就避免不了烂瘫。
準(zhǔn)備的文件
-
ipa
文件。 -
plist
文件坟比。名稱必須與ipa
文件一致,用于配置bundle id柠衅、版本號、ipa
文件的URL菲宴、應(yīng)用圖標(biāo)等趋急。 - @1x 和 @2x 的Icon。下載安裝時顯示應(yīng)用圖標(biāo)呜达。
打包
- 創(chuàng)建發(fā)布證書(Production Certificates),選擇
In-House
類型的,過程我就不贅述了勋颖,和其他證書一樣勋锤。
- 創(chuàng)建配置文件(Distribution Provisioning Profiles)
-
在Xcode選擇對應(yīng)的Code Signing 和 Provisioning Profile, Archive
- 導(dǎo)出 ipa 文件
plist 文件
Xcode 5 及其以前打包In-House
應(yīng)用會一起生成ipa
和plist
文件叁执,但Xcode 6 以后就只有ipa
文件了,所以要手動生成 plist
文件谈宛。
文件格式如下:
<?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>[INSERT THE URL FOR YOUR IPA HERE. e.g : https://s3-us-west-2.amazonaws.com/folder/appName-version.ipa]</string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>[INSERT THE URL FOR INSTALLATION @2x ICON HERE. e.g : https://s3-us-west-2.amazonaws.com/folder/images/Icon@2x.png]</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>[INSERT THE URL FOR INSTALLATION ICON HERE. e.g : https://s3-us-west-2.amazonaws.com/folder/images/Icon.png]</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>[INSERT BUNDLE ID HERE]</string>
<key>bundle-version</key>
<string>[INSERT VERSION HERE]</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>[INSERT APP TITLE HERE. The Title will present to the user installing the app]</string>
</dict>
</dict>
</array>
</dict>
</plist>
在plist
文件中輸入ipa
的URL吆录、安裝時顯示的 icon 的url、bundle id恢筝、版本號、安裝前的提示信息撬槽。
發(fā)布與安裝
發(fā)布
把ipa
、配置好的plist
文件和圖標(biāo)一起上傳AWS的S3云存儲上即可侄柔。
安裝
iOS的企業(yè)內(nèi)部應(yīng)用是通過訪問plist
文件來安裝的,因為plist
文件中包含了對應(yīng)的ipa
文件和圖標(biāo)的URL暂题,iPhone會根據(jù)URL自動下載并安裝應(yīng)用程序。
在iPhone的Safari
瀏覽器中輸入:
itms-services://?action=download-manifest&url=https://s3-us-west-2.amazonaws.com/folder/appName-version.plist
首先會詢問是否打開要打開鏈接薪者,點(diǎn)擊“打開”
然后詢問是否要安裝App,點(diǎn)擊“安裝”
自動更新
為了避免每次發(fā)布后都需要通知別人更新App的麻煩事赶站,自動更新是必備的幔虏。與后臺溝通,設(shè)計一個更新接口GET /updates
Query Parameters
name | required | type | description |
---|---|---|---|
platform | YES | String | 平臺陷谱,ios / android |
version | YES | String | 當(dāng)前版本號,比如:1.0.0 |
Response
Status-Code: 200 OK
{
"data": {
"update" : true,
"lastest" : "1.0.1",
"url" : "itms-services://?action=download-manifest&url=https://s3-us-west-2.amazonaws.com/folder/appName-1.0.1.plist"
},
"error": {}
}
App一啟動時烟逊,調(diào)用GET /updates
接口傳遞平臺參數(shù)和當(dāng)前版本號給后臺進(jìn)行檢查,后臺判斷當(dāng)前版本是否為最新版宪躯,如果不是最新版,則返回最新版本號和對應(yīng)的下載鏈接访雪,然后用瀏覽器打開返回的URL進(jìn)行安裝即可。
代碼如下:
func upgrade()
{
let params = [
"platform" : "ios",
"version" : CKAppInfo.releaseVersion()
]
ObjectRequest(URLRequest: UpdateRouter.CheckUpdate(params)).load(
successHandler: { (promotion: Promotion?) -> Void in
SWLog(promotion)
if promotion?.update == true { // different version
let alert = DVAlertController(title: "Upgrade", message: "update to latest version", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Upgrade", style: UIAlertActionStyle.Default, handler: { (_) -> Void in
let url = NSURL(string:promotion!.url!)
UIApplication.sharedApplication().openURL(url!)
}))
alert.show(animated: true, completion: nil)
SWLog("different version")
}
}, failHandler: { (error) -> Void in
self.creatAlert("checkout upgrade failed")
})
}
不信任的企業(yè)開發(fā)者
如果你的手機(jī)是 iOS 9 系統(tǒng)坝橡,那么第一次打開企業(yè)級應(yīng)用時,你并不能打開App计寇,而是看到下面的信息:
蘋果是一個極其重視安全性的公司脂倦,iOS 9 以后番宁,安裝的企業(yè)級應(yīng)用在第一次打開之前必須要用戶手動去信任這些App贝淤,參考Guidelines for installing custom enterprise apps on iOS。具體步驟如下:
- 打開 設(shè)置 --> 通用 --> 描述文件與設(shè)備管理
- 在 企業(yè)級應(yīng)用 分組下播聪,點(diǎn)擊 信任 開發(fā)者的證書