通过JS包获取APP版本信息

过去我司APP开发人员是通过“内网web页面上传测试包至OSS”的方式提供APP测试包服务,满足测试人员的下载安装需求。这在实际使用过程中并未遇到什么问题,但打开OSS目录就不太美观了。举个例子,某iOS APP的OSS目录内文件命名是这样的,有v1.0.0.ipaxxxx(包名).ipa1.ipa20240101.ipa等等。

在与团队内部沟通后,我们统一了命名格式:**包名 + 版本号**(可能会有人说漏了开发环境标识,我们在OSS目录设计之初,就将环境作为了目录名来标识,所以此处不用考虑这个问题)。由于web页面仅负责文件上传,不会变更文件名称,所以这十分考验APP开发人员的仔细程度。

在实行了一段时间后,情况有了很大改善,但命名不规范、版本号不一致问题依旧存在,那是否有方法能够一劳永逸的彻底解决该问题呢?其实问题的本质其实是web页面能否获取上传包文件的内容信息。而很幸运的是,目前JS已经有了这么一个npm拓展包:app-info-parser

代码其实非常简单,通过异步方式传入File对象,app-info-parser就可以解析并返回APP包的相关信息。
iOS的APP信息(敏感数据已处理)iOS的APP信息(敏感数据已处理)

Android的APP信息(敏感数据已处理)Android的APP信息(敏感数据已处理)

下面提供一个读取文件内容并输出调整后命名的Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>

<div>
<input id="file" type="file"/>
<button id="upload">分析</button>
</div>
<script src="//unpkg.com/browse/app-info-parser/dist/app-info-parser.min.js"></script>
<script type="text/javascript">
document.getElementById('upload').addEventListener('click', () => {
const file = document.getElementById('file').files[0]
const fileSuffix = file.name.split('.').pop()
const parser = new window.AppInfoParser(file)

parser.parse().then(result => {
let fileName = ''
if (fileSuffix === 'ipa') {
fileName = `${result.CFBundleIdentifier}_${result.CFBundleShortVersionString}.${fileSuffix}`
} else if (fileSuffix === 'apk') {
fileName = `${result.package}_${result.versionName}.${fileSuffix}`
}

document.getElementById('result').innerText = `文件名称:${fileName}`
})
})
</script>
</body>
</html>

按命名规则调整的Android 钉钉APP(示例)按命名规则调整的Android 钉钉APP(示例)


评论区