原理
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回传回来