From 689cfb6d45a2824e255a0204c8793cc61277f9a1 Mon Sep 17 00:00:00 2001 From: Matthew Remmel Date: Tue, 26 Aug 2025 10:37:45 -0400 Subject: [PATCH 1/6] Add placholder changes for deep linking --- android/app/src/main/AndroidManifest.xml | 6 ++++++ ios/App/Flotilla Chat.entitlements | 4 ++++ static/.well-known/apple-app-site-association | 11 +++++++++++ static/.well-known/assetlinks.json | 10 ++++++++++ 4 files changed, 31 insertions(+) create mode 100644 static/.well-known/apple-app-site-association create mode 100644 static/.well-known/assetlinks.json diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 65a9dbe7c..72cdff9f7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -20,6 +20,12 @@ + + + + + + aps-environment development + com.apple.developer.associated-domains + + applinks:app.flotilla.social + diff --git a/static/.well-known/apple-app-site-association b/static/.well-known/apple-app-site-association new file mode 100644 index 000000000..3de9f2d8b --- /dev/null +++ b/static/.well-known/apple-app-site-association @@ -0,0 +1,11 @@ +{ + "applinks": { + "apps": [], + "details": [ + { + "appID": "TODO", + "paths": ["*"] + } + ] + } +} diff --git a/static/.well-known/assetlinks.json b/static/.well-known/assetlinks.json new file mode 100644 index 000000000..720d0171f --- /dev/null +++ b/static/.well-known/assetlinks.json @@ -0,0 +1,10 @@ +[ + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "TODO", + "sha256_cert_fingerprints": ["TODO"] + } + } +] From b81f7c9ed3a9a318a01af0ed68fc4b077c4cc505 Mon Sep 17 00:00:00 2001 From: Matthew Remmel Date: Tue, 26 Aug 2025 12:14:11 -0400 Subject: [PATCH 2/6] Add basic deep link route handling --- src/routes/+layout.svelte | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index cf9eb955b..da4d63138 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -4,7 +4,7 @@ import {onMount} from "svelte" import * as nip19 from "nostr-tools/nip19" import {get, derived} from "svelte/store" - import {App} from "@capacitor/app" + import {App, type URLOpenListenerEvent} from "@capacitor/app" import {dev} from "$app/environment" import {goto} from "$app/navigation" import {sync, localStorageProvider} from "@welshman/store" @@ -108,6 +108,13 @@ } }) + // Listen for deep link events + App.addListener("appUrlOpen", (event: URLOpenListenerEvent) => { + const url = new URL(event.url) + const target = `${url.pathname}${url.search}${url.hash}` + goto(target, {replaceState: false, noScroll: false}) + }) + // Nstart login if (window.location.hash?.startsWith("#nostr-login")) { const params = new URLSearchParams(window.location.hash.slice(1)) From bb1ff4fb115952c47ee83681440fd7037e818c44 Mon Sep 17 00:00:00 2001 From: Matthew Remmel Date: Tue, 26 Aug 2025 12:43:44 -0400 Subject: [PATCH 3/6] Add temporary web event listener for deep link navigation testing in web browser --- src/routes/+layout.svelte | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index da4d63138..8bf30ae09 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -110,11 +110,24 @@ // Listen for deep link events App.addListener("appUrlOpen", (event: URLOpenListenerEvent) => { + console.log(event) const url = new URL(event.url) const target = `${url.pathname}${url.search}${url.hash}` goto(target, {replaceState: false, noScroll: false}) }) + // TEMP: Since the capacitor event won't fire in web, dropping equivalent implementation here for testing navigation + // + // Event can be manually triggered in web console with: `window.dispatchEvent(new CustomEvent("appUrlOpen", { detail: { url: "foobar:///.well-known/apple-app-site-association" } }) );` + window.addEventListener("appUrlOpen", (_event: Event) => { + console.log(_event) + const event = _event as CustomEvent<{url: string}> + const url = new URL(event.detail.url) + const target = `${url.pathname}${url.search}${url.hash}` + console.log(target) + goto(target, {replaceState: false, noScroll: false}) + }) + // Nstart login if (window.location.hash?.startsWith("#nostr-login")) { const params = new URLSearchParams(window.location.hash.slice(1)) From 4955a4f16cde34cb48ea4af1044133dbd07dfb25 Mon Sep 17 00:00:00 2001 From: Matthew Remmel Date: Tue, 26 Aug 2025 13:16:32 -0400 Subject: [PATCH 4/6] Add real values in app association files --- static/.well-known/apple-app-site-association | 2 +- static/.well-known/assetlinks.json | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/static/.well-known/apple-app-site-association b/static/.well-known/apple-app-site-association index 3de9f2d8b..61e1c4df7 100644 --- a/static/.well-known/apple-app-site-association +++ b/static/.well-known/apple-app-site-association @@ -3,7 +3,7 @@ "apps": [], "details": [ { - "appID": "TODO", + "appID": "S26U9DYW3A.social.flotilla", "paths": ["*"] } ] diff --git a/static/.well-known/assetlinks.json b/static/.well-known/assetlinks.json index 720d0171f..8d3767ae9 100644 --- a/static/.well-known/assetlinks.json +++ b/static/.well-known/assetlinks.json @@ -3,8 +3,11 @@ "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", - "package_name": "TODO", - "sha256_cert_fingerprints": ["TODO"] + "package_name": "social.flotilla", + "sha256_cert_fingerprints": [ + "D0:2A:2E:82:75:92:4D:E2:13:E8:46:B8:EA:09:15:17:7F:46:7B:D1:49:E3:12:60:F0:01:D3:EF:42:9B:A2:DA", + "6D:AF:68:3E:1C:A8:3A:4C:D8:85:73:E9:73:9E:2A:A9:44:C8:5D:56:15:4E:34:42:30:55:7C:FF:ED:4A:D7:8C" + ] } } ] From a2a4b3599fa463319d504e5ee9e3131f6fd01d21 Mon Sep 17 00:00:00 2001 From: Matthew Remmel Date: Tue, 26 Aug 2025 13:17:25 -0400 Subject: [PATCH 5/6] Remove temporary code and comments --- src/routes/+layout.svelte | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 8bf30ae09..da4d63138 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -110,24 +110,11 @@ // Listen for deep link events App.addListener("appUrlOpen", (event: URLOpenListenerEvent) => { - console.log(event) const url = new URL(event.url) const target = `${url.pathname}${url.search}${url.hash}` goto(target, {replaceState: false, noScroll: false}) }) - // TEMP: Since the capacitor event won't fire in web, dropping equivalent implementation here for testing navigation - // - // Event can be manually triggered in web console with: `window.dispatchEvent(new CustomEvent("appUrlOpen", { detail: { url: "foobar:///.well-known/apple-app-site-association" } }) );` - window.addEventListener("appUrlOpen", (_event: Event) => { - console.log(_event) - const event = _event as CustomEvent<{url: string}> - const url = new URL(event.detail.url) - const target = `${url.pathname}${url.search}${url.hash}` - console.log(target) - goto(target, {replaceState: false, noScroll: false}) - }) - // Nstart login if (window.location.hash?.startsWith("#nostr-login")) { const params = new URLSearchParams(window.location.hash.slice(1)) From 72c7dd6126b945a7f18d17072da43ade353bd336 Mon Sep 17 00:00:00 2001 From: Matthew Remmel Date: Tue, 26 Aug 2025 13:31:01 -0400 Subject: [PATCH 6/6] Add missing data config to android manifest --- android/app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 72cdff9f7..eac74c18f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -25,6 +25,7 @@ +