Deep Link (głęboki link) to URL, który kieruje użytkownika do konkretnego ekranu lub treści w aplikacji mobilnej, z pominięciem ekranu głównego. W przeciwieństwie do zwykłego linku do strony internetowej, deep link aktywuje aplikację i natychmiast otwiera docelową treść. Według Android Developers, prawidłowo skonfigurowane deep linki zwiększają konwersję do docelowej akcji o 30–50% dzięki zmniejszeniu liczby kroków do treści.
Najważniejsze
Deep Link (głęboki link) to URI, który po kliknięciu otwiera nie stronę internetową, a konkretny ekran w aplikacji mobilnej. Technologia rozwiązuje fundamentalny problem platform mobilnych: przeglądarka nie może bezpośrednio otworzyć ekranu aplikacji, a deep link tworzy pomost między webem a kodem natywnym. Bez deep link użytkownik zawsze trafia na ekran główny i musi ręcznie nawigować do żądanej treści.
Architektura deep link składa się z dwóch części: schemat (scheme) określa, która aplikacja ma obsłużyć link, a ścieżka (path) wskazuje konkretny zasób w aplikacji — produkt, artykuł, profil użytkownika lub sekcję ustawień. Parametry zapytania (?source=push&campaign=summer) przekazują dodatkowy kontekst do analityki, personalizacji i atrybucji kampanii.
Ważne jest rozróżnienie deep link od regular link. Zwykły link (https://example.com/product/42) otwiera się w przeglądarce i prowadzi do wersji webowej strony. Deep link (myapp://product/42) przy zainstalowanej aplikacji otwiera właśnie natywny ekran z tą samą treścią, a jeśli aplikacja jest nieobecna — wyświetla błąd. Właśnie do rozwiązania problemu bezproblemowego fallback zostały stworzone Universal Link (iOS) i App Link (Android).
Różne zadania wymagają różnych typów deep link. Niektóre linki działają tylko z zainstalowaną aplikacją, inne potrafią czekać na instalację, jeszcze inne przekazują kontekst analityczny. Wybór typu zależy od scenariusza użycia: kampania reklamowa, powiadomienie push, udostępnianie treści lub mailing.
Standard Deep Link — podstawowy typ, który aktywuje się tylko jeśli aplikacja jest już zainstalowana na urządzeniu. Użytkownik klika link myapp://product/42, system znajduje zarejestrowany schemat i otwiera aplikację na odpowiednim ekranie. Jeśli aplikacja nie jest zainstalowana — przeglądarka wyświetla błąd „Strona nie znaleziona” lub po prostu nic nie robi. Ten typ nadaje się do wewnętrznej nawigacji w już zainstalowanej aplikacji.
Konfiguracja standardowego deep link jest prosta: wystarczy zarejestrować URI-schema w manifeście (Android) lub Info.plist (iOS). Nie wymaga walidacji serwerowej ani certyfikatów SSL. Ale właśnie z powodu braku fallback ten typ jest uważany za przestarzały dla kampanii marketingowych — utrata ruchu od użytkowników bez aplikacji sięga do 60%.
Deferred Deep Link rozwiązuje główny problem zwykłych deep link: działa nawet jeśli aplikacja nie jest zainstalowana. Użytkownik klika link → widzi stronę (landing lub App Store/Google Play) → instaluje aplikację → przy pierwszym uruchomieniu aplikacja otrzymuje kontekst oryginalnego linku i otwiera żądany ekran. Technologia wymaga SDK pośrednika (AppsFlyer, Branch, Adjust), który przechowuje kontekst na serwerze do momentu pierwszego uruchomienia.
Branch — jedna z najpopularniejszych platform do deferred deep link. Oferuje jednolity link działający na wszystkich platformach: określa system operacyjny użytkownika, przekierowuje do sklepu z aplikacjami, a po instalacji przekazuje kontekst (kod promocyjny, identyfikator produktu, źródło kampanii). Według danych Branch (2024), deferred deep link zwiększają konwersję kampanii reklamowych o 40–70%.
Contextual Deep Link — to zwykły lub deferred deep link uzupełniony o parametry kontekstu: źródło ruchu (source), kampania (campaign), kod promocyjny, referrer, identyfikator partnera. Parametry są przekazywane w URL i przetwarzane przez aplikację do personalizacji: pokazanie bonusu powitalnego, otwarcie produktu z rabatem, zapisanie analityki instalacji.
Znaczniki UTM (utm_source, utm_medium, utm_campaign) — standardowy sposób przekazywania kontekstu. W mobile kontekstowe deep link są krytyczne dla atrybucji: bez nich właściciel aplikacji nie wie, który kanał przyprowadził użytkownika — ruch organiczny, reklama Facebook, mailing czy kod QR. Jakościowa atrybucja wymaga integracji z MMP (Mobile Measurement Partner).
| Typ Deep Link | Wymaga instalacji | Obsługuje oczekiwanie na instalację | Kontekst |
|---|---|---|---|
| Standard | Tak | Nie | Tylko w URL |
| Deferred | Nie | Tak | Przechowywanie serwerowe |
| Contextual | Dowolny | Dowolny | UTM + parametry |
iOS obsługuje deep link poprzez dwa mechanizmy: stary Custom URL Scheme i nowoczesny Universal Link (iOS 9+). Custom URL Scheme działa na zasadzie rejestracji własnego schematu w Info.plist. Aplikacja rejestruje myapp://, a iOS po kliknięciu takiego linku otwiera aplikację. Problem: jeśli schemat nie jest zarejestrowany przez żadną aplikację, przeglądarka wyświetla błąd.
Obsługa deep link na iOS odbywa się poprzez metodę AppDelegate application(_:open:options:) lub SceneDelegate scene(_:openURLContexts:). Deweloper wyodrębnia URL, parsuje ścieżkę i parametry, a następnie nawiguje do odpowiedniego ekranu. W przypadku SwiftUI obsługa jest realizowana przez OpenURLAction lub onChange(of: openURL). Ważne jest poprawne obsłużenie stanu: aplikacja może być nieuruchomiona, zminimalizowana lub aktywna.
Security na iOS jest surowe: Custom URL Scheme może przechwycić dowolna aplikacja rejestrująca ten sam schemat. To potencjalna podatność (URL Scheme hijacking). Dlatego Apple zaleca Universal Link jako bezpieczniejszą alternatywę: tylko potwierdzony właściciel domeny może powiązać linki z aplikacją. Więcej o Universal Link — w artykule Universal Link.
Android implementuje deep link poprzez Intent Filter w AndroidManifest.xml. Aplikacja definiuje Activity, która obsługuje określony schemat (myapp://) lub konkretne hosty i ścieżki. Gdy użytkownik klika deep link, Android szuka Activity z pasującym Intent Filter i otwiera je. Jeśli pasujących Activity jest kilka — system pokazuje dialog wyboru aplikacji.
// AndroidManifest.xml — Intent Filter dla Deep Link
<activity
android:name=".ui.ProductActivity"
android:exported="true">
<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="myapp"
android:host="product"
android:pathPrefix="/" />
</intent-filter>
</activity>
Obsługa deep link w Android odbywa się w metodzie Activity.onCreate() lub onNewIntent(). Deweloper otrzymuje Intent, wyodrębnia URI i wywołuje nawigację. Dla Jetpack Navigation komponent Navigation Deep Link pozwala deklaratywnie opisać deep link w grafie nawigacji. Android App Link (Android 6.0+) — ewolucja deep link z weryfikacją przez Digital Asset Links, eliminująca dialog wyboru aplikacji.
Ważne jest uwzględnienie zmian Android 12+: od API 31 system wymaga jawnego ustawienia exported=true dla Activity obsługujących deep link i sprawdza poprawność Intent Filter. Google Play Store weryfikuje App Link przy publikacji. Bez weryfikacji Google może odrzucić aktualizację, jeśli deep link prowadzą do nieistniejących stron witryny.
Konfiguracja deep link obejmuje kilka etapów wspólnych dla obu platform. Pierwszy krok — określenie schematu i struktury URL. Zaleca się używanie schematu https (zamiast własnego) dla zgodności z Universal Link i App Link. Struktura URL powinna odzwierciedlać strukturę witryny: /product/42, /profile/john, /settings/notifications. Upraszcza to utrzymanie i indeksację treści przez wyszukiwarki.
Drugi etap — obsługa deep link w kodzie aplikacji. Dla Androida zaleca się Jetpack Navigation z deklaratywnymi deep link w nav_graph. Dla iOS — SwiftUI NavigationStack z obsługą OpenURLAction. Ważne jest obsłużenie trzech stanów aplikacji: cold start (aplikacja nieuruchomiona), warm start (zminimalizowana) i active (na ekranie). Każdy stan wymaga innej logiki nawigacji.
Testowanie deep link — osobne zadanie. Android Studio oferuje narzędzie App Links Assistant do sprawdzania Intent Filter. Na iOS testowanie odbywa się przez Xcode z przekazaniem URL przez argumenty schematu uruchomienia. Zaleca się skonfigurowanie CI: automatyczne przejście przez deep link i sprawdzenie, czy otworzył się oczekiwany ekran. Dla deferred deep link testowanie obejmuje pełny cykl „instalacja → pierwsze uruchomienie → kontekst”. Bez testowania deep link często psują się przy aktualizacji nawigacji w aplikacji.
Często zadawane pytania
Zwykły link (https://site.com/page) otwiera się w przeglądarce. Deep link (myapp://page lub https://site.com/page z weryfikacją) otwiera ekran w aplikacji mobilnej. Deep link może również przekazywać kontekst: kod promocyjny, źródło ruchu, identyfikator referała.
URI-schemat — to prefiks URL określający, która aplikacja ma obsłużyć link (np. myapp://, vk://, tg://). System używa schematu do routingu: znajduje aplikację, która zarejestrowała ten schemat, i przekazuje jej URL do obsługi.
Użytkownik klika link → serwis (Branch, AppsFlyer) zapamiętuje kontekst → przekierowuje do App Store/Google Play → po instalacji i pierwszym uruchomieniu SDK przekazuje zapisany kontekst aplikacji → aplikacja otwiera żądany ekran, tak jakby użytkownik już miał aplikację.
Zwykły deep link — nie. Deferred deep link — tak, dzięki stronie pośredniej, która przekierowuje do sklepu z aplikacjami i przechowuje kontekst. Universal Link i App Link otwierają witrynę jako fallback, jeśli aplikacja nie jest zainstalowana.
Na Android użyj adb: adb shell am start -W -a android.intent.action.VIEW -d “myapp://product/42”. Na iOS — xcrun simctl openurl booted “myapp://product/42”. Dla obu platform dostępne są konsole testowe Firebase Dynamic Links i Branch.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również