在上一篇文章《IOS超级签名核心技术解密》中,我曾经为大家介绍了关于IOS超级签名的原理和实现步骤。

但是经过一段时间的运行之后,还是发现这套系统存在这一些问题:

  1. 过于依赖苹果环境
  2. 上传包过于耗时
  3. 成本昂贵
  4. 稳定性不高

事实上产生这些问题的原因,都是源于第一条,过于依赖MAC环境。而且这个MAC环境还是一台ji'y基于内网的个人机器,环境和稳定性可想而知,另外就是一台简单配置的苹果盒子,单价都在6000元,还不算上24小时开机电费都其他能源消耗。

Linux!

鉴于以上问题,我们于是便要去探索另外一种解决方案,于是便有了下面这个想法:

IOS的签名是否可以在Linux上进行呢?

确实是一个非常大胆的想法,IOS的包脱离Mac环境,在Linux上操作。

如何实现呢?

还是先看看我们强大的fastlane工具是否支持呢?

https://github.com/fastlane/fastlane/issues/11687

虽然这个问题fastlane开发团队2年前就已经提上议程了,但是直到今天,仍然没有进展。

看来只有放弃。

是否有其他的工具呢?

答案是肯定的:

https://github.com/sauce-archives/isign

https://github.com/zhlynn/zsign

一番测试之后,竟然真的可以完成签名,这简直让人兴奋。

尤其是zsign只需要P12和描述文件即可完成签名,而且速度相当的快。 签名一个IPA包只需要不到1s。

P12文件

当然有的人,又会接着我说,我没有苹果电脑,怎么导出P12文件呢?

这个也不是问题,借助强大的openssl工具即可在LINUX操作系统上完P12文件的生成。

具体步骤如下:

1) 先生成CSR文件

openssl genrsa -out ios_distribution.key 2048
openssl req -new -key ios_distribution.key -out ios_distribution.csr -subj '/emailAddress=me@example.com, CN=Example, C=US'

2) 上传到开发者网站: https://developer.apple.com/account/ios/certificate/create 选择生产证书-adhoc

3) 下载生成好的证书,转换为PEM格式

openssl x509 -inform der -in ios_distribution.cer -outform PEM -out ios_distribution.pem

4) 现在 Apple's Worldwide developer 证书并转换为PEM

wget http://developer.apple.com/certificationauthority/AppleWWDRCA.cer
openssl x509 -in AppleWWDRCA.cer -inform DER -out AppleWWDRCA.pem -outform PEM

5) 导出P12

openssl pkcs12 -export -out ios_distribution.p12 -inkey ios_distribution.key -in ios_distribution.pem -certfile AppleWWDRCA.pem

描述文件

解决了P12文件,接下来就是描述文件了。

之前我们完成这一操作是靠fastlane来进行的,现在fastlane在linux上不太好用,

有其他解决办法吗?

答案也是有的:

通过苹果的API接口来实现:

经过对比你会发现苹果官方提供的API,需要去创建TOKEN啥的,对于我们自动化的操作显然也并不是太友好。而spaceship封装的API,速度方面更是屌大苹果官方API,所以毫不犹豫选择spaceship.

细心的朋友会发现spaceship貌似是存在于fastlane,一切都是这么的机缘巧合。

不过前面你不是说 fastlane不支持 Linux 环境吗?这一切不自相矛盾吗?

事实上,一方面spaceship 可以独立进行安装,另一方面fastalen虽然不能运行,但是可以安装啊。

这一切都只需要ruby环境就够了。

所以,如果要生成描述文件,只需要一个rb脚本就够了。

require 'spaceship'

# 登录
Spaceship::Portal.login

# 注册设备
 Spaceship::Portal.device.create!(name: "jason.z", udid: "xxxxxx")

# 创建描述文件        
Spaceship::Portal.provisioning_profile.ad_hoc.create!(bundle_id: "com.jasonz.supersign",certificate: cert,name: "com.jasonz.supersign_Adhoc")

# 更新描述文件
profile = Spaceship::Portal.provisioning_profile.development.all.find { |p| p.name == "Name" }
profile.devices = Spaceship::Portal.device.all
profile.update

至此,环境的问题已经解决了,接下来就是包上传的问题了。

而事实上你会发现,如果签名能够运行在Linux主机上,那么包上传我们就可以借助于云商提供的OSS内网技术了,阿里云的内网上传速度可以达到1Gb/s以上,所以上传耗时的问题便轻松解决了。

效果对比

首先上从成本上来说

从原来的至少2台机器(一台web服务器+一台MAC打包机) 我们已经可以精简到一台服务器上了(web+打包)

其次时间上

签名时间和包上传时间大大减少。

file

file

时间成本上缩短了6倍以上,下载体验更完美。

自动化到底

在对蒲公英等一些签名服务商那里我曾经看到,他们可以做到在网站上可以自主的添加开发者帐号并且进行二次验证和同步数据。

当然,通过上面我们知道spaceship可以完成这一工作,但是毕竟通过系统脚本和WEB环境交互会存在一些问题。

能否通过web脚来实现呢?

答案是肯定的!

但是要实现这个答案却要费点功夫,因为并没有现成的库可以使用。

所以你需要做的就是造轮子。

通过阅读spaceship的源码,基于他的操作流程,我自己封装了一个PHP的类库。

目前可以实现:

  • 二次验证;
  • 同步session;
  • 转换session到fastlane;
  • 创建证书、描述文件、应用ID;
  • 获取设备、证书、描述文件等信息。

file

file

当然,由于里面的操作非常繁琐,所以目前的完成度不高,只是够用即可。

如果你能够全部封装完成,那么spaceship 实际上也可以抛弃了。

最后的话

https://isign.pro 已经正式启用了,提供应用分发超级签名TF签名等服务,如有需要可以联系我购买使用(微信号:foxmee).

1581788705.pngfile