How to NOT handle some Universal Links programmatically?

邮差的信 提交于 2020-06-28 04:06:34

问题


My iOS application handles universal links to redirect safari users to my app. So far everything is working great, if a user tap a link to my web site from Google my app is opening instead of my web site like this:

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

But my app doesn't implement certains features that my web site does, so I would like to programmatically reject some URLs and let my users on safari instead of redirecting him in my app, like this:

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

OR

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

That should by possible according to 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.

Unfortunately that's not what's appending, instead of staying in safari, my user is redirected to my app for a brief moment, then redirected again to safari like this:

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

here is my code for 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: { $0.name == "reject" }) {
        // This line should prevent the app from opening according to Apple's documentation 
        application.open(url)
        return false
    } else {
        return true
    }
}

So anyone have an idea how I could make the rejection of an Universal link the way it's described by Apple's documentation ?

note: the rejection of an universal link need to be done programmatically by the app, according to data stored locally. So adding a path exception in the apple-app-site-association file is not an option in my case :

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

回答1:


If you prefix an entry in the paths array with "NOT" then you can explicitly prevent a match. So in your example you could do something like

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

which would prevent paths with /settings or /activity prefixes, and then match everything else.


Reference



来源:https://stackoverflow.com/questions/58217784/how-to-not-handle-some-universal-links-programmatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!