在前端 IPA & APK 還能這樣玩

1、背景概述

近期公司爲了方便管理內部多個不一樣版本的測試包,打算在公司內部搭建一個相似蒲公英/fir.im 的安裝包管理平臺。通過本人的一番搜索在 Github 上發現了 fabu.love 這個項目,基於該項目搭建的應用發佈平臺,可支持安裝包管理、檢查更新,灰度發佈等功能。此外該項目採用先後端分離的開發方式進行開發,前端技術棧採用 Vue + Element UI,後端技術棧採用 Node.js + Koa,這對於我這個僞全棧來講是一個不錯的選擇。html

fabu.love 這個項目提供 Docker 和源碼部署兩種方式,做者推薦使用 Docker 方式進行部署,爲了快速驗證平臺效果,本人也是採用 Docker 方式部署。在公司一些小夥伴的配合下,咱們完成了第一階段的測試,得出的結論是基本能知足公司內部的需求。但把結果彙報給 Boss 以後,Boss 又提出了一個需求,若公司目前使用的付費應用分發平臺出現異常時,fabu.love 這個平臺可否在關鍵的時刻頂上。對於這個問題,當時我沒法給出明確的答覆,由於那時我對該項目並無深刻了解且該平臺也未通過深度的測試。爲了能給出一個較爲明確回覆,我開始了 fabu.love 項目的源碼之旅。前端

2、項目分析

通過對 fabu.love 源碼一番研讀以後,發現該項目若要做爲第三方平臺的「備胎」,提早要先解決如下幾個問題:java

  • 上傳的包存在分發平臺所在的服務器上,當併發量高的時候,確定扛不住;
  • iOS 企業證書版安裝時使用的 itms-services 協議對應的 plist 文件(XML 類型)是經過服務端渲染生成的,此外應用下載頁使用的是短網址,也是須要在服務端作處理,高併發的時候也會存在問題;
  • 應用下載頁面未對下載進行驗證並限制下載地址的有效期,沒法防止惡意下載。

針對前面的兩個問題,經過修改項目的源碼,咱們都已經解決了,主要的解決方案是等安裝包上傳成功併成功解析後,把安裝包和 iOS 平臺對應的 plist 文件同步上傳到第三方雲存儲,好比七牛雲。對於第三個問題,咱們也初步制定了處理方案。在研讀該項目源碼的過程當中,發現了一個用於解析安裝包的插件 —— app-info-parser,接下來咱們來介紹一下 app-info-parser。ios

3、app-info-parser 簡介

app-info-parser 是一個解析器用於解析 .ipa.apk 文件。當解析完成後,它會以 JSON 的形式返回 AndroidManifest.xmlInfo.plist 文件中的內容。該解析插件同時支持 Node.js 和瀏覽器平臺。git

app-info-parser-browser-support.jpg

3.1 安裝 app-info-parser

npm install app-info-parser
# or yarn
yarn add app-info-parser

3.2 Node.js 使用示例

const AppInfoParser = require('app-info-parser')
const parser = new AppInfoParser('../packages/test.apk') // or xxx.ipa
  
parser.parse().then(result => {
  console.log('app info ----> ', result)
  console.log('icon base64 ----> ', result.icon)
}).catch(err => {
  console.log('err ----> ', err)
})

除了導入 AppInfoParser 解析器以外,在使用過程當中還能夠按需導入 IPA 或 APK 安裝包的解析器,具體能夠參考 app-info-parser 說明文檔。github

3.3 瀏覽器使用示例

<input type="file" name="file" id="file" onchange="fileSelect()">
<script src="/dist/app-info-parser.js"></script>
<script>
function fileSelect () {
  const files = document.getElementById('file').files
  const parser = new AppInfoParser(files[0])
  parser.parse().then(result => {
    console.log('app info ----> ', result)
    console.log('icon base64 ----> ', result.icon)
  }).catch(err => {
    console.log('err ----> ', err)
  })
}
</script>

fabu.love 是在後臺對安裝包進行解析,爲了加快用戶下載的速度並減小對發佈平臺的壓力,咱們還須要把安裝包再次上傳到第三方雲存儲,這樣的話安裝包就須要兩次傳輸。若是在前端解析安裝包的話,就能夠在成功解析和成功上傳以後,再把安裝包的信息和對應的下載地址一次性提交到後端。shell

4、iOS itms-services 協議

itms-service 是 Apple 爲 iOS 企業用戶提供的無線分發安裝方式所使用的協議,使用這種方式發佈應用不須要經過 App Store,任何 iOS 設備均可以安裝企業用戶經過這種方式發佈的應用而沒有設備數目的限制。itms-service 協議的格式以下:npm

itms-services://?action=download-manifest&url=http://domain/ios/manifest.plist

基於該協議用戶就能夠從 Safari 瀏覽器直接打開上述格式的 itms-services 協議的連接,便可在 iOS 設備上直接安裝連接所指向的應用。協議中的 url 參數指向的是一個 plist 文件的 url 連接,該文件是一個 XML 格式的配置文件,如下是 iOS 安裝包的 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>{{{ downloadUrl }}}</string>
                    <key>md5-size</key>
          <integer>{{{ fileSize }}}</integer>
                </dict>
                 <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>{{{ iconUrl }}}</string>
        </dict>
            </array>
            <key>metadata</key>
            <dict>
                <key>bundle-identifier</key>
                <string>{{{ bundleID }}}</string>
                <key>bundle-version</key>
                <string>{{{ versionStr }}}</string>
                <key>kind</key>
                <string>software</string>
                <key>title</key>
                <string>{{{ appName }}}</string>
            </dict>
        </dict>
    </array>
</dict>
</plist>

在 fabu.love 項目中是經過 mustache 模板引擎來動態生成 iOS 應用所對應的 plist 文件。瀏覽器

5、總結

本文介紹了 fabu.love 應用發佈平臺和 app-info-parser Apk 和 Ipa 應用包解析插件,除此以外還介紹了 iOS itms-services 協議。對應用發佈平臺感興趣的小夥伴,能夠參考一下 fabu.love 這個項目,若是遇到問題的話,歡迎一塊兒討論。

6、參考資源

相關文章
相關標籤/搜索