Реалізація Custom URL Scheme для мобільного додатка
Deep link не відкривається — користувач бачить пустий браузер замість потрібного екрану додатка. Або відкривається, але передає параметри в кодуванні, яке додаток не парсить. Це класика при першій реалізації URL scheme.
Два підходи та коли який вибирати
Custom URL Scheme (myapp://product/123) — простий у реалізації, але небезпечний: будь-який додаток може зареєструвати той же scheme та перехопити deeplink. Підходить для внутрішньої навігації між власними додатками або для dev-інструментів.
Universal Links (iOS) / App Links (Android) — працюють через HTTPS-домен з верифікаційним файлом (apple-app-site-association / assetlinks.json). Безпечні, падають на браузер, якщо додаток не встановлений. Це правильний шлях для продакшену.
На практиці реалізуємо обидва: Universal Links як основний механізм, Custom URL Scheme як fallback для випадків, коли верифікація домену неможлива.
Деталі реалізації
iOS (Swift/SwiftUI): реєструємо scheme в Info.plist в CFBundleURLTypes, обробляємо в application(_:open:options:) для UIKit або через .onOpenURL в SwiftUI. Для Universal Links — application(_:continue:restorationHandler:). Парсинг URL робимо через URLComponents, не через ручний split рядка.
Android (Kotlin): у AndroidManifest.xml додаємо <intent-filter> з <data android:scheme="myapp"/>, обробляємо intent.data в Activity. Для App Links додаємо android:autoVerify="true" та завантажуємо assetlinks.json на https://domain.com/.well-known/.
React Native: використовуємо Linking API з react-native core, для навігації — @react-navigation/native з linking конфігом. Головна помилка — забути обробити кейс, коли додаток був закритий (cold start) vs уже запущений (foreground). Це різні подіï.
Flutter: пакет go_router підтримує deep links нативно, потрібно тільки налаштувати routerConfig з GoRouter та додати конфігурацію в нативні модулі через flutter_deeplinking_enabled в Info.plist/manifest.
Типова помилка при тестуванні
Диплінк тестують тільки через Safari/Chrome, але забувають перевірити випадок "додаток встановлений, але закритий". На iOS з Universal Links буває затримка верифікації AASA-файлу при першому запуску — додаток відкривається через браузер замість диплінка, та команда думає, що щось сломано. Це нормальна поведінка, кеш оновлюється протягом доби.
Терміни реалізації: 1-3 дні для базового Custom URL Scheme, до 5 днів якщо потрібні Universal Links з настройкою домену та навігацією до конкретних екранів.







