Short answer: Apple's archived documentation says that from iOS 9 the file "may be a JSON file with a MIME type of application/json". Servers often send an extensionless file as application/octet-stream, or return an HTML page instead. Set Content-Type: application/json on the file and confirm the body is plain JSON.
What is happening
AASA content type: the Content-Type header your server sends with the apple-app-site-association file, which should be application/json for an unsigned JSON file.
Because the file has no extension, many servers guess the type. Apple's current pages do not state a required content type; the application/json guidance comes from Apple's archived Handoff guide. Apple's own CDN returns Content-Type: application/json for the files it caches, which is a good sign of what it expects.
- iOS 8 used signed files with
application/pkcs7-mime. Unsigned JSON has been accepted since iOS 9. - Whether
text/plainorapplication/octet-streamis rejected today is not documented, so the safe choice isapplication/json.
Why does this happen?
Static hosts map types by file extension, and this file has none. Frameworks that route unknown paths to an app shell can also return HTML for the URL.
- Extensionless default:
application/octet-streamortext/plain. - Single-page app fallback: the server returns
index.htmlfor/.well-known/.... - Old signed file: a CMS-signed file left over from iOS 8 days, sent as
application/pkcs7-mime.
How to confirm it
- Run
curl -I https://example.com/.well-known/apple-app-site-associationand read theContent-Typeheader. - Run
curl -son the same URL and check the body starts with{, not<!DOCTYPE html>. - Optionally, check Apple's CDN copy with
curl -i https://app-site-association.cdn-apple.com/a/v1/example.com. This URL is not documented by Apple but is widely used for debugging. - Run the body through a JSON parser such as
jq, thensudo swcutil verifyon a Mac, to rule out JSON or structure errors.
How to fix it
- Set
Content-Type: application/jsonfor/.well-known/apple-app-site-association. - Exclude
/.well-known/from any single-page app fallback route. - Replace any signed file with plain, unsigned JSON.
- Keep the file name without an extension.
- Reinstall the app on a test device to fetch the new copy.
Examples for common hosts:
# Netlify (_headers)
/.well-known/apple-app-site-association
Content-Type: application/json
# Apache (.htaccess in /.well-known/)
<Files "apple-app-site-association">
ForceType application/json
</Files>
Android has a firm rule here: Google requires application/json for assetlinks.json, covered in assetlinks redirect and content type. For a full delivery check, see AASA redirect or blocked and the universal links setup guide.