> Где происходит настройка диплинков в 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):

SWIFT
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
// обработка custom scheme
return handleDeepLink(url)
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// обработка Universal Links
guard 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: проверка только одного сценария (например, только холодный старт) без покрытия остальных.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью