如何不以编程方式处理某些通用链接?

How to NOT handle some Universal Links programmatically?

我的 iOS 应用程序处理 universal links 以将 Safari 用户重定向到我的应用程序。到目前为止,一切都很好,如果用户从 Google 点击 link 到我的网站,我的应用程序正在打开,而不是像这样打开我的网站:

from safari https://my-web-site.com -> my-app

但是我的应用程序没有实现我的网站所具有的某些功能,因此我想以编程方式拒绝某些 URL 并让我的用户使用 safari,而不是在我的应用程序中重定向他,如下所示:

from safari https://my-web-site.com -> my-app

from safari https://my-web-site.com?reject -> safari

根据Apple documentation应该是可能的:

It’s important to understand that if your app uses openURL: to open a universal link to your website, the link does not open in your app. In this scenario, iOS recognizes that the call originates from your app and therefore should not be handled as a universal link by your app.

不幸的是,这不是附加内容,我的用户没有停留在 safari 中,而是被重定向到我的应用程序一小会儿,然后再次重定向到 safari,如下所示:

from safari https://my-web-site.com?reject -> my-app (briefly) -> safari

这是我的 AppDelegate.swift 代码:

internal func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard let url = userActivity.webpageURL else { return false }
    guard let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else { return false }

    let params = urlComponents.queryItems ?? []

    if params.contains(where: { [=14=].name == "reject" }) {
        // This line should prevent the app from opening according to Apple's documentation 
        application.open(url)
        return false
    } else {
        return true
    }
}

所以有人知道我如何按照 Apple 文档中描述的方式拒绝 Universal link 吗?

注意:根据本地存储的数据,拒绝通用 link 需要由应用程序以编程方式完成。因此,在 apple-app-site-association 文件中添加路径例外 不是一个选项 在我的例子中:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "XXXXXXXXX.com.my-app",
        "paths": [
          "*",
        "NOT /reject"
        ]
      }
    ]
  }
}

如果您在路径数组中的条目前面加上 "NOT",那么您可以明确地阻止匹配。所以在你的例子中你可以做类似

["NOT /settings/*", "NOT /activity/*", "/*"] 

这将阻止带有 /settings/activity 前缀的路径,然后匹配其他所有内容。


Reference