前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS分发系统

iOS分发系统

原创
作者头像
派大星在吗
发布2021-12-06 13:44:34
1.5K0
发布2021-12-06 13:44:34
举报
文章被收录于专栏:我的技术专刊

开发过程

服务端开发

1,选中一种语言(php、Java、Node.js、Django、Go等)服务器语言都可以,我这里选用的是python的Django框架大家web服务器,使用docker管理所有服务,先简单搭建一个界面:

image.png

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文件,可以随便打一个空项目获取一个当模板

我这里大概是这样的:

代码语言:txt
复制
          <?xml version="1.0" encoding="UTF-8"?>
代码语言:txt
复制
            <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
代码语言:txt
复制
            <plist version="1.0">
代码语言:txt
复制
            <dict>
代码语言:txt
复制
                <key>items</key>
代码语言:txt
复制
                <array>
代码语言:txt
复制
                    <dict>
代码语言:txt
复制
                        <key>assets</key>
代码语言:txt
复制
                        <array>
代码语言:txt
复制
                            <dict>
代码语言:txt
复制
                                <key>kind</key>
代码语言:txt
复制
                                <string>software-package</string>
代码语言:txt
复制
                                <key>url</key>
代码语言:txt
复制
                                <string>%sstatic/upload/%s</string>
代码语言:txt
复制
                            </dict>
代码语言:txt
复制
                        </array>
代码语言:txt
复制
                        <key>metadata</key>
代码语言:txt
复制
                        <dict>
代码语言:txt
复制
                            <key>bundle-identifier</key>
代码语言:txt
复制
                            <string>%s</string>
代码语言:txt
复制
                            <key>bundle-version</key>
代码语言:txt
复制
                            <string>%s</string>
代码语言:txt
复制
                            <key>kind</key>
代码语言:txt
复制
                            <string>software</string>
代码语言:txt
复制
                            <key>title</key>
代码语言:txt
复制
                            <string>%s</string>
代码语言:txt
复制
                        </dict>
代码语言:txt
复制
                    </dict>
代码语言:txt
复制
                </array>
代码语言:txt
复制
            </dict>
代码语言:txt
复制
        </plist>

把ipa的下载地址和bundle信息等拼接到里面即可

7,最后就是下载地址拼接

代码语言:txt
复制
    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命令也是解决这个问题的,使用方式:

代码语言:txt
复制
/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打开都是失败的

6,ssh大法,退而求其次,只能通过ssh连接mac服务器,直接执行mac命令才能解决了。目前考虑的是ssh连接mac执行sips转换图片,如果docker和mac是同一台机器,可以直接volume映射;如果是两天机器就只能转换完图片后再使用scp回传回来

7,感谢网友提醒‘https://juejin.cn/user/3703576621495662

7.1

pngdefry可以使用linux版本,因为提供了c源码可以在linux上make出来(我尝试失败了),最后从网上找了一个别人做好的linux可执行文件,测试成功!终极解决方案是pngdefry还原图片

总结,整个系统很简单,就是苹果处理后的图标问题探究了两天,最终还只能退而求其次使用ssh连接的方式解决;或者整个ipa的解析使用脚本来做,然后用服务器调动ssh执行脚本,最后回传过来结果也行;但是这套系统就不再是完整的了,谁有有更好的解决方案欢迎讨论交流,Python的解决方案哈。目前最终解决方案还是ssh调用mac的命令来实现图标转换。

经网友建议和提醒,尝试了pngdefry linux版本成功了,最终还是用pngdefry做图片还原比较方便

遗留问题:mobileprofile怎么才能方便的转为json来解析,当然mac电脑有security命令可以直接用,我说的是服务器如果要转换应该用什么

解决遗留问题:

在mac电脑上使用security可以很方便的解析mobileprofile文件,命令如下:

代码语言:txt
复制
security cms -D -i d7ef3f23-0658-4962-8962-9a541dd65b02.mobileprovision > output.plist

这样直接转为plist,可以很方便的转为字典来处理

但是security是mac上的命令,在服务器上没有!

解决方案是:

代码语言:txt
复制
openssl smime -inform der -verify -noverify -in  input.mobileprovision > out.plist

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开发过程
    • 服务端开发
    • 疑难问题解决方案
      • 怎么解决这个图片问题
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档