近期公司为了方便管理内部多个不一样版本的测试包,打算在公司内部搭建一个相似蒲公英/fir.im 的安装包管理平台。通过本人的一番搜索在 Github 上发现了 fabu.love 这个项目,基于该项目搭建的应用发布平台,可支持安装包管理、检查更新,灰度发布等功能。此外该项目采用先后端分离的开发方式进行开发,前端技术栈采用 Vue + Element UI
,后端技术栈采用 Node.js + Koa
,这对于我这个伪全栈来讲是一个不错的选择。html
fabu.love 这个项目提供 Docker 和源码部署两种方式,做者推荐使用 Docker 方式进行部署,为了快速验证平台效果,本人也是采用 Docker 方式部署。在公司一些小伙伴的配合下,咱们完成了第一阶段的测试,得出的结论是基本能知足公司内部的需求。但把结果汇报给 Boss 以后,Boss 又提出了一个需求,若公司目前使用的付费应用分发平台出现异常时,fabu.love 这个平台可否在关键的时刻顶上。对于这个问题,当时我没法给出明确的答复,由于那时我对该项目并无深刻了解且该平台也未通过深度的测试。为了能给出一个较为明确回复,我开始了 fabu.love 项目的源码之旅。前端
通过对 fabu.love 源码一番研读以后,发现该项目若要做为第三方平台的“备胎”,提早要先解决如下几个问题:java
针对前面的两个问题,经过修改项目的源码,咱们都已经解决了,主要的解决方案是等安装包上传成功并成功解析后,把安装包和 iOS 平台对应的 plist 文件同步上传到第三方云存储,好比七牛云。对于第三个问题,咱们也初步制定了处理方案。在研读该项目源码的过程当中,发现了一个用于解析安装包的插件 —— app-info-parser,接下来咱们来介绍一下 app-info-parser。ios
app-info-parser 是一个解析器用于解析 .ipa
或 .apk
文件。当解析完成后,它会以 JSON 的形式返回 AndroidManifest.xml
或 Info.plist
文件中的内容。该解析插件同时支持 Node.js 和浏览器平台。git
npm install app-info-parser # or yarn yarn add app-info-parser
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
<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
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 文件。浏览器
本文介绍了 fabu.love 应用发布平台和 app-info-parser Apk 和 Ipa 应用包解析插件,除此以外还介绍了 iOS itms-services 协议。对应用发布平台感兴趣的小伙伴,能够参考一下 fabu.love 这个项目,若是遇到问题的话,欢迎一块儿讨论。