Первую часть читайте здесь.
Введение
Если вы хотите сделать так, чтобы ваши пользователи могли напрямую попасть в определенную часть внутри вашего приложения, например, когда вы отображаете предложение оформить подписку, выводите просьбу обновить свой профиль или переносите пользователя в корзину в приложении для покупок, диплинки (deep links или глубинные ссылки) могут помочь вам с этим.
Чтобы получить доступ к определенному контенту в вашем приложении, пользователи могут переходить по этим ссылкам как извне, так и внутри вашего приложения. Их можно использовать на веб-страницах, уведомлениях, в качестве ярлыков или навигации между модулями в вашем приложении.
В этой части нашего руководства мы более подробно рассмотрим различные типы диплинков. Мы разберемся, как их настроить, протестировать и создать с их помощью лучший юзер экспириенс. Чтобы узнать больше о том, что вы можете делать с помощью диплинков, ознакомьтесь с первой частью этой серии статей.
Есть несколько разных типов ссылок на контент, которые вы можете задействовать в своем Android-приложении: стандартные диплинки, веблинки и Android-эпплинки. Рисунок 1 показывает взаимосвязь между этими типами ссылок:
Все эти формы диплинков — это URI, которые ведут пользователей непосредственно к определенному контенту в вашем приложении.
Веблинки (Web links) — это диплинки, использующие схемы HTTP и HTTPS.
Android-эпплинки (Android App Links) — это веблинки, которые верифицированы под ваше конкретное приложение.
Пара примеров URI:
“example://droid.food.app” — URI с пользовательской схемой “example”.
“https://www.example.com/food” — URI со схемой HTTPS.
Реализация диплинков
Когда пользователь кликает по ссылке или приложение программно вызывает URI интент, Android пытается найти приложение, которое сможет обработать эту ссылку.
Чтобы убедиться, что ваше приложение может быть обработчиком, вам следует выполнить следующие три шага:
Шаг 1: Добавьте интент-фильтры для входящих ссылок
Добавьте интент-фильтры (intent filters) в файл манифеста и направьте пользователей в нужное место в вашем приложении, как показано в следующем фрагменте кода:
<!--AndroidManifest.xml-->
<activity
android:name=".LocationsActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="geo" />
</intent-filter>
</activity>
Интентов-фильтр в Android
В этом примере мы добавили интент-фильтр, который направляет пользователей к LocationsActivity.
Давайте разберем элементы и значения атрибутов этого интента:
Определяем интент-экшн ACTION_VIEW, чтобы интент-фильтр был доступен из Google-поиска.
Добавляем категорию BROWSABLE. Это необходимо для того, чтобы интент-фильтр был доступен из браузера. Без него пользователи не смогут открыть ваше приложение по диплинку из браузера.
Также добавляем категорию DEFAULT. Это позволит вашему приложению реагировать на неявные (implicit) интенты. Если этого не сделать, активити может быть запущена только в том случае, если ваше приложение указано в интенте.
Можно добавить один или несколько тегов <data>, каждый из которых представляет формат URI, связанный с конкретным активити. Тег <data> должен включать атрибут android:scheme.
После того как вы добавили один или несколько интент-фильтров с URI для содержимого активити в файл манифеста вашего приложения, Android может направит любой интент, для которого есть соответствующее URI, в ваше приложение в рантайме. Чтобы узнать больше об определении интент-фильтров и их атрибутов, советую почитать статью “Добавление интент фильтров для входящих ссылок”.
Шаг 2: Чтение данных из входящих интентов
После того как система Android запустит вашу активити через интент-фильтр, вы можете использовать данные, предоставленные интентом, чтобы определить, что вам нужно отобразить. Вот фрагмент кода, который демонстрирует, как получить данные из интента:
// MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
val intentAction: String? = intent?.action
val intentData: Uri? = intent?.data
}
Чтение данных из интента
Вы также должны позаботиться об обработке новых интентов, когда активити уже создано. Если пользователь хочет открыть ссылку до того, как активити было уничтожено, вы можете получить новый интент с помощью метода onNewIntent() вашего активити.
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// мы должны сохранить новый интент, если только getIntent() не вернуло старый
setIntent(intent)
val action: String? = intent?.action
val data: Uri? = intent?.data
}
Обработка новых интентов
Шаг 3: Проверка диплинка
Вы можете использовать Android Debug Bridge (adb) для проверки обработки диплинков вашим приложением. Общий синтаксис для тестирования URI интент-фильтра с помощью adb:
$ adb shell am start
-W -a android.intent.action.VIEW
-d <URI> <PACKAGE>
Например, приведенная ниже команда пытается просмотреть приложение с package = “food.example.com”, который связан с URI = “example://food”:
$ adb shell am start
-W -a android.intent.action.VIEW
-d “example://food” food.example.com
Имя пакета может быть пропущено для неявных интентов, но должно быть указано для явных. Дополнительные сведения о параметрах команд вы можете в документации Call activity manager (am) .
Объявление манифеста и обработчик интентов, которые вы установили выше, определяют связь между вашим приложением и ссылкой на контент. Теперь давайте рассмотрим ссылки, которые используют схемы HTTP и HTTPS, и как убедиться, что система рассматривает ваше приложение как обработчик по умолчанию.
Веблинки
Веблинки — это диплинки, использующие схемы HTTP и HTTPS. Они реализованы одинаково, за исключением того, что ваш интент-фильтр включает схему “http” или “https”.
Если вы владеете веблинком (владеете доменом и имеете соответствующую веб-страницу), следуйте приведенным ниже инструкциям для Android-эпплинков.
Если вы не владеете веблинками и функция main вашего приложения открывает ссылки третьих лиц, вы должны донести эту информацию своим пользователям и следовать инструкциям о том, как попросить пользователя связать ваше приложение с доменом. Прежде чем сделать этот запрос разрешения на регистрации домена, объясните пользователю зачем это. Например, вы можете показать им экран, объясняющий, почему ваше приложение должно быть обработчиком по умолчанию для определенного домена.
Android-эпплинки
Android-эпплинки — это веблинки, которые верифицированы исключительно под ваше приложение. Когда пользователь переходит по верифицированной ссылке на Android-приложение, установленное приложение сразу же открывается. Диалоговое окно устранения неоднозначности (disambiguation dialog) в таком случае не появится.
Если ваше приложение не установлено и пользователь не установил другое приложение в качестве обработчика по умолчанию, ваша ссылка будет открыта в браузере.
Реализация Android-эпплинков
Чтобы настроить Android-эпплинк, в дополнение к шагам 1, 2 и 3, описанным выше, вам также придется выполнить несколько дополнительных шагов:
Шаг 4: Добавьте атрибут “autoVerify” в интент-фильтры
Чтобы система могла верифицировать, что Android-эпплинк связан с вашим приложением, вам нужно добавить интент-фильтры следующего вида:
<!--AndroidManifest.xml-->
<!--Make sure you explicitly set android:autoVerify to "true"-->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- If a user clicks on a shared link that uses the "http" scheme,
your app should be able to delegate that traffic to "https". -->
<data android:scheme="http" />
<data android:scheme="https" />
<!-- Include one or more domains that should be verified. -->
<data android:host="food.example.com" />
</intent-filter>
Добавьте атрибут autoVerify для Android-эпплинков
Шаг 5: Объявите связь между вашим приложением и веб-сайтом
Объявите связь между вашим веб-сайтом и вашими интент-фильтрами, разместив Digital Asset Links JSON-файл по следующему адресу:
https://food.example.com/.well-known/assetlinks.json
Digital Asset Links JSON-файл должен быть публично доступен на вашем веб-сайте. Он указывает Android-приложения, связанные с веб-сайтом, и верифицирует URL интенты приложения.
В следующем примере файл assetslinks.json предоставляет Android-приложению права на открытие ссылок droidfood.example.com:
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.droidfood",
"sha256_cert_fingerprints": [
"14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:9G:34:FC:64:16:S9:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:X5"
]
}
}
]
Файл assetslinks.json для приложения Droidfood
Убедитесь, что ваша подпись (signature) верна и соответствует подписи вашего приложения:
В assetslinks.json должна быть релизная подпись. Вы также можете добавить дебажную подпись в целях тестирования.
Подпись должна быть в верхнем регистре.
Если вы используете Play App Signing, убедитесь, что вы используете подпись, которой Google подписывает каждый из ваших релизов.
Вы можете проверить эти данные, включая весь JSON, следуя инструкциям по объявлению связей с веб-сайтами.
Шаг 6: Верификация Android-эпплинков
После того, как вы подтвердите список веб-сайтов, которые будут связаны с вашим приложением, и что размещенный вами JSON-файл валиден, установите приложение на свое устройство. Подождите не менее 20 секунд, пока завершится процесс асинхронной верификации. Чтобы проверить, верифицировала ли система ваше приложение и установила ли правильные политики обработки ссылок, используйте следующую команду:
$ adb shell am start
-a android.intent.action.VIEW
-c android.intent.category.BROWSABLE
-d “https://food.example.com"
Примечание:
Начиная с Android 12, вы можете вручную вызвать верификацию домена для приложения, установленного на устройстве. Вы можете выполнить этот процесс независимо от версии SDK вашего приложения.
Если что-то не работает, следуйте этим инструкциям о том, как исправить распространенные ошибки при создании Android-эпплинков. Также рекомендую вам дождаться третьей части этой серии - “Ликбез по диплинкам. Часть 3: проблемы диплинками”
Рекомендации по навигации
Чтобы улучшить юзер экспириенс, следуйте этим рекомендациям:
Диплинк должен приводить пользователей непосредственно к контенту, без каких-либо подсказок, промежуточных страниц или необходимости входа в систему. Убедитесь, что пользователи могут видеть контент приложения, даже если они никогда раньше не открывали ваше приложение. При последующих взаимодействиях, например, когда они открывают приложение из панели запуска приложений Android, можно запрашивать у пользователей сделать шаги, которые они пропустили, перейдя к содержимому диплинка.
Следуйте рекомендациям по дизайну приложения, описанным в разделе Navigation with Back and Up, чтобы ваше приложение соответствовало ожиданиям пользователей в отношении навигации назад после того, как они войдут в ваше приложение по диплинку.
Давайте рассмотрим пример диплинка, который открывает экран с информацией о еде в приложении Droidfood.
Рисунок 2: Переход по диплинку в приложение Droidfood изменяет обычный стек переходов назад для приложения (back stack).
В этом примере пользователь переходит по диплинку, который открывает экран “Информация о кексе”. Когда пользователь нажимает назад, приложение вместо выхода переходит на “Главный экран Droidfood”. Приложение показывает этот экран, потому что с “Главного экрана Droidfood” пользователь может вернуться к “Информации о кексе”. Эта навигация помогает пользователю узнать, как в будущем находить контент диплинка в приложении, не выполняя повторный переход по этой ссылке.
Если вы используете компонент навигации Android Jetpack, ознакомьтесь с разделом создание диплинка для конкретной конечной точки.
Резюме
В этой части вы узнали, как реализовать различные типы диплинков. Рекомендуется использовать Android-эпплинки, которые помогают избежать диалога устранения неоднозначности, когда у пользователей не установлено ваше приложение. Дополнительные сведения о диплинках вы можете найти в руководстве общие сведения о различных типах диплинков.
Часть 2: Диплинки с нуля
Часть 3: Решаем проблемы с Android-эпплинками
Часть 4: Диплинки для вашего бизнеса
Спасибо за внимание!
Статья подготовлена в преддверии старта курса "Android Developer. Professional".