Как настроить переходы из браузера в Android‑приложение (Deep Links и App Links)

Короткий ответ: добавьте в activity intent‑фильтр с https‑хостом и android:autoVerify="true", разместите файл assetlinks.json на сайте в /.well-known/, обработайте intent в коде и протестируйте через adb и браузер.

Шаги настройки (быстро)

  1. В AndroidManifest.xml у activity добавьте intent‑фильтр с https‑data и android:autoVerify="true".
  2. На сайте разместите файл /.well-known/assetlinks.json с указанием packageName и SHA256‑сертификата.
  3. Обработайте intent.getData() в Activity и извлеките параметры (id, path и т.д.).
  4. Соберите и загрузите APK/AAB — проверка autoVerify выполняется при установке (и в Play Store).
  5. Тестируйте на реальных устройствах и в эмуляторе; используйте adb для воспроизведения.

Пример intent‑фильтра в манифесте

<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" />
    <!-- HTTPS-app link: точный путь лучше через pathPrefix -->
    <data android:scheme="https" android:host="example.com" android:pathPrefix="/product" />
  </intent-filter>
</activity>

Используйте https вместо custom схем, чтобы переходы работали из Chrome и других браузеров — custom‑схемы всё чаще блокируются.

Обработка ссылки в коде (Kotlin)

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  val data: Uri? = intent?.data
  data?.let {
    if (it.path?.startsWith("/product") == true) {
      val productId = it.lastPathSegment
      openProduct(productId)
    }
  }
}

Создайте JSON и разместите по адресу: https://example.com/.well-known/assetlinks.json

Пример:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.yourpackage",
    "sha256_cert_fingerprints": [
      "14:6D:E9:..."
    ]
  }
}]

SHA256‑отпечаток получите командой:

keytool -list -v -keystore your-keystore.jks | grep SHA256

Тестирование

  • adb (эмулятор/устройство):
    adb shell am start -W -a android.intent.action.VIEW -d "https://example.com/product/123" com.yourpackage
  • В браузере: разместите ссылку Открыть в приложении и откройте её на устройстве.
  • Очистите кеш браузера при отладке: adb shell pm clear com.android.chrome

Сравнение подходов

ПараметрCustom URI (myapp://)Android App Links (https)
Работает из ChromeЧасто блокируетсяДа (через autoVerify и assetlinks.json)
Удобство установкиПросто для devТребует assetlinks и сертификата
Поведение при отсутствии приложенияПоказывает ошибку/ничегоОткроется веб‑страница

40% проблем с deep linking — из‑за опечаток в схемах или конфликтов intent‑фильтров. Указывайте точные pathPrefix/pathPattern и проверяйте совпадение с assetlinks.json.

Частые ошибки

  • Неправильный путь в intent‑фильтре (используйте pathPrefix="/product").
  • Несовпадение packageName или SHA256 в assetlinks.json.
  • Отсутствие android:autoVerify или забытый .well-known путь на сервере.
  • Конфликт нескольких intent‑фильтров: уточните pathPattern или добавьте priority.

FAQ

  • Нужно ли всегда использовать autoVerify?
    Рекомендуется: autoVerify повышает вероятность, что ссылки будут открываться в приложении без спроса.
  • Можно ли оставить только custom‑схему (myapp://)?
    Можно для внутренних тестов, но в продакшене используйте https для совместимости с браузерами.
  • Как проверить, что assetlinks.json видим для Google?
    Доступность проверьте по URL и убедитесь, что JSON корректен; при установке с Play Store система проверит соответствие.

Следуя этим шагам, вы получите надёжные переходы из браузера в приложение и уменьшите отказы при переходе на целевой контент.