You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

配置通配符Universal Links后,如何在特定条件不满足时阻止iOS App响应链接?

首先直接给结论:仅通过continue:restorationHandler返回false无法阻止iOS App被启动,但我们可以通过其他方式实现你想要的效果,下面详细说明:

为什么返回false阻止不了App启动?

当用户点击符合applinks:*.company.com规则的Universal Link时,iOS会先检查apple-app-site-association文件的匹配规则——只要规则匹配(这里你的通配符已经覆盖了company.com),iOS就会直接唤醒你的App,然后才会进入application(_:continue:restorationHandler:)(或者SceneDelegate的scene(_:continue:))方法。

此时返回false的作用是告诉iOS:"我的App不处理这个链接",iOS会把链接转交给Safari打开,但你的App已经被启动了,所以你会看到App先打开再跳转到Safari的过程,而不是完全阻止App启动。

能实现只处理特定query的链接吗?

分两种场景来看:

  1. 完全阻止不符合条件的链接唤醒App
    这需要在apple-app-site-association文件里做精准匹配,但遗憾的是,Apple的规则里,path字段只能匹配URL的路径部分(比如/abc),无法直接匹配query参数(比如?query1=abc)。所以如果你的链接是根路径带query的形式,没法通过association文件直接过滤query参数。

    解决思路:调整链接结构,把需要匹配的条件放到路径里,比如把https://company.com/?query1=abc改成https://company.com/valid-path?query1=abc,然后在association文件里只配置"path": "/valid-path/*",这样只有访问这个路径的链接才会唤醒App,其他根路径的链接(比如https://company.com/?query1=123)就不会触发App启动。

  2. 允许App被唤醒,但不处理不符合条件的链接
    如果无法调整链接结构,那只能接受App被唤醒,但在App内部做处理:

    • application(_:continue:restorationHandler:)(或SceneDelegate的对应方法)中解析URL的query参数,判断是否是query1=abc
    • 如果不符合条件,调用UIApplication.shared.open(url)把链接交给Safari打开;
    • 然后可以引导用户返回Home(但注意:iOS不允许App主动调用退出方法,所以只能提示用户手动返回,或者让App停在某个引导页面)。

总结

如果你想要完全阻止不符合条件的链接唤醒App,必须调整链接结构并修改apple-app-site-association的匹配规则;如果可以接受App短暂启动后跳转,那可以在App内部做判断并转跳Safari。

内容的提问来源于stack exchange,提问作者Dr. Mr. Uncle

火山引擎 最新活动