iOS 超级签名详解
一、原理
把安装设备当做开发设备进行分发。说的明白一些,开发者可以在开发者后台添加手机的UDID,然后重新打包一个IPA文件,分发平台,然后被添加的UDID就可以下载。
二、优缺点
优势:
直接分发,安装即可运行,不需要用户做企业证书的信任操作
目前稳定,不会有证书吊销导致的业务风险(后续苹果政策风险非常高)
缺点:
单开发者账号的iPhone设备数量只有100个,导致分发成本非常高(99美元/1年/100个设备)
开发者账号需要预先写入安装设备的UDID,在工具链不通的情况下,获取用户的UDID相对困难和繁琐,而且手动写入UDID不存在商用可行性,当然目前这个缺点被解决了
三、整体运行流程
![1605558-fe383e054c661575.png](https://upload-images.jianshu.io/upload_images/2056165-e0ed3df070da491f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.服务器收到UDID后,将UDID添加到开发者账号下,下载此udid签名用的证书描述文件。
3.然后用此udid签名用的证书描述文件,把预留的ipa重签。
4.重签后的iPA上传分发服务器,通过分发链接让用户下载。
下面是这四个步骤的技术细节:
一、使用配置文件获取UDID
苹果公司允许开发者通过IOS设备和Web服务器之间的某个操作,来获得IOS设备的UDID(包括其他的一些参数)。这里的一个概述:
1.在你的Web服务器上创建一个.mobileconfig的XML格式的描述文件;
2.用户在所有操作之前必须通过某个点击操作完成.mobileconfig描述文件的安装;
3.服务器需要的数据,比如:UDID,需要在.mobileconfig描述文件中配置好,以及服务器接收数据的URL地址;
4.当用户设备安装描述文件后,设备会回调你设置的URL,如果你的URL返回302跳转的话,Safari浏览器会跳转到你所给的地址;服务器做一些301跳转,存储UDID等操作
XML代码如下:
<?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>PayloadContent</key> <dict> <key>URL</key> <string>一个接收UDID的网址</string> <key>DeviceAttributes</key> <array> <string>UDID</string> <string>IMEI</string> <string>ICCID</string> <string>VERSION</string> <string>PRODUCT</string> </array> </dict> <key>PayloadOrganization</key> <string>GuangdongQi</string><!--组织名称--> <key>PayloadDisplayName</key> <string>AppFree</string> <key>PayloadVersion</key> <integer>1</integer> <key>PayloadUUID</key> <string>9CF421B3-9853-4454-BC8A-982CBD3C907C</string><!--自己随机填写的唯一字符串,http://www.guidgen.com/ 可以生成--> <key>PayloadIdentifier</key> <string>com.gpon.profile-service</string> <key>PayloadDescription</key> <string>This temporary profile will be used to find and display your current device's UDID.</string> <key>PayloadType</key> <string>Profile Service</string> </dict> </plist>
注意
①、接收网址的地址需要SSL签名,自签名的不行,这也是苹果强制https的一种方式吧
②、mobileconfig下载时设置文件内容类型Content Type为:application/x-apple-aspen-config(遇到问题的都是因为这个),或者像这里用一个简单页面做好下载mobileconfig文件,引导用户安装
二、服务器收到UDID后,将UDID注册到某个开发者账号下,并下载新的描述文件
接下来的关键点就是如何在获取到用户的UDID之后,秒级完成注册新的开发者设备+更新Provisioning Profile的。 这里我们需要借助开源工具(Spaceship):
![1605558-875314c2f3f2ba66.jpeg](https://upload-images.jianshu.io/upload_images/2056165-95e6b9fb32756b00.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
spaceship公开了Apple Developer Center的API,而且执行速度比解析开发者Web页面快两个数量级,从而在非常短的时间内搞定
Provisioning Profile
。 这个框架解决了整套机制的关键问题,成为整个工具链的基石。其实某平台早就完成了UDID获取和应用签名分发的技术储备,只差这套API。
spaceship 是Fastlane的一个框架,安装spaceship
sudo gem install fastlane -n /usr/local/bin sudo gem install pry -n /usr/local/bin fastlane spaceship
具体细节:使用spaceship批量添加设备并更新profile
三、用此udid签名用的证书描述文件,把预留的ipa重签
这里推荐使用 Sigh这个框架来解决这个问题。
sudo gem install sigh
对IPA包重签名:
fastlane sigh resign
此时会显示:
![屏幕快照 2019-09-20 下午2.42.51.png](https://upload-images.jianshu.io/upload_images/2056165-7cca9cd9064d8362.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
输入你的IPA路径,点击回车,此时会显示你电脑中可用的证书:
![屏幕快照 2019-09-20 下午2.45.15.png](https://upload-images.jianshu.io/upload_images/2056165-53a927c04973a81e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![屏幕快照 2019-09-20 下午2.49.04.png](https://upload-images.jianshu.io/upload_images/2056165-ee7b383b8f22cf1e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
ipa包重签名成功