Как настроить URL‑схемы и deep links в Android Manifest быстро

В двух словах: custom‑scheme (например myapp://) обрабатывается приложением через intent‑filter с android:scheme, а безопасные App Links используют http/https + android:autoVerify и проверку домена (Digital Asset Links). Ниже — краткие примеры и проверки, которые можно применить сразу.

  • Custom‑scheme (myapp://): просто и быстро. Приложение перехватывает URI по intent‑filter. Недостаток — схемы не верифицируются, другие приложения могут использовать ту же схему.
  • HTTP/HTTPS (App Links): работает как обычная ссылка в браузере, но если домен верифицирован с приложением, система открывает приложение без выбора пользователя. Безопаснее, рекомендуется для публичных ссылок.

Ключевые поля intent‑filter:

  • action: android.intent.action.VIEW
  • categories: android.intent.category.DEFAULT, android.intent.category.BROWSABLE
  • data: android:scheme, android:host, android:pathPrefix / android:pathPattern, android:port

Как прописать в AndroidManifest.xml (примеры)

Не забудьте xmlns в корневом теге Manifest: xmlns:android="http://schemas.android.com/apk/res/android"

Пример для custom scheme:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <application ...>
        <activity android:name=".MainActivity">
            <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="open" android:pathPrefix="/item" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Этот фильтр поймает myapp://open/item/123

Пример для App Links (https + авто‑верификация):

<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" />
        <data android:scheme="https" android:host="example.com" android:pathPrefix="/articles/" />
    </intent-filter>
</activity>

Для авто‑верификации нужен файл assetlinks.json на вашем домене (Digital Asset Links) с совпадающими ключами приложений.

Всегда указывайте и BROWSABLE, и DEFAULT — без BROWSABLE ссылки из браузера не будут открывать приложение.

Тестирование и лучшие практики

  • Проверка через adb:
    • Custom scheme: adb shell am start -a android.intent.action.VIEW -d "myapp://open/item/123"
    • HTTPS: adb shell am start -a android.intent.action.VIEW -d "https://example.com/articles/42"
  • Логи: смотрите logcat по тегу ActivityManager/ActivityTaskManager, чтобы понять, какой компонент запустился.
  • Обработка входных данных: проверяйте URI в onCreate/onNewIntent и безопасно парсите параметры — не доверяйте произвольным ссылкам.
  • Fallback: если ссылка не перехвачена, ей откроется браузер; для лучшего UX добавьте универсальный веб‑контент того же URL.
  • Версионирование: autoVerify поддерживается с API 23+. На старых версиях ссылка откроется через chooser.

Custom‑schemes небезопасны для чувствительных операций (авторизация, платежи) — злоумышленник может регистрировать ту же схему. Для критичных задач используйте App Links + проверку на сервере.

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

  • Пропущен xmlns:android в корне Manifest — все атрибуты с префиксом android не распознаются.
  • Нет BROWSABLE категории — ссылка из браузера не откроет приложение.
  • Неправильно указан pathPrefix/pathPattern — фильтр не сработает для похожих путей.
  • Ожидают App Link без размещения assetlinks.json на домене — android:autoVerify не пройдет.
  • Не обрабатывают onNewIntent при singleTask/singleTop — данные URI могут потеряться при повторном запуске Activity.

FAQ

  • Нужно ли использовать и custom scheme, и https?
    • Можно поддержать оба: custom scheme для внутренних deep link-ов и https для внешних (и для безопасной верификации).
  • Где размещать assetlinks.json?
    • В корне: https://<ваш-домен>/.well-known/assetlinks.json (файл должен содержать JSON с цифровой подписью приложения).
  • Что делать если авто‑верификация не проходит?
    • Проверьте SHA256 ключа и packageName в assetlinks.json и убедитесь, что домен доступен по HTTPS без редиректов на уровне .well-known.

Пробуйте примеры выше: внесите intent‑filter в манифест, соберите приложение и запустите adb‑команды — это самый быстрый путь убедиться, что deep link работает.