11.26 IPA & APK 這樣玩,前端大佬真優秀,應用導入解析

一、背景概述

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

IPA & APK 這樣玩,前端大佬真優秀,應用導入解析

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

二、項目分析

經過對 fabu.love 源碼一番研讀之後,發現該項目若要作為第三方平臺的“備胎”,提前要先解決以下幾個問題:

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

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

三、app-info-parser 簡介

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

IPA & APK 這樣玩,前端大佬真優秀,應用導入解析

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 說明文檔。

3.3 瀏覽器使用示例



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

四、iOS itms-services 協議

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

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

基於該協議用戶就可以從 Safari 瀏覽器直接打開上述格式的 itms-services 協議的鏈接,即可在 iOS 設備上直接安裝鏈接所指向的應用。協議中的 url 參數指向的是一個 plist 文件的 url 鏈接,該文件是一個 XML 格式的配置文件,以下是 iOS 安裝包的 plist 文件模板:



<plist>
<dict>
\titems
\t<array>
\t\t<dict>
\t\t\tassets
\t\t\t<array>
\t\t\t\t<dict>
\t\t\t\t\tkind
\t\t\t\t\t<string>software-package/<string>
\t\t\t\t\turl
<string>{{{ downloadUrl }}}/<string>
\t\t\t\t\t
md5-size
<integer>{{{ fileSize }}}/<integer>
\t\t\t\t/<dict>
\t\t\t\t <dict>
kind
<string>display-image/<string>

needs-shine
<true>
url
<string>{{{ iconUrl }}}/<string>
/<dict>
\t\t\t/<array>
\t\t\tmetadata
\t\t\t<dict>
\t\t\t\tbundle-identifier
\t\t\t\t<string>{{{ bundleID }}}/<string>
\t\t\t\tbundle-version
\t\t\t\t<string>{{{ versionStr }}}/<string>
\t\t\t\tkind
\t\t\t\t<string>software/<string>
\t\t\t\ttitle
\t\t\t\t<string>{{{ appName }}}/<string>
\t\t\t/<dict>
\t\t/<dict>
\t/<array>
/<dict>
/<plist>

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

五、總結

本文介紹了 fabu.love 應用發佈平臺和 app-info-parser Apk 和 Ipa 應用包解析插件,除此之外還介紹了

iOS itms-services 協議。對應用發佈平臺感興趣的小夥伴,可以參考一下 fabu.love 這個項目,如果遇到問題的話,歡迎一起討論。

IPA & APK 這樣玩,前端大佬真優秀,應用導入解析

六、參考資源

  • Github - app-info-parser
  • Github - fabu.love

我自己是一名從事了多年的前端老程序員,小編為大家準備了新出的前端編程學習資料,免費分享給大家!

如果你也想學習前端,那麼幫忙轉發一下然後再關注小編後私信【1】可以得到我整理的這些前端資料了(私信方法:點擊我頭像進我主頁有個上面有個私信按鈕)


分享到:


相關文章: