一个很典型的现象
研发在自己手机上测得好好的,发出去之后陆续有用户反馈「装不上」。查了一圈证书没问题、链接没问题、UDID(设备唯一识别码)也录了,最后发现反馈的清一色是老机型用户。这种情况,问题不在签名,在于这个包根本没有为老设备准备可执行代码。
架构切片是什么
iOS 设备用的芯片指令集换过几代。早年是 32 位,后来全面转向 64 位,也就是常说的 arm64(64 位 ARM 架构,目前 iPhone 主力芯片使用的指令集)。一个 App 包里必须包含和这台设备芯片对得上的那一份机器代码,这份代码就叫架构切片。
关键点是:一个包可以同时装好几份不同架构的切片,也可以只装一份。只装 arm64 的包,在新设备上完全正常,但拿到不支持 arm64 的老设备上,系统找不到能执行的代码,直接拒绝安装,而且给出的提示往往很含糊,看上去和掉签的报错长得差不多。
为什么现在越来越常见
因为老架构已经在实际开发中被放弃了。现在主流开发工具默认只编译 arm64,很多团队从立项起就没打算支持更老的设备,包里自然只有一份切片。这在 App Store(苹果官方应用商店)上架时问题不大,因为商店会按设备能力过滤,不兼容的机型根本搜不到这个 App。但签名分发是把一个安装链接直接发给所有人,老设备用户照样点得进去,于是就撞上了。
还有一道门槛:最低系统版本
除了架构,包里还写着一个最低系统版本要求。这个值是研发在打包时填的,系统安装前会拿它和本机系统版本比对,低了就直接拒绝。它和架构是两道独立的关卡,任何一道没过都会装不上。
麻烦的地方在于,这个值有时候是被间接抬高的。比如引入了一个较新的第三方 SDK(软件开发工具包),它自带的要求就会把整个包的最低版本顶上去,研发自己都没意识到。
排查顺序:先分清是哪一道
- 收集反馈用户的机型和系统版本,看有没有共性。清一色老机型,优先查架构;机型新旧混杂但系统版本都低,查最低版本要求。
- 让对方确认报错出现的时机。刚开始下载就失败,多半是能力不匹配;下载进度走完才失败,通常是签名或校验问题。
- 换个思路验证:找一台确定能装的设备,对比两台机器的型号和系统版本,差异点基本就是卡点。
怎么跟用户解释
不要笼统地说「你手机太老了」。更清楚的说法是:这个版本是为较新的设备编译的,您的机型暂时不在支持范围内,我们记下型号了,后续如果补上支持会通知您。同时把不兼容的机型清单整理一份出来,放在下载页显眼位置,比事后一个一个解释省事得多。
下单前该问的一句
把你的机型和系统版本分布告诉签名商,问一句这个包在他们那边能不能正常签出来、有没有最低版本限制。签名环节本身不会改变架构和最低版本,但它能帮你提前发现这个包根本发不到一部分用户手上,避免签完才发现白忙一场。
我是本期作者小思,想解决苹果企业签名、超级签名、TF签名问题?可以在微信公众号对话框找到我哦~(QQ:822404920 微信:A-mk5888)