{"id":1842,"date":"2026-07-25T09:00:00","date_gmt":"2026-07-25T14:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1842"},"modified":"2026-03-07T03:50:12","modified_gmt":"2026-03-07T08:50:12","slug":"deep-linking-standards-2026","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/deep-linking-standards-2026\/","title":{"rendered":"Deep Linking Standards in 2026: What Has Changed"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Deep linking standards evolve with each OS release. The AASA format has changed, Android&#39;s App Links verification process has been updated, and web APIs for app detection continue to develop. If your deep link implementation was set up two years ago and never updated, it may be silently failing for users on newer devices.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers the current state of deep linking standards as of 2026. For the complete deep linking overview, see <a href=\"https:\/\/tolinku.com\/blog\/complete-guide-deep-linking-2026\/\">the complete guide to deep linking in 2026<\/a>. For what the future holds, see <a href=\"https:\/\/tolinku.com\/blog\/future-mobile-deep-linking\/\">the future of mobile deep linking<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Universal Links (iOS)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">AASA Format Evolution<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apple has updated the Apple App Site Association (AASA) file format over time:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Legacy format (iOS 9-12):<\/strong><\/p>\n\n\n\n<pre><code class=\"language-json\">{\n  &quot;applinks&quot;: {\n    &quot;apps&quot;: [],\n    &quot;details&quot;: [\n      {\n        &quot;appID&quot;: &quot;TEAMID.com.example.app&quot;,\n        &quot;paths&quot;: [\n          &quot;\/products\/*&quot;,\n          &quot;\/offers\/*&quot;,\n          &quot;NOT \/admin\/*&quot;\n        ]\n      }\n    ]\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Modern format (iOS 13+, recommended):<\/strong><\/p>\n\n\n\n<pre><code class=\"language-json\">{\n  &quot;applinks&quot;: {\n    &quot;details&quot;: [\n      {\n        &quot;appIDs&quot;: [&quot;TEAMID.com.example.app&quot;],\n        &quot;components&quot;: [\n          {\n            &quot;\/&quot;: &quot;\/products\/*&quot;,\n            &quot;comment&quot;: &quot;Product pages&quot;\n          },\n          {\n            &quot;\/&quot;: &quot;\/offers\/*&quot;,\n            &quot;?&quot;: { &quot;ref&quot;: &quot;?*&quot; },\n            &quot;comment&quot;: &quot;Offers with ref parameter&quot;\n          },\n          {\n            &quot;\/&quot;: &quot;\/admin\/*&quot;,\n            &quot;exclude&quot;: true,\n            &quot;comment&quot;: &quot;Exclude admin paths&quot;\n          }\n        ]\n      }\n    ]\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The modern <code>components<\/code> format supports:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Query parameter matching<\/strong> (<code>&quot;?&quot;<\/code> key)<\/li>\n<li><strong>Fragment matching<\/strong> (<code>&quot;#&quot;<\/code> key)<\/li>\n<li><strong>Exclusion patterns<\/strong> (<code>&quot;exclude&quot;: true<\/code>)<\/li>\n<li><strong>Comments<\/strong> for documentation<\/li>\n<li><strong>Case-insensitive matching<\/strong> (<code>&quot;caseSensitive&quot;: false<\/code>)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">See Apple&#39;s <a href=\"https:\/\/developer.apple.com\/documentation\/bundleresources\/applinks\" rel=\"nofollow noopener\" target=\"_blank\">applinks documentation<\/a> for the full specification.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">AASA Delivery Changes<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Version<\/th>\n<th>AASA Delivery<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>iOS 9-13<\/td>\n<td>Device fetches directly from your domain<\/td>\n<\/tr>\n<tr>\n<td>iOS 14+<\/td>\n<td>Apple&#39;s CDN fetches and caches the AASA (via <code>app-site-association<\/code> service)<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Since iOS 14, Apple&#39;s CDN fetches AASA files on behalf of devices. This means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Changes to your AASA file may take up to 24 hours to propagate.<\/li>\n<li>Apple&#39;s CDN caches aggressively. Setting <code>Cache-Control<\/code> headers on your AASA may not help.<\/li>\n<li>If Apple&#39;s CDN cannot fetch your AASA (server down, blocked by firewall), new installs will not get Universal Links.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">iOS 17-18 Specifics<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Associated Domains Diagnostics<\/strong> is available in Developer Settings, providing real-time status of Universal Link domains.<\/li>\n<li><strong>Managed Associated Domains<\/strong> for enterprise apps allow MDM-pushed domain associations.<\/li>\n<li><strong>App Clips<\/strong> can handle Universal Links for specific experiences without installing the full app.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">App Links (Android)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verification Process<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Android App Links verification has become stricter:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Version<\/th>\n<th>Verification Behavior<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Android 6-11<\/td>\n<td>Verification at install time only<\/td>\n<\/tr>\n<tr>\n<td>Android 12+<\/td>\n<td>Verification at install and periodically after<\/td>\n<\/tr>\n<tr>\n<td>Android 13+<\/td>\n<td>Stricter verification, fails closed (browser opens if not verified)<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">On Android 12+, the system re-verifies App Links periodically. If your <code>assetlinks.json<\/code> is temporarily unavailable during re-verification, App Links may stop working until the next successful verification.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">assetlinks.json Format<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The format has remained stable:<\/p>\n\n\n\n<pre><code class=\"language-json\">[\n  {\n    &quot;relation&quot;: [&quot;delegate_permission\/common.handle_all_urls&quot;],\n    &quot;target&quot;: {\n      &quot;namespace&quot;: &quot;android_app&quot;,\n      &quot;package_name&quot;: &quot;com.example.app&quot;,\n      &quot;sha256_cert_fingerprints&quot;: [\n        &quot;AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90&quot;\n      ]\n    }\n  }\n]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key points for 2026:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Include both your upload key <strong>and<\/strong> the Play App Signing key in <code>sha256_cert_fingerprints<\/code> (if using Play App Signing).<\/li>\n<li>The file must be served at <code>\/.well-known\/assetlinks.json<\/code> with <code>content-type: application\/json<\/code>.<\/li>\n<li>No redirects are allowed on the path.<\/li>\n<li>Google&#39;s <a href=\"https:\/\/developers.google.com\/digital-asset-links\/tools\/generator\" rel=\"nofollow noopener\" target=\"_blank\">Digital Asset Links API<\/a> can validate your file.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Android Intent Filters<\/h3>\n\n\n\n<pre><code class=\"language-xml\">&lt;intent-filter android:autoVerify=&quot;true&quot;&gt;\n    &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\n    &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\n    &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\n    &lt;data android:scheme=&quot;https&quot;\n          android:host=&quot;app.example.com&quot;\n          android:pathPattern=&quot;\/products\/.*&quot; \/&gt;\n&lt;\/intent-filter&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>android:autoVerify=&quot;true&quot;<\/code> is required for verified App Links. Without it, Android shows a disambiguation dialog.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Web Platform APIs<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Web App Manifest (<code>manifest.json<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Manifest\" rel=\"nofollow noopener\" target=\"_blank\">Web App Manifest<\/a> can declare deep link handling:<\/p>\n\n\n\n<pre><code class=\"language-json\">{\n  &quot;name&quot;: &quot;My App&quot;,\n  &quot;related_applications&quot;: [\n    {\n      &quot;platform&quot;: &quot;play&quot;,\n      &quot;url&quot;: &quot;https:\/\/play.google.com\/store\/apps\/details?id=com.example.app&quot;,\n      &quot;id&quot;: &quot;com.example.app&quot;\n    },\n    {\n      &quot;platform&quot;: &quot;itunes&quot;,\n      &quot;url&quot;: &quot;https:\/\/apps.apple.com\/app\/my-app\/id123456789&quot;\n    }\n  ],\n  &quot;prefer_related_applications&quot;: true\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">getInstalledRelatedApps()<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Navigator\/getInstalledRelatedApps\" rel=\"nofollow noopener\" target=\"_blank\">getInstalledRelatedApps() API<\/a> lets websites check if the user has the related app installed:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">if (&#39;getInstalledRelatedApps&#39; in navigator) {\n  const apps = await navigator.getInstalledRelatedApps();\n  if (apps.length &gt; 0) {\n    \/\/ User has the app installed\n    showDeepLinkButton();\n  } else {\n    \/\/ User does not have the app\n    showInstallButton();\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Current support (2026):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Chrome on Android: Supported<\/li>\n<li>Samsung Internet: Supported<\/li>\n<li>Safari: Not supported<\/li>\n<li>Chrome on iOS: Not supported<\/li>\n<li>Firefox: Not supported<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This API is useful for smart banners but cannot replace Universal Links\/App Links for actual deep linking.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Attribution Standards<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">SKAdNetwork (iOS)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apple&#39;s <a href=\"https:\/\/developer.apple.com\/documentation\/storekit\/skadnetwork\" rel=\"nofollow noopener\" target=\"_blank\">SKAdNetwork<\/a> provides privacy-preserving install attribution:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Version<\/th>\n<th>Key Features<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>SKAdNetwork 3.0<\/td>\n<td>Basic install postbacks<\/td>\n<\/tr>\n<tr>\n<td>SKAdNetwork 4.0 (iOS 16.1+)<\/td>\n<td>Multiple postbacks, crowd anonymity, fine\/coarse conversion values<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">SKAdNetwork does not provide deep link data. It only tells you which ad network drove an install, not which specific deep link the user clicked. Combine SKAdNetwork attribution with your own deep link analytics for a complete picture.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Android Attribution Reporting API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Part of the <a href=\"https:\/\/developer.android.com\/design-for-safety\/privacy-sandbox\/attribution\" rel=\"nofollow noopener\" target=\"_blank\">Privacy Sandbox<\/a>, the Attribution Reporting API provides:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Event-level reports:<\/strong> Limited data (source + trigger, noise added)<\/li>\n<li><strong>Aggregate reports:<\/strong> Privacy-preserving aggregate measurement<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Like SKAdNetwork, this does not replace deep link analytics. It complements them by providing privacy-safe install attribution.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deprecated and Removed Standards<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Firebase Dynamic Links (Deprecated)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Google deprecated <a href=\"https:\/\/firebase.google.com\/support\/dynamic-links-faq\" rel=\"nofollow noopener\" target=\"_blank\">Firebase Dynamic Links<\/a> in August 2025. If you are still using them, migrate to App Links or a deep linking platform.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Custom URL Schemes (Discouraged)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">While still technically supported, custom URL schemes (<code>myapp:\/\/<\/code>) are discouraged on both platforms:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>iOS:<\/strong> Universal Links are the recommended approach. Custom schemes lack verification and fallback.<\/li>\n<li><strong>Android:<\/strong> App Links (verified HTTPS links) are preferred. Custom schemes show disambiguation dialogs.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">See <a href=\"https:\/\/tolinku.com\/blog\/custom-url-schemes-guide\/\">custom URL schemes for mobile apps: setup and pitfalls<\/a> for migration guidance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best Practices for 2026<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Use the Modern AASA Format<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If your AASA file still uses the legacy <code>paths<\/code> array, migrate to <code>components<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-json\">\/\/ Before (legacy)\n&quot;paths&quot;: [&quot;\/products\/*&quot;, &quot;NOT \/admin\/*&quot;]\n\n\/\/ After (modern)\n&quot;components&quot;: [\n  { &quot;\/&quot;: &quot;\/products\/*&quot; },\n  { &quot;\/&quot;: &quot;\/admin\/*&quot;, &quot;exclude&quot;: true }\n]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The modern format gives you query parameter matching and better documentation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Include Both Signing Keys (Android)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you use Google Play App Signing, your assetlinks.json must include both the upload key and the Play signing key:<\/p>\n\n\n\n<pre><code class=\"language-json\">{\n  &quot;relation&quot;: [&quot;delegate_permission\/common.handle_all_urls&quot;],\n  &quot;target&quot;: {\n    &quot;namespace&quot;: &quot;android_app&quot;,\n    &quot;package_name&quot;: &quot;com.example.app&quot;,\n    &quot;sha256_cert_fingerprints&quot;: [\n      &quot;UPLOAD_KEY_FINGERPRINT&quot;,\n      &quot;PLAY_SIGNING_KEY_FINGERPRINT&quot;\n    ]\n  }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Monitor Verification Files<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Both Apple&#39;s CDN and Android&#39;s re-verification process can break silently. Set up automated monitoring:<\/p>\n\n\n\n<pre><code class=\"language-bash\"># Run every 6 hours via cron or CI\ncurl -sf https:\/\/yourdomain.com\/.well-known\/apple-app-site-association &gt; \/dev\/null || alert &quot;AASA down&quot;\ncurl -sf https:\/\/yourdomain.com\/.well-known\/assetlinks.json &gt; \/dev\/null || alert &quot;assetlinks down&quot;\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. Test on Latest OS Versions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Each major OS release can change deep linking behavior. Test on the latest iOS and Android betas before they ship:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>iOS betas: Available to developers via <a href=\"https:\/\/developer.apple.com\/programs\/\" rel=\"nofollow noopener\" target=\"_blank\">Apple Developer Program<\/a><\/li>\n<li>Android betas: Available via <a href=\"https:\/\/developer.android.com\/about\/versions\" rel=\"nofollow noopener\" target=\"_blank\">Android Developer Preview<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Tolinku for Standards Compliance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/features\/deep-linking\">Tolinku<\/a> automatically generates and hosts AASA and assetlinks.json files using the current recommended formats. When standards change, Tolinku updates the files without requiring action from you. See the <a href=\"https:\/\/tolinku.com\/docs\/concepts\/deep-linking\/\">deep linking documentation<\/a> for details.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For deep linking challenges, see <a href=\"https:\/\/tolinku.com\/blog\/deep-linking-challenges\/\">common deep linking challenges and how to solve them<\/a>. For the complete guide, see <a href=\"https:\/\/tolinku.com\/blog\/complete-guide-deep-linking-2026\/\">the complete guide to deep linking in 2026<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Stay current with deep linking standards. Review the latest changes to Universal Links, App Links, and web platform APIs for deep linking.<\/p>\n","protected":false},"author":2,"featured_media":1841,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Deep Linking Standards in 2026: What Has Changed","rank_math_description":"Stay current with deep linking standards. Review changes to Universal Links, App Links, and web platform APIs for deep linking in 2026.","rank_math_focus_keyword":"deep linking standards","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-deep-linking-standards-2026.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-deep-linking-standards-2026.png","footnotes":""},"categories":[11],"tags":[25,23,20,24,69,22,558,417],"class_list":["post-1842","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deep-linking","tag-android","tag-app-links","tag-deep-linking","tag-ios","tag-mobile-development","tag-universal-links","tag-updates","tag-web-standards"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1842","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=1842"}],"version-history":[{"count":3,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1842\/revisions"}],"predecessor-version":[{"id":2708,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1842\/revisions\/2708"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1841"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1842"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1842"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1842"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}