iOS 支持以無(wú)線方式安裝自定的企業(yè)內(nèi)部應(yīng)用拆融,而無(wú)需使用 iTunes 或 App Store者吁。應(yīng)用的格式必須為 .ipa刀闷,并且使用企業(yè)內(nèi)部預(yù)置描述文件進(jìn)行構(gòu)建根时。無(wú)線安裝要求:
XML 清單文件(本節(jié)已有描述)
可讓設(shè)備訪問(wèn) Apple iTunes 服務(wù)器的網(wǎng)絡(luò)配置
對(duì)于 iOS 7.1 或更高版本,使用 HTTPS
為了安裝應(yīng)用胃珍,用戶使用特殊的 URL 前綴從您的網(wǎng)站上下載清單文件梁肿。您可以通過(guò)短信或電子郵件分發(fā)用于下載清單文件的 URL,或?qū)⑵淝度雱?chuàng)建的另一企業(yè)應(yīng)用中堂鲜。
您負(fù)責(zé)設(shè)計(jì)和托管用于分發(fā)應(yīng)用的網(wǎng)站栈雳。請(qǐng)確定用戶已通過(guò)認(rèn)證(可能是使用基本認(rèn)證或基于目錄的認(rèn)證),并確定網(wǎng)站可通過(guò)內(nèi)聯(lián)網(wǎng)或互聯(lián)網(wǎng)進(jìn)行訪問(wèn)缔莲。您可以將應(yīng)用和清單文件放入隱藏目錄或任何可使用 HTTPS 讀取的位置哥纫。
【注】創(chuàng)建自助服務(wù)門戶時(shí),請(qǐng)考慮在用戶的主屏幕中添加一個(gè) Web Clip痴奏,以便他們可以輕松返回門戶以獲取更多信息蛀骇,如新的配置描述文件、推薦的 App Store 應(yīng)用以及允許他們?cè)?MDM 解決方案中進(jìn)行注冊(cè)读拆。
準(zhǔn)備以無(wú)線方式分發(fā)的企業(yè)內(nèi)部應(yīng)用
為準(zhǔn)備以無(wú)線方式分發(fā)的企業(yè)內(nèi)部應(yīng)用擅憔,請(qǐng)構(gòu)建歸檔版本(.ipa 文件)和用于啟用無(wú)線分發(fā)和應(yīng)用安裝的清單文件。
使用 Xcode 來(lái)創(chuàng)建應(yīng)用歸檔檐晕。使用分發(fā)證書(shū)給應(yīng)用簽名暑诸,并在歸檔中包括企業(yè)內(nèi)部預(yù)置描述文件。有關(guān)構(gòu)建和歸檔應(yīng)用的更多信息辟灰,請(qǐng)?jiān)L問(wèn) iOS 開(kāi)發(fā)者網(wǎng)站或 Xcode 幫助个榕。
關(guān)于無(wú)線清單文件
清單文件是一個(gè) XML plist 文件,可供 Apple 設(shè)備用來(lái)從您的 Web 服務(wù)器上查找芥喇、下載和安裝應(yīng)用西采。清單文件由 Xcode 創(chuàng)建,使用的是您在共享用于企業(yè)分發(fā)的歸檔應(yīng)用時(shí)所提供的信息继控。
以下欄是必填項(xiàng):
URL:應(yīng)用 (.ipa) 文件的完全限定 HTTPS URL
display-image:57 x 57 像素的 PNG 圖像械馆,在下載和安裝過(guò)程中顯示。指定圖像的完全限定 URL
full-size-image:512 x 512 像素的 PNG 圖像武通,表示 iTunes 中相應(yīng)的應(yīng)用
bundle-identifier:應(yīng)用的包標(biāo)識(shí)符霹崎,與 Xcode 項(xiàng)目中指定的完全一樣
bundle-version:應(yīng)用的包版本,在 Xcode 項(xiàng)目中指定
title:下載和安裝過(guò)程中顯示的應(yīng)用的名稱
僅對(duì)于 iOS 8 中的“報(bào)刊雜志”應(yīng)用冶忱,以下欄必填:
newsstand-image:一張全尺寸 PNG 圖像尾菇,用于顯示在“報(bào)刊雜志”書(shū)架上
UINewsstandBindingEdge 和 UINewsstandBindingType:鍵必須和“報(bào)刊雜志”應(yīng)用的 info.plist 中的鍵匹配
UINewsstandApp:表示該應(yīng)用是“報(bào)刊雜志”應(yīng)用
樣本清單文件還包含可選鍵。例如,如果應(yīng)用文件太大错沽,并且想要在執(zhí)行錯(cuò)誤檢驗(yàn)(TCP 通信通常會(huì)執(zhí)行該檢驗(yàn))的基礎(chǔ)上確保下載的完整性,可以使用 MD5 鍵眶拉。
通過(guò)指定項(xiàng)目數(shù)組的附加成員千埃,您可以使用一個(gè)清單文件安裝多個(gè)應(yīng)用。
構(gòu)建網(wǎng)站
將這些項(xiàng)目上傳到網(wǎng)站上可供已認(rèn)證的用戶訪問(wèn)的區(qū)域:
應(yīng)用 (.ipa) 文件
清單 (.plist) 文件
您的網(wǎng)站可以是鏈接到清單文件的單個(gè)頁(yè)面忆植。用戶輕點(diǎn) Web 鏈接后會(huì)下載清單文件放可,并觸發(fā)下載和安裝。
以下是示例鏈接:
<a href="itms-services://?action=download-manifest&url=https://example.com/manifest.plist">Install App</a>
請(qǐng)勿添加歸檔應(yīng)用 (.ipa) 的網(wǎng)站鏈接朝刊。載入清單文件時(shí)耀里,設(shè)備會(huì)下載該 .ipa 文件。雖然 URL 的協(xié)議部分是“itms-services”拾氓,但 iTunes Store 并不參與此過(guò)程冯挎。
此外,請(qǐng)確定 .ipa 文件可通過(guò) HTTPS 進(jìn)行訪問(wèn)咙鞍,并且您的站點(diǎn)已使用 iOS 信任的證書(shū)進(jìn)行了簽名房官。如果自簽名證書(shū)沒(méi)有受信任的錨點(diǎn)并且無(wú)法由 iOS 設(shè)備驗(yàn)證,安裝會(huì)失敗续滋。
設(shè)定服務(wù)器 MIME 類型
您可能需要配置 Web 服務(wù)器翰守,讓清單文件和應(yīng)用文件可正確傳輸。
對(duì)于 Server 應(yīng)用疲酌,請(qǐng)將 MIME 類型添加到網(wǎng)頁(yè)服務(wù)的 MIME 類型設(shè)置:
application/octet-stream ipa
text/xml plist
對(duì)于微軟的互聯(lián)網(wǎng)信息服務(wù)器 (IIS)蜡峰,請(qǐng)使用 IIS Manager 在服務(wù)器的“屬性”頁(yè)面中添加 MIME 類型:
.ipa application/octet-stream
.plist text/xml
無(wú)線 iOS 應(yīng)用分發(fā)故障診斷
如果無(wú)線應(yīng)用分發(fā)失敗,并顯示“無(wú)法下載”信息:
請(qǐng)確定應(yīng)用已正確進(jìn)行簽名朗恳。測(cè)試方法是使用 Apple Configurator 2 將它安裝到設(shè)備上湿颅,然后查看是否發(fā)生錯(cuò)誤。
請(qǐng)確定清單文件的鏈接是否正確僻肖,清單文件是否可供網(wǎng)絡(luò)用戶訪問(wèn)肖爵。
請(qǐng)確定 .ipa 文件(在清單文件中)的 URL 是否正確,并且該 .ipa 文件是否可供網(wǎng)絡(luò)用戶通過(guò) HTTPS 訪問(wèn)臀脏。
網(wǎng)絡(luò)配置要求
如果設(shè)備連接到封閉式內(nèi)部網(wǎng)絡(luò)劝堪,那么您必須允許它訪問(wèn)以下站點(diǎn):
https://ax.init.itunes.apple.com:使用蜂窩移動(dòng)網(wǎng)絡(luò)下載應(yīng)用時(shí),設(shè)備會(huì)限制其當(dāng)前文件大小揉稚。如果無(wú)法訪問(wèn)此站點(diǎn)秒啦,安裝可能會(huì)失敗。
https://ppq.apple.com:設(shè)備會(huì)聯(lián)系此網(wǎng)站搀玖,檢查用來(lái)給預(yù)置描述文件簽名的分發(fā)證書(shū)狀態(tài)余境。
提供更新的應(yīng)用
您自己分發(fā)的應(yīng)用不會(huì)自動(dòng)更新。有新版本時(shí),應(yīng)通知用戶進(jìn)行更新并指導(dǎo)他們安裝應(yīng)用芳来。請(qǐng)考慮讓應(yīng)用檢查更新含末,并在打開(kāi)應(yīng)用時(shí)通知用戶。請(qǐng)確保通知中提供了 itms-services 鏈接即舌。您還可以使用應(yīng)用內(nèi)部的 openURL 來(lái)安裝更新佣盒。
如果想要用戶保留他們?cè)O(shè)備上儲(chǔ)存的應(yīng)用數(shù)據(jù),請(qǐng)確保新版本與要替換的版本使用的捆綁標(biāo)識(shí)符相同顽聂,并告知用戶在安裝新版本之前不要?jiǎng)h除舊版本肥惭。
預(yù)置描述文件過(guò)期之前,請(qǐng)?jiān)L問(wèn) iOS 開(kāi)發(fā)者網(wǎng)站為應(yīng)用創(chuàng)建新描述文件紊搪。對(duì)于首次安裝應(yīng)用的用戶蜜葱,請(qǐng)使用新預(yù)置描述文件創(chuàng)建新應(yīng)用歸檔 (.ipa)。
如果用戶已有該應(yīng)用耀石,您不妨設(shè)定發(fā)布下一個(gè)版本的時(shí)間牵囤,并在該版本中包括新預(yù)置描述文件,這樣用戶在使用應(yīng)用工作時(shí)不會(huì)被打斷滞伟。如果不想這樣做奔浅,您可以僅分發(fā)新的 .mobileprovision 文件,這樣用戶便不必再次安裝該應(yīng)用诗良。新的預(yù)置描述文件會(huì)覆蓋應(yīng)用歸檔中已有的描述文件汹桦。
分發(fā)預(yù)置描述文件自簽發(fā)之日起 12 個(gè)月后過(guò)期。過(guò)期后鉴裹,系統(tǒng)會(huì)刪除描述文件舞骆,應(yīng)用將不會(huì)啟動(dòng)。
您可以使用 MDM 安裝和管理預(yù)置描述文件径荔,然后用戶通過(guò)應(yīng)用更新或使用 MDM 進(jìn)行下載并安裝督禽。
如果您的分發(fā)證書(shū)過(guò)期,應(yīng)用將不會(huì)啟動(dòng)总处,而您需要使用新的分發(fā)證書(shū)來(lái)重新構(gòu)建應(yīng)用狈惫。分發(fā)證書(shū)自簽發(fā)之日起三年內(nèi)有效,或者在您的 Apple Developer Enterprise Program(Apple 開(kāi)發(fā)者企業(yè)級(jí)計(jì)劃)成員資格過(guò)期之前一直有效鹦马,二者以先到者為準(zhǔn)胧谈。若要防止證書(shū)過(guò)期,請(qǐng)確保在成員資格過(guò)期之前先進(jìn)行續(xù)訂荸频。
您可以擁有同時(shí)處于活躍狀態(tài)的兩個(gè)證書(shū)菱肖,并且它們彼此獨(dú)立。第二個(gè)證書(shū)提供了一個(gè)重疊期旭从,讓您能夠在第一個(gè)證書(shū)過(guò)期前更新應(yīng)用稳强。從 iOS Dev Center 請(qǐng)求第二個(gè)分發(fā)證書(shū)時(shí)场仲,請(qǐng)確保不要撤銷第一個(gè)證書(shū)。
證書(shū)驗(yàn)證
用戶首次打開(kāi)應(yīng)用時(shí)退疫,系統(tǒng)會(huì)通過(guò)聯(lián)系 Apple 的 OCSP 服務(wù)器來(lái)驗(yàn)證分發(fā)證書(shū)渠缕。如果證書(shū)已撤銷,應(yīng)用將不會(huì)啟動(dòng)褒繁。為了驗(yàn)證狀態(tài)褐健,設(shè)備必須能夠訪問(wèn) ocsp.apple.com。
OCSP 響應(yīng)會(huì)在設(shè)備上緩存一段時(shí)間(由 OCSP 服務(wù)器指定)澜汤,當(dāng)前為 3 到 7 天之間。在重新啟動(dòng)設(shè)備和緩存的響應(yīng)過(guò)期之前舵匾,將不會(huì)再次檢查證書(shū)的有效性俊抵。如果當(dāng)時(shí)收到撤銷命令,系統(tǒng)將阻止應(yīng)用運(yùn)行坐梯。
【警告】撤銷分發(fā)證書(shū)會(huì)導(dǎo)致使用該證書(shū)簽名的所有應(yīng)用失效徽诲。只有萬(wàn)不得已時(shí)才應(yīng)撤銷證書(shū),比如確定專用密鑰已丟失或確信證書(shū)已遭破解吵血。
示例 iOS 應(yīng)用清單文件
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- array of downloads. -->
<key>items</key>
<array>
<dict>
<!-- an array of assets to download -->
<key>assets</key>
<array>
<!-- software-package: the ipa to install. -->
<dict>
<!-- required. the asset kind. -->
<key>kind</key>
<string>software-package</string>
<!-- optional. md5 every n bytes. will restart a chunk if md5 fails. -->
<key>md5-size</key>
<integer>10485760</integer>
<!-- optional. array of md5 hashes for each "md5-size" sized chunk. -->
<key>md5s</key>
<array>
<string>41fa64bb7a7cae5a46bfb45821ac8bba</string>
<string>51fa64bb7a7cae5a46bfb45821ac8bba</string>
</array>
<!-- required. the URL of the file to download. -->
<key>url</key>
<string>https://www.example.com/apps/foo.ipa</string>
</dict>
<!-- display-image: the icon to display during download.-->
<dict>
<key>kind</key>
<string>display-image</string>
<!-- optional. indicates if icon needs shine effect applied. -->
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://www.example.com/image.57x57.png</string>
</dict>
<!-- full-size-image: the large 512x512 icon used by iTunes. -->
<dict>
<key>kind</key>
<string>full-size-image</string>
<!-- optional. one md5 hash for the entire file. -->
<key>md5</key>
<string>61fa64bb7a7cae5a46bfb45821ac8bba</string>
<key>needs-shine</key>
<true/>
<key>url</key><string>https://www.example.com/image.512x512.jpg</string>
</dict>
</array>
<key>metadata</key>
<dict>
<!-- required -->
<key>bundle-identifier</key>
<string>com.example.fooapp</string>
<!-- optional (software only) -->
<key>bundle-version</key>
<string>1.0</string>
<!-- required. the download kind. -->
<key>kind</key>
<string>software</string>
<!-- optional. displayed during download; typically company name -->
<key>subtitle</key>
<string>Apple</string>
<!-- required. the title to display during the download. -->
<key>title</key>
<string>Example Corporate App</string>
</dict>
</dict>
</array>
</dict>
</plist>