作为一名做了六年iOS开发的技术爱好者,我平时喜欢捣鼓一些实用的小工具,尤其是针对Safari的用户脚本扩展、广告拦截工具这类满足小众需求的产品,这些产品大多不符合App Store的上架规则,因此这些年我一直在研究非官方渠道的应用授权机制与稳定方案,踩过不少坑也总结了不少实用经验,今天就把我的探究过程整理出来。
首先从最基础的授权校验原理说起,iOS系统的应用安装权限管控非常严格,所有未上架官方App Store的应用,必须经过苹果信任的开发者证书签名才能被系统允许安装,这个过程就是我们常说的IPA授权。 iOS的授权校验本质是一套加密信任链校验:苹果作为根证书签发方,给开发者证书赋予信任资质,开发者用自己的证书给IPA包做签名,把签名信息嵌入应用元数据,用户设备安装时会沿着信任链逐层验证,只有确认签名合法才会放行,否则就会弹出“无法安装应用”“未受信任的开发者”这类提示。 不同分发渠道的授权逻辑其实都基于这套校验规则:官方上架是苹果官方审核后用官方证书签名,所有设备默认信任,稳定性拉满但审核规则极严,很多小众工具根本过审;TF内测也就是TestFlight,是苹果官方的内测渠道,用苹果内测证书签名,依托TestFlight本身的信任资质,用户安装不需要额外操作,有效期90天,稳定性比第三方签名好很多,但也有审核门槛和一万个的名额限制,我做的Safari去广告扩展就两次被TF拒审;而H5封装的轻应用,本质也是需要签名的IPA包,授权逻辑和原生应用完全一致,只是内容载体从本地代码变成了网页,因此同样需要遵循这套校验规则。 目前来看,像Safari扩展这类过不了官方审核的产品,企业签名是最实用的分发渠道,企业签名支持Safari扩展这类小众应用的免审核分发,刚好解决了我们小开发者的痛点。
接下来聊聊核心的稳定机制设计,第一个就是UDID绑定机制。 UDID是苹果给每台iOS设备分配的唯一识别码,苹果规则中要求所有非公开分发的应用,必须绑定对应设备的UDID才能通过校验,个人开发者证书最多绑定100台设备,早期的企业证书开放了无UDID绑定的签名权限,因此才有了通用企业签名的存在,但近年来苹果对企业证书违规对外分发的监管越来越严,无绑定的大流量证书很容易被检测吊销,因此现在很多稳定签名方案都引入了UDID绑定机制:用户安装前先获取设备UDID,把UDID添加到开发者账号的设备列表再签名,缩小了证书的使用范围,大大降低被苹果检测到大规模分发的概率。 我自己做过对比测试,同样流量下,绑定UDID的企业签名掉签率比无绑定的低了60%以上,稳定性提升非常明显。
第二个核心稳定方案就是证书池调度,这也是现在头部签名服务商保障稳定的核心技术。 所谓证书池,就是服务商储备大量不同的企业开发者证书,不把所有应用放在同一张证书上,而是通过动态调度分散风险:一般会按照应用类型、风险等级分类分流,同一张证书最多只放10个以内不同开发者的应用,像Safari扩展、去广告工具这类风险中等的应用,会单独放在一个证书池,绝对不会和金融、博彩这类高违规风险的应用放在一起,避免一张证书出问题牵连所有应用。 当某一张证书被苹果吊销后,系统会自动检测证书状态,触发自动调度,把对应应用分配到证书池内其他可用的正常证书上,整个过程不需要人工过多干预,大大缩短了故障处理时间。 我之前和一位签名服务商的技术朋友聊过,他们的证书池调度系统可以做到掉签后两小时内完成自动重授权,效率比早年人工处理高了十几倍。
然后就是重授权操作和证书补发,掉签也就是证书被苹果吊销,是第三方签名绕不开的问题,掉签后原来安装的应用就会无法打开,必须重新做签名也就是重授权才能恢复使用。 早年的重授权都是人工操作,开发者需要重新上传IPA,服务商手动分配证书签名,往往要好几天才能出结果,用户等待的过程中大量流失。 现在的重授权已经基本自动化了,系统检测到掉签后会自动触发重授权流程,生成新的下载链接,开发者只要替换掉自己网站上的旧链接就行,部分服务商甚至支持链接不变自动切换签名,用户几乎感知不到故障。 我自己就经历过一次大规模证书吊销,去年年底苹果收紧企业证书监管,我用的服务商三张证书同时被吊销,我的Safari扩展也在其中,我早上接到用户反馈联系客服,对方说已经触发自动补发流程,中午就给了我新的下载链接,我替换完成后用户重新安装就能用,整个故障时长不到八个小时,一共才三个用户因为等不及卸载,损失非常小。 反观我早年用的小服务商,一次掉签等了五天都没补发,直接跑了一半用户,所以重授权的效率和证书补发的及时性,直接决定了应用的留存率。
为了弄清楚不同授权方案的实际表现,我花了三个月做了专属授权和通用授权的实测对比,我的Safari扩展一共有500多个活跃用户,我把用户分成两组各250人,分别用两种方案测试。 实测结果差异非常明显:通用授权就是多个开发者的应用共享证书池里的证书,价格便宜但风险高,三个月里一共掉签四次,每次掉签都有十几个用户来咨询,补发完成后统计下来有超过5%的用户流失,安装成功率也只有89%,大概10%的用户会因为证书被标记无法安装;而专属授权是给我的应用单独分配专属证书,不和其他开发者的应用共用,三个月只掉签一次,还是我更新应用时误改包名触发了苹果检测,服务商当天就给补发了新的专属证书,用户流失不到1%,安装成功率高达98%,几乎很少出现无法安装的情况。 针对我另外做的一款H5封装的本地资讯应用,我也做了对比,H5封装应用本身因为性质特殊更容易被苹果检测,通用授权的掉签频率比原生IPA高了一倍,而专属授权的掉签率只比原生应用高了不到10%,稳定性依然有保障。
最后聊聊我对不同渠道价格的实际感受,现在行业价格体系已经非常透明,通用共享签名一般按月付费,一个IPA一个月只要几十到一百多,成本很低,适合测试阶段的应用,用户少就算掉签也没多大损失,但如果是正式上线的应用,通用签名的稳定性太差,算上用户流失的成本其实并不划算;专属企业签名一般按季度或者按年付费,一年大概一千到三千不等,看起来贵,但分摊到每个活跃用户身上,一年才几块钱,比其他方案便宜很多,而且掉签后都是免费补发证书,不需要额外付费;超级签名也就是绑定UDID的个人证书签名,按安装量收费,一个设备大概3到5块,500个用户就要一千五到两千五,用户增长起来后成本会越来越高,不如专属签名划算;TF上架一般是一次性收几百块的上架服务费,能过审的话性价比很高,但很多应用根本过不了审,对我们这类做Safari扩展的开发者来说基本用不上。 我也踩过低价小渠道的坑,之前看到一个渠道说通用签名一个月只要15块,比正规平台便宜一半,结果半个月掉了三次签,每次补发都要收20块加急费,一个月下来花了快一百,比正规平台还贵,用户还跑了三分之一,所以千万不要只看单价,稳定性和补发服务才是最重要的。
这么多年探究下来,我觉得对于过不了官方上架和TF内测的应用来说,选对授权方案其实完全可以做到长期稳定运行:优先选择带证书池动态调度的服务商,支持UDID绑定和掉签自动补发,正式上线的应用尽量选专属授权,测试阶段用通用签名控制成本,企业签名支持Safari扩展这类小众产品分发,已经给我们小开发者留出了足够的空间,只要选对方案,就能用很低的成本给用户提供稳定的服务。