企业签频繁掉签,何处是出路?
公司客服前段时间接连收到 iOS 用户投诉说无法登录游戏的情况,排查到的原因是苹果加大了审核的力度,导致项目组使用的企业签产品出现频繁掉签(打开闪退)。因此,项目组亟需寻找另外一种新的处理方式来应对。现市场上存在的苹果签名有企业签、超级签、tf 签名,接下来我们来看看这几种方式的区别。
一、苹果几种签名方式的区别
企业签:是指使用 299 美金的苹果企业账号打包 In House 版的 IPA 文件,也就是替换 App 的 P12 证书。签名之后可以免提交 App Store 审核,同时可开放给所有用户提供任意下载,可在任意 iPhone、iPad 上安装,并且不需要进行越狱。 目前苹果企业账号申请难度较大,时间久、审核严苛、条件繁多。
超级签:是使用 99 美金一年的个人或普通的企业账号,利用了苹果提供的 Ad-Hoc 渠道进行分发的一种方式。优势:单独的证书,更加稳定;缺点:只能支持 100 台设备。可通过申请多个账号达到无限的支持。
TestFlight 签:是一种苹果官方认可的分发模式,通过下载 TestFlight 来进行 App 内测下载使用,接受来自开发者的电子邮件或公开邀请链接,即可拥有可用于测试的设备了;拥有设备后该分发模式分发限制少,链接不会被屏蔽,任何苹果设备均可安装。需要提交经过苹果审核才可使用。
对比之后,目前最符合公司条件的只有超级签。
二、超级签的原理
原理:使用苹果提供的 Ad-Hoc 分发通道,把安装设备当作开发设备进行分发。
步骤:根据描述配置文件(moblieconfig)中获取苹果设备的 udid,上传设备的 udid 到苹果服务器进行注册,再更新 mobileprovision 文件,最后根据个人开发者证书和 mobileprovision 文件进行重新签名。
技术难点:
1.如何获取用户的设备 UDID?
UDID(Unique Device Identifier)是 iOS 设备的一个唯一识别码,每台 iOS 设备都有一个独一无二的编码,UDID 其实也是在设备量产的时候,生成随机的 UUID 写入到 iOS 设备硬件或者某一块存储器中,所以变成了固定的完全不会改变的一个标识,用来区别每一个唯一的 iOS 设备,包括 iPhones, iPads, 以及 iPod touches。随着苹果对程序内获取 UDID 封杀的越来越严格,私有 api 已经获取不到 UDID,Mac 地址等信息。
2.如何将获取 udid 上传苹果服务器注册,完成设备的添加?
3.如何下载 mobileprovision 描述文件?
4.如何根据个人开发者证书和最新的描述文件进行重签名?
三、超级签的最终实现架构
整体架构实现:采用搭建应用服务器和自动化工具完成。
iOS 设备安装描述文件后,向服务器发送设备的 UDID。
应用服务器收到 UDID 后,上传 UDID 到苹果服务器,完成设备注册。(需要登录个人开发者账号)。
下载最新的 mobileprovision 文件。
根据开发者证书和 mobileprovision 文件,对 ipa 文件重新签名。
返回地址,用户再通过 itms-services 下载和安装签名后的 ipa 包。
技术难点的解决办法:
1.使用配置文件获取 UDID。
应用服务器上需要创建一个 udid.mobileconfig 的 xml 格式的描述文件,包含接收数据的服务器接口地址及需携带的 UDID 等数据;
iOS 用户通过 Safari 浏览器访问网页点击免费安装按钮操作完成 udid.mobileconfig 描述文件的安装;安装的过程中,系统会根据描述文件中填写的服务器接口地址,携带 UDID 等信息调用服务器接口。
<key>URL</key>
<string>http://127.0.0.1/udid</string> <!--接收数据的服务器接口地址,此处为 ip 地址和 http 可不用申请证书—>
<key>DeviceAttributes</key>
<array>
<string>UDID</string> <!— UDID 信息-->
</array>
完整文件,可查看:https://gitee.com/harochen/iosresign/blob/master/udid.mobileconfig
2.使用 Apple Developer Center 自动化工具,完成设备的注册和 mobileprovision 文件的下载。
这里借助的是开源工具:Spaceship
Spaceship 公开了 Apple Developer Center 的 API,而且执行速度比解析开发者 Web 页面快两个数量级,从而在非常短的时间内搞定 Provisioning Profile。
关键 API 接口:
# 向苹果服务器注册设备
Spaceship.device.create!(name: ’name1', udid: ‘10010342134120')
#下载 mobileprovision 描述文件
devices = Spaceship.device.all
profiles += Spaceship.provisioning_profile.ad_hoc.all
profiles.each do |p|
p.devices = devices
p.update!
end
downloadProfiles += Spaceship.provisioning_profile.ad_hoc.all
downloadProfiles.each do |p|
fileName = p.name + ".mobileprovision"
File.write(“./#{fileName}", p.download)
end
完整文件,可查看:https://gitee.com/harochen/iosresign/blob/master/addDeviceUpdateProfile.rb
3.使用开源工具 isign,根据个人开发者证书和最新的描述文件,完成 ipa 重签名。
命令:isign -c /root/.isign/cert.pem -k /root/.isign/key.pem -p /path/my.mobileprovision -o resigned.ipa original.ipa
附:避坑指南:环境搭建
系统:CentOS 7.2
Ruby 版本:2.6.4
Python 版本:2.7
1.安装依赖:
yum -y install gcc gcc-c++ kernel-devel zlib-devel openssl openssl-devel wget
2.Spaceship 开发语言采用的是 ruby,安装时容易忽略指定存放路径
--prefix=/usr/local/ruby-2.6.4 和--with-openssl-dir=/usr/local/ssl
完整命令是: ./configure --prefix=/usr/local/ruby-2.6.4 --with-openssl-dir=/usr/local/ssl
3.isign 开发语言采用的是 python2,需要安装依赖 setuptools 和 pip 及对应的版本
4.isign 指定编码格式为 utf-8,不能会出现报错:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 26: ordinal not in range(128)
方法:/usr/local/python2.7/lib/python2.7/posixpath.py import 前
增加下面语句:
#!coding=utf-8
import sys
if sys.getdefaultencoding() != 'utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
完整环境安装安装脚本,详见:https://gitee.com/harochen/iosresign/blob/master/envInstall.sh
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/74e8f45bfa51b1d6644e645b4】。文章转载请联系作者。
评论 (2 条评论)