Der Host steht fest im Manifest und muss beim Bauen mitgegeben werden. Das Publish-Skript rief Gradle bisher ohne ihn auf, ein so veroeffentlichtes APK haette also den Platzhalter aus build.gradle.kts getragen und geteilte Links waeren im Browser gelandet statt in der App. NOVASONIC_HOST (und optional NOVASONIC_HOST2) kommen aus scripts/.env.release; fehlt der Wert, warnt das Skript deutlich, statt still das Falsche zu bauen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
115 lines
4.8 KiB
Markdown
115 lines
4.8 KiB
Markdown
# Teilen per Link
|
|
|
|
Ein geteilter Link sieht so aus:
|
|
|
|
```
|
|
https://<deine-web-adresse>/?song=<navidrome-song-id>
|
|
https://<deine-web-adresse>/?album=<navidrome-album-id>
|
|
```
|
|
|
|
Er trägt **nur die Id**, keine Zugangsdaten. Der Empfänger sieht den Inhalt mit seinem eigenen
|
|
Navidrome-Konto auf derselben Instanz — wer dort keinen Zugang hat, sieht nichts.
|
|
|
|
## Web
|
|
|
|
Funktioniert ohne weitere Einrichtung. Der Link wird beim Start ausgelesen (`?song=` / `?album=`),
|
|
das Album geöffnet und der Song abgespielt; danach verschwindet der Parameter aus der Adresszeile,
|
|
damit ein Neuladen nicht erneut startet. Als installierte PWA landet der Link dank
|
|
`launch_handler: navigate-existing` im bereits offenen Fenster statt in einem neuen.
|
|
|
|
## Android
|
|
|
|
Zwei Dinge sind nötig, damit ein Link **direkt in der App** landet statt im Browser:
|
|
|
|
**1. Web-Adresse in der App hinterlegen** — Einstellungen → „NovaSonic Web-Adresse". Ohne sie
|
|
erscheint der Teilen-Eintrag im Kontextmenü gar nicht erst, weil der Link sonst ins Leere zeigt.
|
|
|
|
**2. Den Host beim Bauen mitgeben** und die Signatur hinterlegen:
|
|
|
|
```bash
|
|
./gradlew assembleRelease -PnovasonicHost=music.example.com
|
|
```
|
|
|
|
Dann den SHA-256 des **Release**-Signaturschlüssels ermitteln …
|
|
|
|
```bash
|
|
keytool -list -v -keystore <dein-keystore>.jks -alias <alias> | grep SHA256
|
|
```
|
|
|
|
… und in `public/.well-known/assetlinks.json` anstelle von `PLATZHALTER_RELEASE_SHA256` eintragen.
|
|
Die Datei muss unter `https://<deine-web-adresse>/.well-known/assetlinks.json` erreichbar sein —
|
|
sie liegt im `public/`-Verzeichnis und wird vom Frontend-Image mit ausgeliefert.
|
|
|
|
## APK veröffentlichen
|
|
|
|
`npm run publish-apk` gibt den Host jetzt an Gradle weiter. Dafür in `scripts/.env.release`
|
|
ergänzen (die Datei wird nie eingecheckt):
|
|
|
|
```
|
|
NOVASONIC_HOST=music.deine-domain.de
|
|
# optional während eines Domainwechsels:
|
|
# NOVASONIC_HOST2=alt.deine-domain.de
|
|
```
|
|
|
|
Fehlt der Eintrag, warnt das Skript und baut mit dem Platzhalter weiter — das APK ist dann
|
|
installierbar, aber eingehende Links öffnen im Browser statt in der App.
|
|
|
|
## Domain wechseln
|
|
|
|
**Ausgehende Links** folgen der Einstellung „NovaSonic Web-Adresse" — Adresse ändern, fertig, kein
|
|
neues APK nötig.
|
|
|
|
**Eingehende Links** stehen fest im Manifest und brauchen ein neues APK. Damit während des Umzugs
|
|
beide Adressen funktionieren, lassen sich zwei Hosts angeben:
|
|
|
|
```bash
|
|
./gradlew assembleRelease -PnovasonicHost=neu.example.com -PnovasonicHost2=alt.example.com
|
|
```
|
|
|
|
Beide müssen eine gültige `assetlinks.json` ausliefern. Das ist keine Feinheit: **auf Android 11 und
|
|
älter verifiziert das System nur, wenn ALLE angegebenen Hosts eine passende Datei liefern** — ein
|
|
toter Host blockiert also auch den funktionierenden. Sobald die alte Domain abgeschaltet wird, das
|
|
APK deshalb ohne `novasonicHost2` neu bauen.
|
|
|
|
### Ablauf eines Umzugs
|
|
|
|
1. **Neue Domain aufsetzen**, Web-App und `/.well-known/assetlinks.json` dort erreichbar machen.
|
|
Die alte Domain bleibt vorerst unverändert online.
|
|
2. **APK mit beiden Hosts bauen** (`-PnovasonicHost=neu -PnovasonicHost2=alt`) und installieren.
|
|
Ab jetzt öffnen Links beider Adressen in der App.
|
|
3. **In der App die „NovaSonic Web-Adresse" auf die neue Domain umstellen.** Neu geteilte Links
|
|
zeigen ab sofort dorthin, alte funktionieren weiter.
|
|
4. **Warten**, bis auf allen Geräten das neue APK läuft.
|
|
5. **Alte Domain abschalten** — und danach das APK ohne `novasonicHost2` neu bauen.
|
|
|
|
Schritt 5 nicht vergessen: Android verifiziert die Domains bei jeder Installation neu, und auf
|
|
Android 11 und älter genügt ein einziger nicht erreichbarer Host, damit die Verifikation komplett
|
|
fehlschlägt. Bereits verifizierte Installationen laufen zwar weiter, aber die nächste Neuinstallation
|
|
hätte gar keine funktionierenden App Links mehr.
|
|
|
|
Zwei weitere Fallen:
|
|
|
|
- **Signaturschlüssel muss derselbe bleiben.** Ein anders signiertes APK lässt sich nur nach
|
|
Deinstallation installieren — und die nimmt die Offline-Downloads mit.
|
|
- **Alte Links nach der Abschaltung** öffnen nur dann noch etwas, wenn die alte Domain auf die neue
|
|
weiterleitet. Dann landen sie allerdings im Browser statt in der App, weil Android eine
|
|
Weiterleitung nicht erneut an die App übergibt.
|
|
|
|
Wildcards (`*.example.com`) sind für App Links nicht dokumentiert und werden hier bewusst nicht
|
|
verwendet — die Verifikation läuft pro Host.
|
|
|
|
Bereits verschickte Links auf die alte Domain öffnen nach deren Abschaltung gar nichts mehr; das
|
|
lässt sich nur mit einer Weiterleitung von alt nach neu abfangen.
|
|
|
|
Prüfen lässt sich das Ergebnis mit:
|
|
|
|
```bash
|
|
adb shell pm get-app-links com.novasonic.app
|
|
```
|
|
|
|
Steht dort `verified`, öffnet Android die Links ohne Nachfrage.
|
|
|
|
**Ohne diesen Schritt** ist der Link trotzdem nicht verloren: er öffnet im Browser die Web-App.
|
|
Wer die App bevorzugt, kann sie in den Systemeinstellungen unter *Standardmäßig öffnen* → *Links*
|
|
manuell für die Domain zulassen.
|