Přeskočit na hlavní obsah

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ů:

TypPrefixPoužití
Custom schemecolosseum://Interní navigace, push notifikace payload
Universal Links (iOS) / App Links (Android)https://app.colosseum.cz/Sdílení, social media, email kampaně, web-to-app
Preferujte Universal/App Links

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:

RoutePatternScreenAuthFáze
Event detailevent/{id}P3 (Detail akce)NeMVP
Event termínevent/{id}/date/{dateId}P3P4/S1NeMVP
Vstupenkaticket/{id}S8 (Detail vstupenky)AnoMVP
Sdílená vstupenkashare/{token}S8 (Detail vstupenky)Ne (token-based)MVP
Vyhledávánísearch?q={query}P8 (Vyhledávání)NeMVP
Pořadatelorganizer/{id}S13 (Profil pořadatele)NeMVP
Místo konánívenue/{id}S12 (Detail místa)NeMVP
Věrnostní hubloyaltyP10 (Věrnostní hub)AnoF1
Blog článekblog/{slug}S21 (Detail článku)NeF2+
Objednávkaorder/{id}S7 (Historie objednávek)AnoMVP
WalletwalletP7 (Wallet)AnoMVP

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

  1. Odkaz otevře aplikaci přímo na cílovém screenu
  2. Back navigation vrací na předchozí screen v aktuálním tabu (ne na external zdroj)
  3. Pokud je deep link v rámci tabu, nastaví se jako stack v příslušném tabu

Uživatel nemá nainstalovanou aplikaci

Typ odkazuChová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:

  1. Zobrazí se S4 (přihlášení) jako fullscreen modal
  2. Po úspěšném přihlášení → automatická navigace na cílový screen
  3. 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)

Prerekvizity

  1. Apple App Site Association soubor na serveru
  2. Associated Domains capability v Xcode
  3. Doména app.colosseum.cz musí 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)
}

Prerekvizity

  1. Digital Asset Links soubor na serveru
  2. Intent filter s autoVerify="true" v AndroidManifest.xml
  3. Doména app.colosseum.cz musí 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 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

TypDeep linkPopisFáze
event_remindercolosseum://ticket/{id}Připomínka blížící se akce (24h, 2h)MVP
purchase_confirmationcolosseum://ticket/{id}Potvrzení nákupuMVP
watchdog_alertcolosseum://event/{id}/date/{dateId}Uvolnění míst na hlídané akciF1
new_eventcolosseum://event/{id}Nová akce v oblíbeném žánruF1
loyalty_expirycolosseum://loyaltyBlížící se expirace bodůF1
price_dropcolosseum://event/{id}Snížení ceny sledované akceF1
reengagementcolosseum:// (home)Re-engagement po 30 dnech neaktivityF1
blog_articlecolosseum://blog/{slug}Nový článekF2+
geofencecolosseum://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