關於 web service, unity, blogger 等軟體工程筆記

讓 Safari 能從自家網站安裝企業版 iOS Apps (Enterprise Apps) 的設定筆記

Edit icon 沒有留言
Install iOS App using Safari

工作需求,已經使用企業開發者帳號 (Apple Developer Enterprise Program) 包成 *.ipa (IOS App 安裝檔),要將該 ipa 檔案放置到我們自己的網站伺服器,iOS 使用者能夠透過該網站連結,直接下載並且安裝該 App 的環境設定筆記。

準備檔案

  • .ipa,最後包裝後的 ipa binary file
  • .plist,描述 app 安裝資訊,參考下節
  • .png/.jpeg,APP icon 圖檔,準備 57x57 以及 512x512,在 .plist 設定圖檔位置

設定 MIME types

  • .ipa -> application/octet-stream
  • .plist -> text/xml

由於我們檔案放在 AWS S3 上,因此在上傳 .ipa & .plist 兩個檔案時,必須修改其 Metadata,新增 header CONTENT-TYPE 設定檔案的 MIME types。

安裝資訊 plist 內容

參考 [1],複製以下資料另存檔案為 *. plist,注意檔案格式必須是 UTF-8 without BOM:

<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. -->
                  <!-- 選擇性,設定 Chunk 大小,例如 10485760 表示 10 MB,ipa 檔案每 10 MB 就會有一個 md5  -->
                  <!-- will restart a chunk if md5 fails. -->
                  <key>md5-size</key>
                  <integer>10485760</integer>
                  <!-- optional.  array of md5 hashes. -->
                  <!-- 選擇性,若有設定 Chunk 大小,根據檔案切分成 n 個 Chunk,就有 n 個 MD5。若沒有設定 Chunk,則填整個檔案的 md5 -->
                  <key>md5s</key>
                  <array>
                     <string>41fa64bb7a7cae5a46bfb45821ac8bba</string>
                     <string>51fa64bb7a7cae5a46bfb45821ac8bba</string>
                  </array>
                  <!-- required.  the URL of the file to download. -->
                  <!-- 必須,ipa 檔案位置 -->
                  <key>url</key>
                  <string>http://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. icon needs shine effect applied. -->
                  <!-- 選擇,ICON Shine/Gloss 效果是否開啟-->
                  <key>needs-shine</key>
                  <true />
                  <key>url</key>
                  <string>http://www.example.com/image.57×57.png</string>
               </dict>
               <!-- full-size-image: the large 512×512 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>http://www.example.com/image.512×512.jpg</string>
               </dict>
            </array>
            <key>metadata</key>
            <dict>
               <!-- required -->
               <!-- 必須,可以用 7-zip 解開 ipa,從中找到 Info.plist 來看 -->
               <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>
  • md5 可以不設定,但會少一層檢查機制,用戶端將無法驗證檔案是否正確
    • 可以利用 OnlineMD5 來算整個檔案 md5 或是自己找工具來計算 chunk md5
    • 後續自行使用 Golang 開發工具來算分塊 md5 checksum,細節可參考這篇文章

建立下載連結

.ipa 以及 .plist 都已上傳到網路伺服器後,設定並修改下載連結,使用 Safari 點擊該連結時,便會跳出系統安裝訊息;

<a href="itms-services://?action=download-manifest&url=https://example.com/manifest.plist">Install APP</a>

請注意 iOS7 以後,限制 plist 位置必須是 HTTPS 連線,否則會出現憑證不合無法下載安裝的錯誤。

從網路上查到,使用自己簽署憑證 (Self-signed certificate) 的 HTTPS 連線,若使用者沒有安裝該自己簽署的憑證,還是無法安裝 App,比較簡單的方式是直接找 CA 幫忙簽張憑證設定 HTTPS。

Reference

沒有留言: