Как настроить URL‑схемы и deep links в Android Manifest быстро
В двух словах: custom‑scheme (например myapp://) обрабатывается приложением через intent‑filter с android:scheme, а безопасные App Links используют http/https + android:autoVerify и проверку домена (Digital Asset Links). Ниже — краткие примеры и проверки, которые можно применить сразу.
Основы: custom‑scheme vs http/https (App 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 работает.