Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在前端 IPA & APK 还能这样玩

在前端 IPA & APK 还能这样玩

作者头像
阿宝哥
发布于 2019-11-27 07:38:13
发布于 2019-11-27 07:38:13
1.3K00
代码可运行
举报
文章被收录于专栏:全栈修仙之路全栈修仙之路
运行总次数:0
代码可运行

一、背景概述

近期公司为了方便管理内部多个不同版本的测试包,打算在公司内部搭建一个类似蒲公英/fir.im 的安装包管理平台。经过本人的一番搜索在 Github 上发现了 fabu.love 这个项目,基于该项目搭建的应用发布平台,可支持安装包管理、检查更新,灰度发布等功能。此外该项目采用前后端分离的开发方式进行开发,前端技术栈采用 Vue + Element UI,后端技术栈采用 Node.js + Koa,这对于我这个伪全栈来说是一个不错的选择。

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.xmlInfo.plist 文件中的内容。该解析插件同时支持 Node.js 和浏览器平台。

3.1 安装 app-info-parser
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install app-info-parser
# or yarn
yarn add app-info-parser
3.2 Node.js 使用示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 浏览器使用示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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 是在后台对安装包进行解析,为了加快用户下载的速度并减少对发布平台的压力,我们还需要把安装包再次上传到第三方云存储,这样的话安装包就需要两次传输。如果在前端解析安装包的话,就可以在成功解析和成功上传之后,再把安装包的信息和对应的下载地址一次性提交到后端。

四、iOS itms-services 协议

itms-service 是 Apple 为 iOS 企业用户提供的无线分发安装方式所使用的协议,使用这种方式发布应用不需要通过 App Store,任何 iOS 设备都可以安装企业用户通过这种方式发布的应用而没有设备数目的限制。itms-service 协议的格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
itms-services://?action=download-manifest&url=http://domain/ios/manifest.plist

基于该协议用户就可以从 Safari 浏览器直接打开上述格式的 itms-services 协议的链接,即可在 iOS 设备上直接安装链接所指向的应用。协议中的 url 参数指向的是一个 plist 文件的 url 链接,该文件是一个 XML 格式的配置文件,以下是 iOS 安装包的 plist 文件模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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 这个项目,如果遇到问题的话,欢迎一起讨论。

六、参考资源

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
不通过App Store实现ios应用分发下载安装
最近公司的项目准备着手宣传工作了,宣传手册上要印制App的下载地址二维码,但是客户端应用还未上线,需要一种临时的方案解决应用分发下载问题,通常ios应用必须通过苹果应用商店才能下载安装,但是也可以看到一些应用没有通过苹果应用商店也能下载安装,比如下面的兔兔助手。
业余草
2019/03/04
5.9K1
iOS系统在线下载安装ipa文件,以及跳转描述文件信任证书的实现
1、利用 itms-services 和 plist 文件,在线下载安装 ipa 文件。
德顺
2019/11/13
22.6K0
iOS系统在线下载安装ipa文件,以及跳转描述文件信任证书的实现
通过OTA的方式在局域网分发iOS应用
Jianbo
2018/01/08
2.3K0
通过OTA的方式在局域网分发iOS应用
iOS无线安装企业账号应用
iOS 支持以无线方式安装自定的企业内部应用,而无需使用 iTunes 或 App Store。应用的格式必须为 .ipa,并且使用企业内部预置描述文件进行构建。无线安装要求: XML 清单文件(本节已有描述) 可让设备访问 Apple iTunes 服务器的网络配置 对于 iOS 7.1 或更高版本,使用 HTTPS 为了安装应用,用户使用特殊的 URL 前缀从您的网站上下载清单文件。您可以通过短信或电子邮件分发用于下载清单文件的 URL,或将其嵌入创建的另一企业应用中。 您负责设计和托管用于分发应用
rectinajh
2018/05/17
2.3K0
iOS应用构建与部署小结
上篇文章介绍了Objective-C的基本概念,本文就来接着看如何创建我们的第一个简单iOS应用, 本着简单可复现的方式,我们会以尽可能小的成本来构建并在真机运行iOS应用。 也就是说, 不用越狱, 也无需开发者账号。当然,一台iPhone手机还是需要的,最好还有一台Mac。
evilpan
2023/02/12
2.2K0
iOS应用构建与部署小结
【IOS】利用plist文件安装本地ipa
本来这个公众号就是督促我自己学习的,更新随缘,以后或许可能有能力了会写一些插件,好了废话不多说,进入正题(排版不咋好看,将就看)
zby1101
2021/09/30
8.5K0
【IOS】利用plist文件安装本地ipa
【04】仿站技术之python技术,看完学会再也不用去购买收费工具了-给你们一个现成自适应pc移动端加移动端可用的APP下载落地页源码
继续第三篇的内容,第三篇卓伊凡就已经把卓伊凡的工具共享出来了,大家可以搜索卓伊凡网站仿站工具-zhuoivanwebtools-开源得到下载,后续会逐步更新一些功能,看要不要做点可视化界面吧,先说这篇,我把落地页给你们
卓伊凡
2025/02/18
460
Laravel 框架生成 Plist 数据
在客户端版本更新中,常用有两种更新方式,一是上架应用宝和苹果应用商店,二是上传到服务器,客户端做包版本更新检测,今天,小编给大家详细讲解一下客户端版本更新原理。 原理如图所示:
ITer.996
2019/08/28
8330
Laravel 框架生成 Plist 数据
iOS App Store 提交被拒?请收好这份最新 ITMS 错误速查表
在iOS应用分发过程中,超过78%的构建包会在首次提交至App Store Connect时触发ITMS(iTunes Store)系列校验错误。这些由苹果自动化校验系统抛出的错误码(如ITMS-90023、ITMS-90809、ITMS-90713等),实质上是苹果对元数据格式、二进制文件合规性、API调用链完整性等维度的强约束规则集。
移动开发技术
2025/05/22
2300
iOS分发系统
1,选中一种语言(php、Java、Node.js、Django、Go等)服务器语言都可以,我这里选用的是python的Django框架大家web服务器,使用docker管理所有服务,先简单搭建一个界面:
派大星在吗
2021/12/06
1.7K0
使用Jenkins自动构建iOS项目
大多APP开发团队都会存在这样一问题,开发人员直接在自己机器上给测试人员安装APP程序。整个代码不会经过源码服务器,甚至开发人员机器硬盘损坏或离职后产生严重后果。为了避免产生这样的问题,我们可以考虑使用CI系统,保证所有二进制包都是经过源码服务器,测试人员直接可以进行测试。
海哥@开发
2022/04/06
1.7K0
使用Jenkins自动构建iOS项目
Flutter 搭建 iOS 命令行服务打包发布全保姆式流程
在以前的 《 Android 和 iOS 打包提交审核指南》 里介绍了 Flutter 下打包 Android 和 iOS 的指南,不过这部分内容主要介绍的是如何在本地打包发布流程。
GSYTech
2021/04/23
3.6K1
Flutter 搭建 iOS 命令行服务打包发布全保姆式流程
iOS APP分发
在不越狱的情况下,下载正式版的app只能通过官方appstore进行下载,但是如果仅仅是测试的话,是可以通过其他渠道来下载app,苹果官方有testflight,第三方比较有名的有蒲公英,Fir.im。将ipa包上传之后,其他人就可以通过链接来下载。大概是这样:
Helloted
2022/06/08
1.1K0
iOS APP分发
盘点2019大佬申请证书,快来盘算下你的职业生涯
审查经过后,通过iTunes Connect上传官方文件到appstore 1,通过企业账户申请证书
iOS Magician
2023/03/22
4510
专坑国人!不法分子正大量滥用苹果iOS企业证书
不发分子通过滥用或购买企业证书打包非法App的情况,通过 itms:services://?,在线安装ipa,跨过Appstore的形式,传播大量涉黄涉赌应用,专坑中国人! 举出漏洞URL只是冰山一脚
FB客服
2018/02/23
4.8K0
专坑国人!不法分子正大量滥用苹果iOS企业证书
自建苹果.ipa下载服务器
点击 立即制作:会自动下载.plist文件。然后上传到OSS 并获取其网络路径,以备第二步使用
收心
2022/01/19
2.3K0
自建苹果.ipa下载服务器
ios分发平台搭建_app分发下载
我们基本都用过蒲公英或者fir.im做应用分发,但是可有想过他们是怎么实现的吗 如果想自己包里内测包,内部分发,或者企业包的分发,可以参考
全栈程序员站长
2022/11/15
2.5K0
ios分发平台搭建_app分发下载
聊聊苹果开发者帐号的那些事
这是因为当前的应用不是在 App Store 商店下载的,而是一些使用企业级证书的方式安装的软件。要想解决此问题的话需要到"设置"->"描述文件"里面去设置信任,暂没有其他办法。
动动我试试
2020/03/12
1K0
关于ios:上传了ipa但iTunes-Connect没有构建版本问题​
HBuilderX 版本:2.3.3,对应的 SDK 版本:2.3.3,Xcode 版本:10.1​
iOS程序应用
2023/04/17
5820
关于ios:上传了ipa但iTunes-Connect没有构建版本问题​
通过网页进行 iOS 应用内部分发
介绍如何通过网页内部分发 iOS 应用, 包括 In-House 企业应用和 ad-hoc 测试应用。
beginor
2020/08/10
1.3K0
通过网页进行 iOS 应用内部分发
相关推荐
不通过App Store实现ios应用分发下载安装
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档