How to trigger NSUserActivity continuation (Universal Links opening) in the current app? - ios

Universal Links in iOS9 use the Handoff mechanism to look at a link in an app instead of the browser: Whenever a Universal Link is clicked, iOS activates the corresponding app and calls -application:continueUserActivity:restorationHandler with a user activity containing the Universal Link's URL (see Apple guide on Universal Links).
I'd like to trigger this mechanism manually, i.e. creating an NSUserActivity instance with a webpageURL property and dispatching it to be handled by the current app's -application:continueUserActivity:restorationHandler. Is there a way to achieve this?
At the moment I'm just calling -application:continueUserActivity:restorationHandler directly, but this feels wrong and I'd like to implement it in a more proper way.

Related

How to do deep linking from app/browser to native iOS app with 2 different urls

I am working on project where I have been implementing deep linking from app/browser to my app. I have everything setup and it has been working as expected.
But recently, there is changed to the other app where there is new url introduced, which is launching in the browser and that url has changed to exiting url. But it is not launching my app. How to implement and launch my app with that change?
Example
--> deep link url, https://www.externalApp.com/requestPage=homePage&id=4444
--> When user tap on button on the external app, the above URL is invoke and launch the my app.
After change
--> Now new url, http://www.externalApp.com/request=sometoken
--> when user tap on button, http://www.externalApp.com/request=sometoken invoke and open browser and then become https://www.externalApp.com/requestPage=homePage&id=4444 in the browser. But it is staying in the browser and not opening my app.
Expectation is to launch app after url become https://www.externalApp.com/requestPage=homePage&id=4444.
Please help and advise.
A URL redirect will not trigger your app deeplink under any circumstance.
The ideal way to do this would be for your app to handle the URL http://www.externalApp.com/request=sometoken and convert it into https://www.externalApp.com/requestPage=homePage&id=4444 using whatever logic you are currently executing server-side (or on the webpage).
If this is not possible in any way, then the discussion goes into the direction of ugly hacks where you try to trigger the deeplink using Javscript, which can fail (since you cannot guarantee that the deeplinked app is present on the device). I would not delve into those pathways here and recommend you re-think your solution.
Please note that I do not mean to disparage or deride your implementation in any way. You may have a valid use-case where such a flow is required. But with how universal links work on iOS, the above is my recommendation based on my experience as a developer.

Firebase Dynamic Link isn't handled in ios app

I am using Firebase Dynamic Links to handle deep linking into my ios app (from external links) and this works fine.
My issue is when I try to handle a dynamic link that has been launched from inside the app. In particular, I am using Firebase in-app messaging with a dynamic link as the action on the card button.
I have added the capabilities and URL scheme to Xcode. The documentation states that I use the Firebase app bundle as the URL scheme value. The only thing that isn't clear is whether this means the Firebase project id or the dynamic link domain which is the one set in the capabilities tab as the applinks: value.
When I tap on the button to launch the dynamic link it does recognise it as a dynamic link (because it doesn't just open my hosting domain in the browser), but it redirects to the browser first and asks me if I want to open the app (that I just came from).
Does anybody know how to configure this behaviour so the links don't ask you first? Would this then immediately handle the link in the app?
UPDATE
I was able to get the app to handle the dynamic link immediately in the app by skipping the preview page. You do this by manually constructing the link and setting the efr=1 parameter. This article explains it all: https://firebase.google.com/docs/dynamic-links/create-manually
BUT - although my app was handling the deep-link, it STILL redirected to the browser where it attempted to load the web.app domain from hosting.
I feel this could be something to do with the URL types setting in Xcode which if set properly should prevent it from trying to handle links in the browser.
UPDATE UPDATE
For some reason, this just stopped redirecting to the browser and I have no idea why. I watched a Firebase video and the guy did mention something about iOS being weird, and that Safari can break dynamic links and he recommended always testing them from the notes app. Weird. I wonder if something got pwned somewhere. I will write up an answer. đź‘Ť
Not entirely sure why, but this just started to behave. The dynamic link I am using in the in-app messaging campaign is the long-form URL with the efr=1 parameter to skip the preview page in the browser.

Universal Links opened in unsupported apps, are they completely lost?

I am trying to implement Branch marketing links in my app. I want for example to be able to create a link to share with users that will route them to a particular screen in the app. I noticed from the Branch docs that for some apps the link just opens the app store and not the actual app (even if it is installed). Being based in Asia I have the feeling that most of our customers will be wanting to share the link via an unsupported app such as Line. If a user is redirected to the app store via the link and then taps “open app”, what happens? Is the link meta data lost? Does the meta data only remain if the link is opened in an app such as mail or notes?
Alex from Branch.io here:
This list in the Branch documentation gives a partial list of apps that support Universal Links, but unfortunately it is not complete. We've tried to cover the most common apps.
Line is using a custom webview (not SFSafariViewController). It doesn't support Universal Links for the initial click, but this is one of the edge cases where Branch can detect the originating app and do some custom behavior. For Line, we trigger your app's URI scheme. This means the behavior your users see when clicking a Branch link from within Line is the same as Universal Links, even though Universal Links isn't actually the protocol being used.
If you want to handle other apps where Branch doesn't have a workaround like this, you could try enabling the deepviews feature. This will cause the link to open a content preview with a button to launch the app (or forward to the App Store if not installed).
When a user with the app already installed clicks the Open button on the App Store page, all the meta data is preserved and they will still be deep linked. Branch doesn't know (or care!) what happens between when the user clicks the link and the app launches, so that gives you plenty of flexibility.
Universal Links have some restrictions - not from Branch but from Apple's implementation. One of these restrictions is Universal Links cannot be opened from SFSafariViewController.
From Branch's docs, Line is not explicitly mentioned but other popular messaging apps may be of interest. I don't have Line myself but whether Line launches websites in it's own browser or the Safari app may give you a clue.
Facebook Messenger - works conditionally
WeChat - works conditionally
Twitter - works conditionally
LinkedIn - works conditionally
Any app using SFSafariViewController - works conditionally

iOS / Uber integration: link_text and partner_deeplink not working in testing

I'm making an iOS (v8.3+) app which is a mapping app. The user can define a starting point and destination. They can then tap the Share button and choose "Open in Uber", which will launch the Uber app via a deeplink URL like this:
uber://?client_id=MY_CLIENT_ID&action=setPickup&link_text=Watch%20progress%20in%20my%20app&partner_deeplink=SOMEDEEPLINK%3A%2F%2F&pickup[latitude]=123.456&pickup[longitude]=123.456&pickup[nickname]=PICKUP&pickup[formatted_address]=123%20Elm%20St&dropoff[latitude]=123.456&dropoff[longitude]=123.456&dropoff[nickname]=DROPOFF&dropoff[formatted_address]=456%20Elm%20St
(This sample URL includes some obviously fake data, for the sake of simplicity.)
I've registered at Uber and have a valid client ID. This call (via openURL) works correctly: the Uber app launches with the starting point and destination already populated. This is ALL that I've done with Uber; there's no other calls being made at all.
The problem is that the special branding text does not appear within the Uber app during the trip (and of course the related partner_deeplink doesn't work either).
What do I need to do in order to get it to work? Do I need to "enable" this functionality somehow? My app has registered its own custom URL scheme that I use as the "partner_deeplink=SOMEDEEPLINK%3A%2F%2F" portion of the uber:// URL. I know this works because I can use my custom URL scheme in Safari and it successfully launches my app.
Thanks in advance for any insights!
You need to Request Full Access in the Uber Developer Dashboard to get activated for the Trip Branding feature. Please check out the documentation here.
As soon as you're activated, you can set defaults for the custom assets and the deeplink parameters you're referring to are essentially used to dynamically override these defaults.

How does one debug application:openURL:sourceApplication:annotation?

Apple's documentation about the new iOS smart banners feature in mobile Safari talks about how to implement application:openURL:sourceApplication:annotation to allow your app to be opened from the banner, taking the user directly to a specific area of your app:
Promoting Apps with Smart App Banners
My question is, how does one test/debug this functionality? I.e. how can you trigger a call to application:openURL:sourceApplication:annotation passing in a test URL of your choice?
If you are using a custom url scheme like walmart://whatever/whatever you can type it into safari and it'll hit application:openURL:sourceApplication:annotation

Resources