很多应用依赖一个体验:用户在微信或者短信里点开一条链接,如果手机装了这个应用,就直接跳进应用里的对应页面;没装才打开网页。这个能力叫通用链接(Universal Link,苹果提供的、让普通 https 链接直接唤起应用的技术)。上架的应用用它很正常,换成签名分发之后,它还能正常工作吗?
一句话结论
能用,但前提是「关联域名(Associated Domains)」这个权限在签名时被保留下来。重签过程中权限清单被覆盖或丢弃是很常见的事,一旦丢了,链接就不再唤起应用,而是直接在浏览器里打开网页——用户以为没装,转化率就这么流失了。
它依赖两样东西
通用链接能跑通,需要服务端和客户端同时配置正确:
- 服务端:你的域名下要放一个叫 apple-app-site-association(苹果应用站点关联文件)的配置文件,声明哪些路径可以唤起哪个应用。这个文件必须能通过 https 正常访问,且不能重定向。
- 客户端:应用必须具备关联域名(Associated Domains)这个权限(entitlement,写在签名里的能力清单),里面列出允许的域名。
签名分发影响的是第二样。服务端那个文件放在你自己的服务器上,不受签名影响;但客户端的权限是写在签名里的,重签时如果没把原来的权限清单完整带过来,这个能力就没了。
为什么重签会把它弄丢
权限声明不是凭空产生的,它来自开发者账号的配置。原应用在自己的开发者账号下申请了关联域名权限,重签时换成了另一个账号的证书,新账号并没有为这个包名配置过同样的权限,于是签名方需要手动把权限清单写回去。
规范的签名流程会先把原始包里的权限清单完整读出来,再原样写进新包。但这一步依赖签名方主动去做,而且某些权限(比如关联域名、推送环境、iCloud 容器)跟开发者账号强绑定,不是想写就能写——需要账号侧的配置配合。
结果是:同一个包,签完之后有的能力在、有的能力不在,而且没有报错、没有崩溃,只是那个功能悄悄不工作了。
和 URL Scheme(自定义协议)的区别
另一种唤起方式是 URL Scheme(自定义协议,形如 myapp://page/1 这样的地址)。它的好处是实现简单、不依赖权限声明,重签基本不影响;缺点是体验差一些——如果没装应用,点击会报错;系统还会弹一个「是否打开」的确认框,多一次点击就多一次流失。另外自定义协议不唯一,别的 App 可以抢注同一个名字。
所以现实中的稳妥做法是两条路都留:优先走通用链接拿最好的体验,保留自定义协议做兜底。这样即使签名环节把关联域名弄丢了,唤起能力也不会完全断掉。
发现失效了怎么处理
- 先确认是权限问题还是服务端问题。用手机 Safari(苹果自带浏览器)直接打开你配置的链接地址,如果下拉没有「在应用内打开」的提示,多半是客户端权限没生效。
- 把原始权限清单提供给签名方。明确列出需要保留的权限项,让对方照着写回,而不是只说「按原样签」。
- 验证要换干净设备。通用链接的唤起记录会被系统缓存,装过的机器上测不出来真实结果。
小结
通用链接在签名分发下完全可用,它不是上架应用的专属能力。真正的风险点在于权限清单的迁移——这是一件「做对了没人注意、做错了也没人报错」的事。送签时把需要保留的权限明说一遍,收包后专门测一次唤起,这个能力就能稳稳留在你的应用里。
我是本期作者小思,想解决苹果企业签名、超级签名、TF签名问题?可以在微信公众号对话框找到我哦~(QQ:822404920 微信:A-mk5888)