Deep Linking
Deep linking umožňuje otevřít konkrétní obsah aplikace přímo z externího zdroje — push notifikace, sdílený link, QR kód, social media nebo email.
URL schémata
Colosseum MA podporuje dva typy deep linků:
| Typ | Prefix | Použití |
|---|---|---|
| Custom scheme | colosseum:// | Interní navigace, push notifikace payload |
| Universal Links (iOS) / App Links (Android) | https://app.colosseum.cz/ | Sdílení, social media, email kampaně, web-to-app |
Pro veřejně sdílené odkazy vždy používejte https://app.colosseum.cz/ — fungují i bez nainstalované aplikace (fallback na web).
Route tabulka
Kompletní přehled všech deep link patterns:
| Route | Pattern | Screen | Auth | Fáze |
|---|---|---|---|---|
| Event detail | event/{id} | P3 (Detail akce) | Ne | MVP |
| Event termín | event/{id}/date/{dateId} | P3 → P4/S1 | Ne | MVP |
| Vstupenka | ticket/{id} | S8 (Detail vstupenky) | Ano | MVP |
| Sdílená vstupenka | share/{token} | S8 (Detail vstupenky) | Ne (token-based) | MVP |
| Vyhledávání | search?q={query} | P8 (Vyhledávání) | Ne | MVP |
| Pořadatel | organizer/{id} | S13 (Profil pořadatele) | Ne | MVP |
| Místo konání | venue/{id} | S12 (Detail místa) | Ne | MVP |
| Věrnostní hub | loyalty | P10 (Věrnostní hub) | Ano | F1 |
| Blog článek | blog/{slug} | S21 (Detail článku) | Ne | F2+ |
| Objednávka | order/{id} | S7 (Historie objednávek) | Ano | MVP |
| Wallet | wallet | P7 (Wallet) | Ano | MVP |
Příklady kompletních URL
# Custom scheme
colosseum://event/evt_abc123
colosseum://ticket/tkt_001
colosseum://search?q=opera
colosseum://share/shr_token_xyz
colosseum://loyalty
# Universal / App Links
https://app.colosseum.cz/event/evt_abc123
https://app.colosseum.cz/event/evt_abc123/date/date_001
https://app.colosseum.cz/share/shr_token_xyz
https://app.colosseum.cz/search?q=la+traviata
https://app.colosseum.cz/venue/ven_nd
Chování deep linků
Uživatel má nainstalovanou aplikaci
- Odkaz otevře aplikaci přímo na cílovém screenu
- Back navigation vrací na předchozí screen v aktuálním tabu (ne na external zdroj)
- Pokud je deep link v rámci tabu, nastaví se jako stack v příslušném tabu
Uživatel nemá nainstalovanou aplikaci
| Typ odkazu | Chování |
|---|---|
colosseum:// | Nic se nestane (custom scheme nefunguje bez app) |
https://app.colosseum.cz/ | Fallback na webovou stránku s app store bannerem + zobrazení obsahu na webu |
Auth-required routes
Pokud nepřihlášený uživatel otevře deep link vyžadující auth:
- Zobrazí se S4 (přihlášení) jako fullscreen modal
- Po úspěšném přihlášení → automatická navigace na cílový screen
- Při zavření login modalu → navigace na home (P1)
Nevalidní deep linky
- Nevalidní
{id}nebo{token}→ error state s CTA „Zpět na hlavní stránku" - Expired share token → informace o expiraci s CTA na event detail (pokud existuje)
Implementace — iOS (Universal Links)
Prerekvizity
- Apple App Site Association soubor na serveru
- Associated Domains capability v Xcode
- Doména
app.colosseum.czmusí mít platný HTTPS certifikát
apple-app-site-association
Soubor musí být dostupný na https://app.colosseum.cz/.well-known/apple-app-site-association (bez přesměrování, bez Content-Type jiný než application/json).
{
"applinks": {
"details": [
{
"appIDs": [
"TEAM_ID.cz.colosseum.ma"
],
"components": [
{ "/": "/event/*", "comment": "Event detail" },
{ "/": "/event/*/date/*", "comment": "Event termín" },
{ "/": "/ticket/*", "comment": "Detail vstupenky" },
{ "/": "/share/*", "comment": "Sdílená vstupenka" },
{ "/": "/search", "comment": "Vyhledávání" },
{ "/": "/organizer/*", "comment": "Profil pořadatele" },
{ "/": "/venue/*", "comment": "Detail místa" },
{ "/": "/loyalty", "comment": "Věrnostní hub" },
{ "/": "/blog/*", "comment": "Blog článek" },
{ "/": "/order/*", "comment": "Detail objednávky" },
{ "/": "/wallet", "comment": "Wallet" }
]
}
]
}
}
Xcode konfigurace
V Signing & Capabilities → Associated Domains přidat:
applinks:app.colosseum.cz
Zpracování v kódu (Swift)
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else { return false }
return DeepLinkRouter.handle(url: url)
}
Implementace — Android (App Links)
Prerekvizity
- Digital Asset Links soubor na serveru
- Intent filter s
autoVerify="true"vAndroidManifest.xml - Doména
app.colosseum.czmusí mít platný HTTPS certifikát
assetlinks.json
Soubor musí být dostupný na https://app.colosseum.cz/.well-known/assetlinks.json.
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "cz.colosseum.ma",
"sha256_cert_fingerprints": [
"AA:BB:CC:DD:EE:FF:..."
]
}
}
]
AndroidManifest.xml
<activity android:name=".MainActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https"
android:host="app.colosseum.cz" />
</intent-filter>
<!-- Custom scheme -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="colosseum" />
</intent-filter>
</activity>
Push notifikace — deep link payload
Push notifikace obsahují deep link v payload pro navigaci po kliknutí.
iOS (APNs)
{
"aps": {
"alert": {
"title": "La Traviata — zítra v 19:00",
"body": "Nezapomeňte na zítřejší představení v Národním divadle.",
"subtitle": "Národní divadlo"
},
"sound": "default",
"badge": 1,
"category": "EVENT_REMINDER"
},
"deeplink": "colosseum://ticket/tkt_001",
"imageUrl": "https://cdn.colosseum.cz/events/abc123/push-thumb.jpg"
}
Android (FCM)
{
"message": {
"token": "device_fcm_token",
"notification": {
"title": "La Traviata — zítra v 19:00",
"body": "Nezapomeňte na zítřejší představení v Národním divadle.",
"image": "https://cdn.colosseum.cz/events/abc123/push-thumb.jpg"
},
"data": {
"deeplink": "colosseum://ticket/tkt_001",
"type": "event_reminder",
"eventId": "evt_abc123"
},
"android": {
"notification": {
"channel_id": "events",
"click_action": "OPEN_DEEPLINK"
}
}
}
}
Typy push notifikací s deep linky
| Typ | Deep link | Popis | Fáze |
|---|---|---|---|
event_reminder | colosseum://ticket/{id} | Připomínka blížící se akce (24h, 2h) | MVP |
purchase_confirmation | colosseum://ticket/{id} | Potvrzení nákupu | MVP |
watchdog_alert | colosseum://event/{id}/date/{dateId} | Uvolnění míst na hlídané akci | F1 |
new_event | colosseum://event/{id} | Nová akce v oblíbeném žánru | F1 |
loyalty_expiry | colosseum://loyalty | Blížící se expirace bodů | F1 |
price_drop | colosseum://event/{id} | Snížení ceny sledované akce | F1 |
reengagement | colosseum:// (home) | Re-engagement po 30 dnech neaktivity | F1 |
blog_article | colosseum://blog/{slug} | Nový článek | F2+ |
geofence | colosseum://venue/{id} | Blízko místa konání s akcí | F2+ |
Social sharing URL format
Při sdílení obsahu z aplikace se generuje Universal Link s OG (Open Graph) metadata pro social media preview.
Formát sdíleného URL
https://app.colosseum.cz/event/evt_abc123
Požadované OG metadata na serveru
<meta property="og:title" content="La Traviata — Národní divadlo" />
<meta property="og:description" content="Verdiovská opera v nové inscenaci. 15. 4. 2026 od 19:00." />
<meta property="og:image" content="https://cdn.colosseum.cz/events/abc123/og-share.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://app.colosseum.cz/event/evt_abc123" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Colosseum" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="La Traviata — Národní divadlo" />
<meta name="twitter:description" content="Verdiovská opera v nové inscenaci. 15. 4. 2026 od 19:00." />
<meta name="twitter:image" content="https://cdn.colosseum.cz/events/abc123/og-share.jpg" />
<!-- App banner (iOS) -->
<meta name="apple-itunes-app" content="app-id=APP_STORE_ID, app-argument=https://app.colosseum.cz/event/evt_abc123" />
Sdílení vstupenky
Sdílení vstupenky generuje speciální share token (ne ticket ID) pro bezpečnost:
https://app.colosseum.cz/share/shr_token_xyz
Share token:
- Jednorázový nebo s omezeným počtem použití
- Expiruje po 72 hodinách (konfigurovatelné)
- Neobsahuje citlivá data (seat info se načte až po otevření)
- Funguje bez přihlášení (token-based auth)
Testování deep linků
iOS Simulator
xcrun simctl openurl booted "https://app.colosseum.cz/event/evt_abc123"
xcrun simctl openurl booted "colosseum://ticket/tkt_001"
Android Emulator
adb shell am start -a android.intent.action.VIEW \
-d "https://app.colosseum.cz/event/evt_abc123" \
cz.colosseum.ma
adb shell am start -a android.intent.action.VIEW \
-d "colosseum://search?q=opera"
Kontrolní checklist
- Všechny routes z tabulky fungují s custom scheme
- Všechny routes fungují jako Universal / App Links
- Auth-required routes redirectují na login
- Nevalidní ID zobrazí error state
- Expired share token zobrazí informativní zprávu
- Fallback web stránka funguje bez nainstalované app
- OG metadata se správně zobrazují na Facebook, Twitter, iMessage
- Push notifikace deep linky fungují z background i killed state