> Где происходит настройка диплинков в Android и iOS? (iOS, Swift, Android)
Уровень: senior · Роль: qa · Категория: Технические вопросы
Компании: Ozon
Стек: iOS, Swift, Android
> Пример ответа
Короткий ответ
Настройка диплинков в Android происходит в AndroidManifest.xml через intent-filter с action VIEW и категориями DEFAULT и BROWSABLE, плюс в build.gradle для App Links. В iOS - в Info.plist через CFBundleURLTypes для custom scheme, а для Universal Links - в Associated Domains (entitlements) и на сервере в apple-app-site-association. Для QA важно проверять оба уровня: декларацию в манифесте/plist и фактическую обработку в коде.
Подробное объяснение
Диплинки (deep links) - это URL, которые открывают конкретный экран в приложении. Настройка разделяется на два уровня: декларация (как система узнает, что приложение может обработать ссылку) и обработка (что происходит после открытия).
Android:
- Основной механизм - intent-filter в
AndroidManifest.xml. Для каждого activity, который должен принимать диплинки, добавляется фильтр с<data android:scheme="..." android:host="...">. - Для App Links (Android 6+) дополнительно требуется проверка домена через Digital Asset Links (
assetlinks.jsonна сервере) и настройкаandroid:autoVerify="true". - В
build.gradleможно указатьmanifestPlaceholdersдля динамической генерации схем или хостов.
iOS:
- Custom URL scheme - настройка в
Info.plistв ключеCFBundleURLTypes. Схема видаmyapp://регистрируется системой. - Universal Links (iOS 9+) - требуют включения capability
Associated Domainsв проекте (генерирует entitlements файл) и размещения файлаapple-app-site-associationна домене с корректнымappIDиpaths. - Обработка происходит в
AppDelegate(методыapplication(_:open:options:)для scheme иcontinue userActivityдля Universal Links) или через scene-based lifecycle.
Ключевое различие: custom scheme работает всегда, но не защищена от конфликтов; Universal Links/App Links - безопаснее, но требуют HTTPS и серверной настройки.
На практике
Для QA-инженера настройка диплинков важна при тестировании:
- Проверка, что диплинк открывает правильный экран при холодном и теплом старте.
- Тестирование сценариев, когда приложение не установлено (fallback на App Store / Play Market).
- Проверка обработки параметров в URL (query, path).
- Для Android - тестирование на разных версиях: до 6.0 (intent-filter), 6+ (App Links), 12+ (deep links в настройках).
- Для iOS - проверка Universal Links на симуляторе и реальном устройстве, так как симулятор не всегда корректно обрабатывает
apple-app-site-association.
Инструменты: adb shell am start -W -a android.intent.action.VIEW -d "scheme://host/path" для Android, xcrun simctl openurl booted "scheme://" для iOS.
Пример кода
Android (AndroidManifest.xml):
<activity android:name=".DeepLinkActivity"> <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="example.com" android:pathPrefix="/product" /> </intent-filter> </activity>
iOS (AppDelegate):
SWIFTfunc application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {// обработка custom schemereturn handleDeepLink(url)}func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {// обработка Universal Linksguard userActivity.activityType == NSUserActivityTypeBrowsingWeb,let url = userActivity.webpageURL else { return false }return handleDeepLink(url)}
Как отвечать на собеседовании
Начните с разделения платформ, затем упомяните два уровня: декларация и обработка. Для Android - intent-filter, для iOS - plist и Associated Domains. Подчеркните разницу между custom scheme и App Links/Universal Links, особенно в контексте безопасности и fallback-сценариев. Если спросят про QA - добавьте, что проверяете не только открытие, но и корректность передачи параметров, поведение при отсутствии приложения и версионные особенности.
Что проверяет интервьюер
- Понимание разницы между декларацией в манифесте/plist и фактической обработкой в коде.
- Знание механизмов App Links и Universal Links, включая серверную часть (
assetlinks.json,apple-app-site-association). - Осведомленность о версионных отличиях (Android 6+, iOS 9+).
- Умение объяснить, как тестировать диплинки и какие edge case бывают.
Типичные ошибки
- Путаница между custom scheme и Universal Links - это разные механизмы с разной настройкой.
- Утверждение, что достаточно прописать intent-filter, - для App Links нужен еще и серверный файл.
- Забывают про обработку в коде: декларация без реализации метода
onNewIntent(Android) илиcontinue userActivity(iOS) не даст результата. - Не учитывают, что для iOS 13+ scene-based lifecycle меняет точку входа для обработки ссылок.
- Для QA: проверка только одного сценария (например, только холодный старт) без покрытия остальных.
> Похожие задачи по qa
Почему iOS более закрытая система, а Android более открытая по доступности приложений
В чем разница универсальных и обычных диплинков и почему универсальные работают на iOS и Android
Как оценить время тестирования приложения на Android и iOS по описанным кейсам?
Какие способы запуска приложения на iOS существуют кроме иконки и поиска, например через панель уведомлений или диплинки?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью