Я рад приветствовать вас в первой части серии интенсива по диплинкам (deep links или глубинным ссылкам). Для начала, чтобы сформировать некоторый контекст, мы поговорим о том, что такое ссылка, затем мы рассмотрим все типы диплинков, и, в конце, мы обсудим некоторые моменты, связанные с безопасностью. Ну что ж, давайте приступим!
Введение
Экосистема, сформировавшаяся вокруг диплинков, пестрит огромным количеством информации и примеров использования. Тем не менее, если вы только начинаете разбираться в этой теме, то вас в первую очередь будет интересовать базовая информация о диплинках, а именно такие вопросы как: «Что мы можем делать с их помощью?», «Что такое диплинк?», «Чем он отличается от обычной ссылки?», «Для кого предназначены диплинки?».
Давайте ответим на эти вопросы, начиная с самого важного: «Для кого предназначены диплинки?» — Для пользователей.
Пользователи всегда преследуют одну цель: добраться до контента, который они хотят видеть. Ваше приложение должно удовлетворить эту потребность.
Если пользователи не имеют возможности получить доступ к вашему контенту простым способом, они могут перестать использовать ваше приложение и перейти к другому. Поэтому очень важно обеспечить для пользователей максимально комфортное взаимодействие с диплинками.
Все примеры кода, связанного с диплинками, мы будем рассматривать на примере приложением под названием Droidfood. Droidfood — это приложение, в котором пользователь может заказать свою любимую еду.
Стандартный URI
Существует несколько определений того, что такое ссылка. В этом руководстве мы остановимся на этом:
Ссылка — это последовательность символов, которая ведет нас в какое-то конкретное место.
Давайте рассмотрим реальный пример, вытекающий из этого определения:
Этот достаточно простой URI содержит три ключевых компонента. Разберем каждый из них:
“https:” — этот компонент называется scheme (схема). Схема призвана проинформировать нас, с каким типом ссылки мы столкнулись. В данном случае ссылка реализует безопасный протокол передачи гипертекста (secure hypertext transfer protocol).
“droidfood.example.com” — это компонент называется authority (и обычно не переводится ввиду обширности термина). В нем содержится имя хоста (и два опциональных компонента: userinfo и port) в иерархической форме от домена верхнего уровня к поддоменам.
“/locations” — это компонент называется path (путь). Путь помогает нам найти конкретный ресурс в рамках authority.
Теперь, когда мы разобрались с тем, что из себя представляет ссылка, настало время ответить на следующий вопрос: “Что такое диплинк?” Чтобы ответить на этот вопрос, мы можем использовать наше предыдущее определение; нам просто нужно добавить в него немного конкретики:
Диплинк — это последовательность символов, которая ведет нас в какое-то конкретное место, будь то Android-приложение или любой другой ресурс в интернете.
Любая ссылка, которая ведет нас в Android-приложение, может быть диплинком. Все зависит от ее конфигурации, о чем мы поговорим в следующих разделах.
От URI к Android-эпплинкам
В этом разделе мы рассмотрим каждый тип глубинных ссылок с точки зрения URI, приняв во внимание каждый компонент URI, о котором мы упоминали ранее, чтобы ответить на наш последний вопрос: “Что мы можем делать с их помощью?”.
Как я уже сказал выше, существуют различные типы диплинков. Следующий рисунок наглядно демонстрирует, что каждый тип диплинка является частным случаем другого типа:
Обычные диплинки (Deep Links)
С точки зрения концепции URI, обычные глубинные ссылки (или диплинки) имеют наименее конкретизированные правила, касательно их структуры. Ниже приведены два разных примера глубинных ссылок, используемых приложением Droidfood. Первая ведет нас к списку локаций, а вторая - к ресторанам, которые находятся рядом с нами:
https://droidfood.example.com/locations
droidfood://near-me
Правила, накладываемые концепцией URI на структуру диплинка:
Мы можем использовать уже готовую общеизвестную схему, например, https, mail или sms, но мы также можем воспользоваться пользовательской схемой.
Authority должно быть доменной структурой, так как она упрощает идентификацию.
Путь может быть использован для передачи параметров вашей логике и отправки пользователей на определенный экран в вашем приложении.
Использование пользовательской схемы для создания глубинных ссылок может помочь пользователям легко и быстро добраться до контента в вашем приложении. Однако у диплинков нет централизованного реестра владельцев, поэтому любое приложение может подписаться на обработку любой группы диплинков. Когда пользователь переходит по диплинку, который могут обработать сразу несколько приложений, появляется диалоговое окно устранения неоднозначности (disambiguation dialog):
До Android 12 диалоговое окно устранения неоднозначности могло появиться при следующих обстоятельствах:
Ваше приложение определяет Android-эпплинк (мы рассмотрим их чуть позже в этом руководстве), но эту ссылку не удалось верифицировать.
После того, как пользователь выбрал параметр “всегда открывать” в диалоговом окне, оно может появиться снова из-за сброса разрешений после обновления приложения.
Существуют различные схемы, которые могут помочь с различными встроенными интентами. Они могут охватывать различные фичи Android, некоторые из них включают (но не ограничиваются):
“tel” - телефон
“file” - музыка или видео
“mailto” - электронная почта
“geo” - карты
“sms” - обмен сообщениями
… и многое другое
Один из наиболее распространенных способов использования диплинков — помочь пользователю перейти к определенному активити. В нашем приложении Droidfood у нас есть 3 активити:
LocationsActivity
DeliveryOptionsActivity
AboutUsActivity
На данный момент нас интересует только то, как довести их до LocationsActivity. Поэтому наши примеры диплинков будут работать без проблем (принимая во внимание возможное появление диалога устранения неоднозначности, о котором мы уже упоминали)
Когда пользователь нажимает на эту ссылку:
droidfood://locations
Он будет перенаправлен в эту активити.
Навигация — очень интересная и очень важная тема при работе с диплинками, но мы обсудим ее в следующей части этой серии. Пока я не забыл, вот прекрасное видео от MAD, в котором показано, как это делается с помощью Jetpack Navigation.
Веблинки (Web Links)
Эти ссылки наследуют все характеристики стандартных диплинков и следуют тем же правилам синтаксиса, но с небольшой конкретизацией.
Если в двух словах, то веблинки (web links) представляют из себя самые обычные ссылки, которые вы используете в браузере. Давайте взглянем на одну такую для нашего приложения Droidfood:
https://droidfood.example.com/about-us
Эта ссылка ведет вас на страницу, где мы предоставляем пользователю информацию о нас, например, о нашей миссии и истории.
Чтобы система правильно обрабатывала веблинк, ее конфигурация должна соответствовать определенный требованиям:
Схема должна быть либо http, либо https.
Компонент authority должен быть именем вашего веб-хоста, который обязательно должен быть доступен в интернете.
Путь не является обязательным и в основном зависит от того, как устроен ваш сайт.
Начиная с Android 12, все веблинки по умолчанию открываются в браузере, если только не настроена ассоциация между вашим сайтом и приложением Android. Такая ассоциация является основой для Android-эпплинков. Подробнее об этом изменении можно прочитать в документации по изменениям в Android 12.
В этой таблице показано по какой логике, начиная с Android 12, все веблинки, не ассоциированные с вашим Android-приложением, открываются в браузере.
Если между веблинком и Android-приложением существует ассоциация и приложение установлено, ссылка откроется в приложении. Если приложение не установлено, ссылка откроется в браузере.
В предыдущих версиях Android диалоговое окно устранения неоднозначности могло появиться при наличии нескольких обработчиков веблинка, таких как другие браузеры или приложения:
Android-эпплинк (Android App Links)
Это специализированный тип диплинка, который имеет наиболее строгие требования. Поскольку мы уже знаем, что такое веблинки, а Android -эпплинк (Android App Link, не путать с аплинками/uplink) — это частный случай веблинка, который предполагает пару дополнительных шагов для конфигурации. Речь идет о процессе верификации права обрабатывать ссылку. Каждый раз, когда пользователь переходит по верифицированному Android-эпплинку, он всегда будет открываться в вашем приложении, не вызывая появление диалогового окна устранения неоднозначности.
https://droidfood.example.com/locations
Эта ссылка откроется в нашем приложении и выведет список наших ресторанов.
Компонент схемы, как и у веблинка, должен быть http или https.
Authority и путь аналогичны тем, которые вы должны указывать для веблинков. Они содержат имя вашего веб-хоста и должны быть доступны в интернете.
Как упоминалось выше, в рамках дополнительной конфигурации от нас требуется следующее:
Атрибут autoVerify, установленный в значение true в фильтре интентов вашего приложения. Он позволяет вашему приложению быть обработчиком по умолчанию для данного типа ссылки.
Объявить ассоциацию. Должна быть создана ассоциация между страницей на вашем сайте и вашим Android-приложением. Она представляет из себя JSON-файл с именем “assetlinks.json”, который должен находится в публичном доступе в каталоге “.well-known” в корневом каталоге вашего сайта.
Кроме того, стоит отметить, что вы должны позаботиться о том, чтобы ваш сайт обрабатывал эту ссылку, чтобы пользователи без вашего приложения тоже оказывались на корректной странице.
Давайте рассмотрим несколько ситуаций, когда Android-эпплинки особенно полезны:
Доступ по ссылке
Предположим, вы хотите пригласить друга на обед, и ему интересно посмотреть на меню. Вы может просто поделиться с ним ссылкой, и, поскольку у него уже установлено приложение, он открывает меню прямо в приложении.
Это довольно распространенный сценарий использования Android-эпплинков, значительно улучшающий пользовательский опыт. Просто позаботьтесь о том, чтобы если у вашего друга не установлено приложение, ваш сайт обработал эту ссылку, чтобы он мог видеть меню ресторана и с вашего сайта.
Парсинг параметров из компонента пути
Вы хотите поделиться кодом купона со скидкой 15% на доставку ужина. (Очень выгодное предложение!) В этом случае вы можете поделиться ссылкой со своими клиентами, чтобы ваше приложение автоматически применяло купон при оформлении заказа.
Эта ссылка может иметь следующий вид
https://droidfood.example.com/delivery?code=15off
После знака вопроса (“?”) в ссылке может быть еще один опциональный компонент query (запрос), и это очень хороший вариант его использования. Каждый раз, когда пользователь нажимает на ссылку, он будет перенаправлен в ваше приложение. Уже в логике вашего приложения вы можете обработать параметры, указанные в запросе.
Несколько замечаний касательно безопасности
Верификация Android-эпплинка
До Android 12, если у вас есть ссылка, которая не прошла верификацию, диалоговое окно устранения неоднозначности появлялось для всех ваших ссылок. Это означает, что другие приложения могут добавлять такие ссылки в свой манифест, делая ваших пользователей потенциально подверженными риску.
Например, предположим, что https://droidfood.example.com не верифицирован. Вредоносное приложение может добавить эту ссылку в манифест, и пользователь увидит его приложение вместе с вашим в диалоговом окне устранения неоднозначности.
Чтобы снизить риск, рекомендуется проверять все веблинки, потому что, если есть хотя бы одна ссылка, которая не была верифицирована, диалоговое окно устранения неоднозначности появится для всех них. Пожалуйста, перейдите по этой ссылке для получения дополнительной информации о том, как верифицировать ваши ссылки
Конфиденциальная информация
Будьте осторожны при создании ссылок, содержащих конфиденциальную информацию. Если вам все таки нужно включить конфиденциальную информацию в URL, рассмотрите возможность использования сгенерированных сервером токенов, которые становятся невалидными, когда они больше не нужны.
https://droidfood.example.com/login?token=tDsZE6rk1cwFPVDTCqkGbA
Перехват ссылок
Пользователи могут изменить поведение обработки ссылок на своем устройстве, из-за чего ссылки могут перехватываться другими приложениями или браузерами. Люди также могут копировать и вставлять ссылки куда угодно, поэтому убедитесь, что вы проектируете свою систему с учетом этого. Ссылки, которые вы хотите открыть в своем Android-приложении, могут по-прежнему открываться в браузере или другом приложении, выбранном пользователем.
Действия с побочными эффектами
Ссылки — отличный способ помочь пользователям выполнить какое-либо действие, но вы должны быть добросовестны в том, чтобы пользователи не были обманом вовлечены в выполнение других действий. Например, вы можете создать ссылку “Добавить чаевые”, которая открывает экран чаевых в вашем приложении, но приложение не должно отправлять платеж, пока пользователь сам не подтвердит эти чаевые в приложении.
Что дальше
Я надеюсь, что это введение помогло вам получит представление о диплинках и принять обоснованное решение о том, как включить их в свое приложение.
Теперь мы более подробно рассмотрим их реализацию. Мы сделаем это во второй части этой серии: диплинки с нуля.
После того, как мы научимся создавать их, в третьей части мы обсудим распространенные проблемы с диплинками и способы их устранения.
Диплинки также могут помочь вам с конверсией пользователей, что мы рассмотрим в четвертой части этой серии.
Статья подготовлена в преддверии старта специализации Android Developer и курса Android Developer. Professional.