Как открыть ссылки в приложении: краткий план действий
Чтобы настроить открытие ссылок в Android, используйте два механизма: Custom URI Scheme (myapp://...) для внутренних сценариев и App Links (HTTPS + autoVerify) для публичного трафика. Ниже — конкретные шаги, примеры манифеста, обработка Intent и способы тестирования.
App Scheme (Custom URI): быстрый пример и обработка
App Scheme предназначен для ситуаций, когда вы контролируете отправителя ссылок (push, email внутри продукта). В манифесте добавьте intent-filter для Activity:
<activity android:name=".ProfileActivity">
<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="profile"/>
</intent-filter>
</activity>
В Activity получите данные из intent:
val uri = intent?.data
if (uri != null && uri.scheme == "myapp") {
val userId = uri.getQueryParameter("user")
// Переход на экран профиля: загрузить данные по userId
}
Тест в ADB:
adb shell am start -W -a android.intent.action.VIEW -d "myapp://profile?user=123" com.yourpackage
Не используйте только scheme без host — начиная с Android 12 это ненадежно и может привести к конфликтам. Всегда указывайте host и по возможности path.
App Links (HTTPS) и верификация autoVerify
App Links позволяют открывать https://example.com/... прямо в приложении и проходят верификацию у Android. Шаги:
- В манифесте добавьте intent-filter с https и android:autoVerify="true":
<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>
- На сервере сайта разместите файл assetlinks.json (в корне .well-known):
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.yourpackage",
"sha256_cert_fingerprints": ["14:6D:CB:..."]
}
}]
Fingerprint получите через keytool:
keytool -list -v -keystore your.keystore
- После публикации и установки приложение будет автоматически ассоциировано, если отпечатки и package совпадают.
Тестирование: откройте ссылку в терминале или браузере на устройстве; также проверьте статус в Settings → Apps → Opening links или через adb:
adb shell pm get-package-restrictions com.yourpackage
Практические рекомендации и продвинутые фичи
- Для уведомлений используйте PendingIntent с Intent.ACTION_VIEW и нужным URI; для навигации в архитектуре Jetpack применяйте NavDeepLinkBuilder.
- При мульти‑Activity/роутинге сначала распарсьте URI в Launcher Activity и используйте NavController/resolveActivity для корректного перехода.
- Обновляйте sha256‑fingerprint при смене ключа подписи (релиз/стейдж).
Тестируйте оба сценария: ссылка открывает приложение, если установлено, и корректно падает в браузер (fallback) если нет.
Частые ошибки
- Не открывается: intent-filter не совпадает по host/path — проверьте точное значение.
- AutoVerify не сработал: assetlinks.json отсутствует или fingerprint неверный.
- Несколько приложений перехватывают одну ссылку: используйте уникальные хосты или уточняйте pathPrefix.
- Ожидание параметров: всегда валидируйте query-параметры и добавьте fallback-логику.
FAQ
-
Как отлаживать, если ссылка не попадает в приложение? Проверьте adb logcat на Intent‑события, запустите adb am start с URI, убедитесь в уникальности host и наличии BROWSABLE категории.
-
Нужно ли всегда ставить autoVerify="true"? Рекомендуется для публичных ссылок (App Links). Для внутренних схем оставьте false и используйте Custom URI.
-
Что делать, если после релиза сменился ключ подписи? Обновите sha256 в assetlinks.json и разверните на сайте; для пользователей может потребоваться переустановка для обновления ассоциации.
-
Как обеспечить fallback в браузер? Если App Link не ассоциирован, система откроет ссылку в браузере. Для Custom URI реализуйте на стороне отправителя проверку и ссылку на веб‑страницу как запасной вариант.
Настройка обычно занимает 2–4 часа: добавление intent-filter, обработка intent в коде и проверка assetlinks.json. При правильной настройке пользовательский путь становится короче, а вовлеченность и удержание растут.