共计 2858 个字符,预计需要花费 8 分钟才能阅读完成。
原理
1,对使用者来说就是一个 ipa 上传到散发零碎,而后下载即可
2,散发零碎拿到 ipa,解析外面的内容,拼接出下载地址即可
下载地址构造:‘itms-services:///?action=download-manifest&url=plist 下载门路’,ipa 的实在下载地址都在 plist 文件里,只能通过这种连贯应用 safari 浏览器能力下载
开发过程
服务端开发
1,选中一种语言(php、Java、Node.js、Django、Go 等)服务器语言都能够,我这里选用的是 python 的 Django 框架大家 web 服务器,应用 docker 治理所有服务, 先简略搭建一个界面:
2,写一个上传 ipa 的接口 upload,接管到 ipa 之后,很多实现计划是间接解压,这种效率不太好,python 能够应用 zipfile,无需解压即可读取内容,ipa 实质上你能够了解为就是一个 zip 文件,解压后就能够失去实在内容
3,进入 ipa 文件外部之后,先拿到 info.plist 文件,这个文件比拟重要,外面能够解析进去包名、版本号、build 号、最小支持系统版本号等,根本各种根底信息都有,我这里应用 plistlib 将 info.plist 加载到字典对象中进行解析
4,而后也是遍历 ipa 中的文件,找到利用图标,保留到 static 下(这里的图片有问题,后续解说解决方案)
5,如果有获取所有测试机 udid 信息,须要遍历出 embedded 文件,而后解析即可,然而这里的解析只能字符串解析,除非你是间接跑在 mac 电脑上的脚本,能够应用 mac 自带的 security 进行转化为 xml 格局,有点麻烦
6,拼接下载用的 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>%sstatic/upload/%s</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>%s</string>
<key>bundle-version</key>
<string>%s</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>%s</string>
</dict>
</dict>
</array>
</dict>
</plist>
把 ipa 的下载地址和 bundle 信息等拼接到外面即可
7,最初就是下载地址拼接
download_url = 'itms-services://?action=download-manifest&url= 你的 plist 地址'
这个下载地址放到 a 标签或者事件执行的外面即可,一旦拜访就是申请下载,能够间接复制到浏览器验证
另外须要留神,plist 地址和 ipa 地址肯定要是 https 的,这是苹果的限度
到这里一套简略的 iOS 散发零碎就实现了,开发过程中遇到一个疑难问题这里讲一下
疑难问题解决方案
这里说的疑难问题其实就是图标的展现,你会发现间接应用 ipa 外面导出来的 app 图标在 safari 上能够展现,然而在其余浏览器上展现不进去。正如我下面的截图那样;起因是苹果在打包的时候会对所有图片进行压缩优化,失常的一个 icon 是 130K 这样,达到 ipa 外面也就 30K,这也阐明了有人对 png 进行压缩来优化包体积,然而最终出包的时候发现包体并未减小的起因。
怎么解决这个图片问题
1,依据问题搜寻到 pngdefry 这个工具,是一个大神十几年前应用 c 写的,通过一番摸索发现,有 python 版本的然而下载安装失败,有一台机器下载胜利了然而不反对 python3,应用命令行形式测试,发现的确能够解决这个问题。
命令:pngdefry -s _test a.png
,这句命令是把图标 a.png 还原为 a_test.png
pngdefry 有 node 版本的,没测试 node 是不是好的,然而不反对 python 只能放弃
2,pngdefry 计划看来是行不通的,反正我是搞了一天也没胜利。持续摸索发现 mac 自带 pngcrush 命令也是解决这个问题的,应用形式:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush -revert-iphone-optimizations -q Local.png Local-standard.png
能够看出这个命令是 xcode 里带的,通过 -revert-iphone-optimizations 来还原图片;不同人的 xcode 地址可能不是这个,能够应用xcode-select -print-path
找到 xcode 门路。这个工具通过测试也的确能解决图片展现问题,然而 pyhton 不反对啊,服务器不反对啊,只反对 mac 而且还得找门路,果决放弃
3,通过一通的 google 和 github 探寻他人的计划,没找到后果,忽然想到咱们公司有人用 node 写了一套,于是去打包机看了一眼,居然又是一种新形式应用的 sips -s format png 压缩的图标门路 --out 还原的图片门路
可悲的是这个 sips 命令也是 mac 自带的命令
4,到目前为止是无解了,找了下有没有一种形式能够把 mac 上的命令在 linux 上跑,因为服务器大都是 linux 系列的,事实很骨感,没有
5,应用 pthon 的图片解决 Pillow,opencv 等二次解决图标,发现解决的后果 pillow 是黑窗口,opencv 关上都是失败的
5,ssh 大法,退而求其次,只能通过 ssh 连贯 mac 服务器,间接执行 mac 命令能力解决了。目前思考的是 ssh 连贯 mac 执行 sips 转换图片,如果 docker 和 mac 是同一台机器,能够间接 volume 映射;如果是两天机器就只能转换完图片后再应用 scp 回传回来
总结,整个零碎很简略,就是苹果解决后的图标问题探索了两天,最终还只能退而求其次应用 ssh 连贯的形式解决;或者整个 ipa 的解析应用脚本来做,而后用服务器调动 ssh 执行脚本,最初回传过去后果也行;然而这套零碎就不再是残缺的了,谁有有更好的解决方案欢送探讨交换,Python 的解决方案哈。目前最终解决方案还是 ssh 调用 mac 的命令来实现图标转换