Apple App Site Association not working if app is not installed - ios

We've been testing our app and in development things were perfect regarding app association/deeplinking. We have our .well-known/apple-app-site-association working, validating, Branch.io's AASA validator passing with our domain+team ID+bundle combo. Of course there wasn't a way to test it live with App Store link until it was actually on App Store.
Today we've released our app, and realized that even when we go to our page which should be handled by the deep linking, the "top bar" (install/open link) wasn't being displayed. If we install the app, then the top bar displays with the "open" link but not having "install" button when app isn't installed is killing the whole purpose.
Apple's search validation tool however gives the following error for "Link to Application" section:
Error no apps with domain entitlements
The entitlement data used to verify deep link dual authentication is from the current released version of your app. This data may take 48 hours to update.
Here is what we have:
A correct, validating (through https://branch.io/resources/aasa-validator) AASA file in our .well-known directory with correct mime type, Team ID suffix, and bundle ID.
Our app, just published on the App Store
Apple's Search Validation Tool (https://search.developer.apple.com/appsearch-validation-tool/) telling that association is not found even though Branch.io's one doesn't complain.
Association working (top bar shown at paths that we defined) when app is installed, either through App Store, TestFlight, or manually from Xcode.
Association not working (top bar not shown at all as if AASA doesn't exist) when app is not installed.
We need to show the bar when app is not installed, too. Are we missing something or is it just a matter of time for Apple to index and map our App Store app and domain now?

What you are looking for is a Smart banner.
To get this to appear you need to add some meta data to your web page.
<meta name="apple-itunes-app" content="app-id=myAppStoreID, app-argument=myURL">
There are two different processes at work in what you are trying to achieve:
When you install an app with an associated domains entitlement, iOS fetches the ASAA file from that domain and then uses that to direct requests to your app for matching URLs
When you don't yet have the app installed, Safari uses the meta data to offer the app to the user. Safari does not check every single domain that the user accesses for an ASAA file, so without the meta data you won't get the smart banner.

Related

Firebase dynamic link always goes to ios app store even if app installed

I have a dynamic link that is working fine on Android however I can't get the App Store redirect behaviour working correctly on iOS.
If I set up the dynamic link to go to a url (not the app store) if the app is not installed it works as expected and opens the app. This is the dynamic link:
https://go.xxxxx.app/?link=https://member.xxxxx.app&apn=app.xxxxx.xxxxx&isi=1573527302&ibi=app.xxxxx.xxxxx&ifl=https://member.xxxxx.app&efr=1
However if I set it to go to the app store if the app is not installed it ALWAYS goes to the app store, even if the app is installed.
https://go.xxxxx.app/?link=https://member.xxxxx.app&apn=app.xxxxx.xxxxx&isi=1573527302&ibi=app.xxxxx.xxxxx&efr=1
I am obviously doing something wrong or misunderstand the relationship between deep links and dynamic links. "go" is my dynamic link subdomain and "member" is my deep link subdomain.
I realise there are several other questions on this but none of the answers helped me.
Other info
I am using a physical iPhone 8 with iOS 15.4.1
This is my deeplink which works fine if I click the url on my device:
https://member.xxxxx.app
I have an app association file set up here:
https://member.xxxxx.app/.well-known/apple-app-site-association
I also set it here as I wasn't sure whether to set it up for the dynamic link as well:
https://go.xxxxx.app/.well-known/apple-app-site-association
I have the following Associated Domain set up in Xcode:
applinks:member.xxxxx.app
Note that I have not added the associated domain applinks:go.xxxxx.app as this just seemed to make the dynamic link be treated like a deeplink.
I have the capability associated domains turned on in my Apple Developer identifier.
My app is published to the app store but not the latest version of the app with the associated domain member.xxxxx.app.
I have added my app and team id to Firebase on the ios app.
I have "Associated Domains Development" turned on in the developer settings of my iPhone.
I added FirebaseDynamicLinksCustomDomains in my info.plist as mentioned here:
https://firebase.google.com/docs/dynamic-links/custom-domains#set_up_a_custom_domain_in_the
It appears I needed to add applinks:go.xxxxx.app to the Associated domains as well. I can't test from the App Store if the link parameter works I guess I will have to wait until I release to the store.
So the dynamic link is also a deep link that contains another deep link.
Kind of confusing. If anyone can add some more info or explanation that would be great.
I will leave the question here for now as it may help people.
I have the following Associated Domain set up in Xcode: applinks:member.xxxxx.app Note that I have not added the associated domain applinks:go.xxxxx.app as this just seemed to make the dynamic link be treated like a deeplink.
Edit:
To get the dynamic link working in iOS see my answer here:
Firebase short dynamic link not working in iOS (being treated as a deeplink)

Is it possible to verify the apple app site association file was properly requested and configured for an instance of an installed IOS app?

Is it possible to verify the apple app site association file was properly requested and configured for an instance of an installed IOS app? Ideally, we could easily verify that Universal Links are working properly for an instance of a device and installed application for the purpose of debugging. As an alternative, we could leverage a metric that confirms this association occurred properly for the purpose of alarming.
Background
Clicking on a URL associated with an IOS application that has been properly configured Universal Links enabled sometimes does not immediately launch the associated app.
I am aware that there are a few known cases where the app does not launch when it should (eg. Source App use redirect URL for attribution, Association files fail to load etc), but it is not clear at a glance if this behavior is an actual widespread issue and it is not clear how to debug it.
What I have tried?
Followed all steps listed for Support Universal Links to ensure Universal Links are properly configured
Verified URL host with Branch.io AASA Validator
Confirmed there is no Web Server errors when serving these AASA files from /.well-known/apple-app-site-association
Confirmed this behavior works most of the time*
*As an alternative to debugging, we have considered a metric that confirms this association (if it exists)

Firebase Dynamic Links for iOS work for my device and simulators, but do not work for users after release

So I have implemented Firebase Dynamic Links in my app. I thought that I had them set up correctly, because they work for my own personal device and the simulators perfectly. I released the update to the app, but when two of my friends tried to open them after updating to the new version, it takes them to the Firebase website citing an error. I click the same link and it opens my app and handles the link.
Firebase has added the apple app site association to my domain prefix, I have added the a--link in my app's capabilities, I am truly at a loss as to why this may be. Even if they click the link from notes, it does not give them the option to open the link with my app like it will for me.
Is there anything that I could be overlooking? Happy to supply any relevant details but I feel like I have to be missing something.
App Links:
applinks:share.***.app
URL Type is set up in Target Info.
Custom Dynamic Domain is set in info.plist.
For others that come across this, it seems to be an open Apple bug: http://www.openradar.me/radar?id=4999496467480576
After several days, the user's apps downloaded the proper AASA and the deep links began to work. There doesn't seem to be a workaround with Google Dynamic Links, but Branch.io offers forced URI redirect mode to avoid this issue.

Universal links for iOS apps - how it works?

I am new to adding universal links to iOS applications. I have read some materials but still have a few questions below. Any pointer will be greatly appreciated!
When exactly Apple will crawl my domain and inspect the [domain]/apple-app-site-association content? I have a new domain, and I'm wondering how Apple's crawler can discover it?
What's the recommended way to test universal links locally before publishing the first version of my app?
Is version control for universal links not possible? For example, the app 1.0 version only supports \item universal link, but app 2.0 version supports one more schema \details . If I specify both paths in apple-app-site-association, then the 1.0 app will break when user navigate to \details. (Edit: I noticed that if the app appropriately set it to be unhandled, then we can still fall back to browser.)
Thanks!
When a device downloads an app, it looks for an entitlements file to list out your associated domains. When it finds that your app has associated domains, it will check those domains for the aasa and download it onto the device. The aasa for that app will only be downloaded on install and update so changes you make will not effect all of your apps.
For testing you can host your AASA on a testing domain or on your production domain. It's up to you but you have to remember to update your entitlements file when you push it to production to ensure that you have the right domain configured. Every time you rebuild the app, it should re-download the aasa so testing shouldn't be too difficult. Always remember to paste the link in notes and not type it into Safari. Universal links only work when they are tapped, not typed in.
For your example you should make sure your new AASA is published at the exact time you publish your app. You should probably use a separate testing domain to host your AASA. You can just include both domains in your entitlements.
Branch actually has testing environment and AASA hosting built in if you'd prefer not to handle all of that on your own. They also leverage URI schemes in cases where Universal Links don't work.

Universal Links on macOS

Since iOS9, universal links work on iOS, but I am wondering if there is something like that on macOS? We have an application that is a macOS-App with a corresponding Web-App, and we would love links clicked by the user to open in the Mac-App instead of opening the browser with the target-link.
Is that anyhow possible on macOS? I just found samples for iOS, but none for macOS?!?
Supporting Universal Links on macOS requires support from both your app and your website (and macOS 10.15+).
See Apple's documentation Allowing Apps and Websites to Link to Your Content for details (the article deals with iOS, tvOS and macOS deep links), and its sub-articles Enabling Universal Links as well as Handling Universal Links.
Quick overview:
Basically, it's the same as on iOS: you need to create an apple-app-site-association file that is hosted on your server either in the root directory or in the .well-known directory (described in "Enabling Universal Links" linked above). It describes which URL paths can be passed to your app. It's important that this file is valid JSON (validate it!) and is served via HTTPS with a valid certificate and without any redirects!
You need to enable the "Associated Domains" capability in your provisioning profile. Details depend on whether Xcode manages your profiles or not. In your entitlements file (usually editable via the "Signing & Capabilities" tab of your target in Xcode) you need add the corresponding associated domain, like applinks:my.domain.example (no https:// or anything, just the raw domain name).
Then you need to implement application(_:continue:restorationHandler:) in your app delegate to handle the Universal Link.
It can be annoying to make macOS pick up the association for the first time during development. Debugging hints:
Open Console.app and filter for swcd, that's the daemon responsible for associated web credentials and Universal Links. Sometimes you see hints why it did not work (like refusing the apple-app-site-association file).
Also I had to kill the swcd daemon to make it get restarted by launchd and then pick up changes/fixes I did to the apple-app-site-association file. Both iOS and macOS should usually reload this file on "app installation"1 (haven't seen this getting specified more clearly; I guess they mean App Store installs/updates but I don't know about when this is loaded for macOS apps distributed outside the App Store).
Also, be aware that entering a Universal Link in Safari will not hand off to your app: Apple has stated in the dev forums2 that they believe if a user is already in the browser environment they want to stay there and not suddenly move to an app. Therefor, to test the Universal Link, open Notes.app, create a new note and enter/paste the Universal Link you want to test there. You can then click it and get asked whether you want to open this in your app.
1) Sorry, don't have a dev forum link where I read this.
2) Again, sorry, don't have a link right now. Saw this stated at least two times by Apple employees, both cited the Notes trick. Even though they were talking about iOS there, this behaviour is the same on macOS as well.

Resources