Search code examples
iosswiftdeep-linkingios-universal-links

universal link goes to safari instead of the app that called it


I have a working universal link that works when used by another app. eg. if I write the link in notepad it will open app the app. But when I call the following inside the app that the universal link links to, it will open in safari. canOpenURL returns true.

have set up this .well-known/apple-app-site-association and also the correct intent-filter. I think its working because the links open the app when clicked outside of the app.

let url = Foundation.URL(string: "https://workingdeeplink.com/")!
        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }

Solution

  • This is expected behaviour. When an app passes its own universal link to open, iOS will open that link in Safari.

    The purpose of this is to allow a fallback when an app cannot handle an incoming link. The logic for handling an incoming link is typically something like:

    1. Parse the incoming link
    2. Determine if the app can handle it
    3. If it can, then handle the link (e.g. select a specific view or take some action)
    4. If it can't, pass the link to open so that the user is redirected back to the web site, where the link can be handled.

    This avoids the situation where a deep link opens your app and then nothing happens or an error is shown (because the app can't handle the url)

    There shouldn't be a case where your app tries to open a deep link it can handle; it can simply bypass then whole deep link process and take the action that would result directly.