开源一个APK、IPA安装包文件的js解析器 ———— app-info-parser

背景

最近公司内部的一个管理安装包的平台准备进行重构,之前安装包上传的姿势是这样的

捡肥皂

不好意思,放错了,是这样的:

  1. 前端选择ipa或者apk文件上传到后端

  2. 后端解析出安装包的名称、版本号、图标等信息之后再上传到存储云

  3. 后端将安装包存储url、名称、版本号等保存到数据库

这个姿势有什么问题呢?很明显,太磨叽了。肥皂,哦不,安装包需要经过两次网络传输:从前端传到后端再传到存储云。安装包一般体积都不小,两次传输会浪费很长时间。

那,怎么快点捡到肥皂防止被 gang ?考虑一下这个姿势

安全捡肥皂

不好意思,又放错了,是这样的:

  1. 前端选择ipa或者apk文件
  2. js解析安装包的名称、版本号、图标
  3. 将安装包、图标直传到存储云,上传成功的回调中将安装包url、名称、版本号、图标等信息发送给后端

安装包只需要经过一次传输,另一次则是相对而言可以忽略不计的ajax请求

因为捡肥皂时间短,被gang的几率也会小很多(大雾

造轮子

背景已经介绍完了,那么剩下的问题就是,怎么在前端解析出安装包的内容信息?有没有现有的轮子?

按照惯例,到全球最大的同性交友网站找找轮子,确实能找到一些,但是在经过一轮尝试和比较之后,发现普遍存在以下一些问题:

  • 兼容性差:对于异常情况考虑不够周全,解析容易出错或者信息不全
  • 使用体验不好
  • 不支持解析安装包图标

但需求还是得做呀,那就自己造一个吧。

安利正式开始

安装

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

使用

使用NPM引入

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

script引入

<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>

按需加载

如果只需要解析安卓安装包或者iOS安装包中的一种,可以使用只引入对应的解析器减少打包体积

  • 解析安卓安装包

    const ApkParser = require('app-info-parser/src/apk')
    const parser = new AppInfoParser('../packages/test.apk')
    parser.parse().then(result => {
      console.log('app info ----> ', result)
      console.log('icon base64 ----> ', result.icon)
    }).catch(err => {
      console.log('err ----> ', err)
    })
    
  • 解析iOS安装包

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

最后

源码地址:https://github.com/chenquincy/app-info-parser

我没有在要star(严肃脸

0%