Short answer: The same apple-app-site-association file serves several Apple services. If it has webcredentials or appclips but no applinks key, password autofill may work while universal links never do. Add an applinks section with your app IDs and paths.
What is happening
Missing applinks: an apple-app-site-association file with no applinks key, so iOS has no universal link rules for the domain even if other services in the file work.
Apple's Associated Domains entitlement supports four services: applinks, webcredentials, activitycontinuation (Handoff) and appclips. Each one reads its own key from the same file. A file built for one service does nothing for the others.
- Shared web credentials can work while links fail, which looks contradictory.
- The file downloads with
curl -I https://example.com/.well-known/apple-app-site-association, butsudo swcutil verifynever printsPattern "..." matched., even ifwebcredentialsorappclipsis present.
Why does this happen?
The file was usually created for a different feature first, often password autofill, and universal links were added to the app later without updating the file. Sometimes the entitlement has applinks:example.com but the file was never extended to match.
- Built for autofill: only
webcredentialsexists. - Built for App Clips: only
appclipsexists. - Typo:
appLinksorapp_linksinstead ofapplinks.
How to confirm it
- Fetch the file:
curl -s https://example.com/.well-known/apple-app-site-association. - Look for a top-level
applinkskey, spelled exactly in lower case. - Check the app's entitlement in Xcode under Signing & Capabilities > Associated Domains. It should list
applinks:example.com. - Run
sudo swcutil verifyon a Mac against a real URL.
How to fix it
- Add a top-level
applinksobject next to the existing keys. - Inside it, add a
detailsarray with one entry per set of apps. - List your app IDs in
appIDs, in the form<Application Identifier Prefix>.<Bundle Identifier>. - List the URL patterns in
components, with exclusions first. - Make sure the entitlement includes
applinks:for every domain that should open the app. Apple says not to include a path, query or trailing slash. - Deploy the file and reinstall the app on a test device.
{
"applinks": {
"details": [
{
"appIDs": ["ABCDE12345.com.example.app"],
"components": [{ "/": "/*" }]
}
]
},
"webcredentials": { "apps": ["ABCDE12345.com.example.app"] }
}
Write both sections from your Team ID and bundle ID, as shown in the universal links setup guide. Once applinks is in place, check the app ID format next, and see the universal links setup guide for the app side.