AASA文件中通用链接的复杂查询逻辑:AND与OR的实现及最优方案咨询
最近我在开发的App里需要配置通用链接,要求支持8个不同查询参数的任意组合——不管是单个参数、两个参数搭配,还是8个全上,对应的链接都得能正确匹配。比如这些都是合法的目标链接:
https://example.com/path/?term1=foohttps://example.com/path/?term1=foo&term2=barhttps://example.com/path/?term1=foo&term2=bar&term3=baz
折腾了好一阵,我大概摸清楚了AASA文件里components字典的匹配逻辑,但还是想跟大家确认下,也看看有没有更优的方案。
单个components字典:隐式的AND逻辑
我发现,如果在一个components字典里同时指定多个查询参数,它的匹配逻辑是隐式AND——只有当链接包含所有指定的查询参数时,才会匹配成功。
比如下面这个配置:
{ "/": "/path/*", "?": { "term1": "?*", "term2": "?*", "term3": "?*" } }
只有https://example.com/path/?term1=foo&term2=bar&term3=baz这种三个参数全有的链接能匹配,而像https://example.com/path/?term1=foo或者https://example.com/path/?term1=foo&term2=bar这类缺少参数的链接,都不会被匹配到。
多个components字典:实现OR逻辑
如果要让单个查询参数的链接也能匹配,就得给每个参数单独写一个components字典——这相当于实现了OR逻辑,只要链接包含其中某一个指定的参数,就能匹配。
比如下面的配置:
{ "/": "/path/*", "?": { "term1": "?*" } }, { "/": "/path/*", "?": { "term2": "?*" } }, { "/": "/path/*", "?": { "term3": "?*" } }
这种情况下,https://example.com/path/?term1=foo能匹配,但https://example.com/path/?term1=foo&term2=bar这种多参数组合的链接就匹配不到了。
两难的困境:全组合支持的成本
如果要支持8个参数的所有组合(单个、任意多个搭配),按照这个逻辑,我需要写2^8=256个components字典,这显然太臃肿了,维护起来也不现实。
目前我想到的替代方案是:只在AASA里配置路径匹配,比如:
{ "/": "/path/*" }
然后把查询参数的校验逻辑放到App内部——当App通过通用链接唤起时,再去检查链接里的查询参数是否合法。
现有依据:WWDC Session的暗示
我翻了苹果的官方文档,没找到关于这个逻辑的明确说明,但在WWDC 2019的Session 717《What's New in Universal Links》里看到一句话:
For a components dictionary to match a candidate URL, all the specified components must match
这句话暗示了单个components字典里的所有配置项(包括查询参数)都是AND逻辑,必须全部满足才会匹配。
现在想请教各位同学:有没有人有过类似的配置经验,或者找到过苹果更明确的官方说明,能支持或者推翻我这个结论的?
内容来源于stack exchange

