Как открыть deeplink на андроиде
Перейти к содержимому

Как открыть deeplink на андроиде

  • автор:

Что такое и как работает deep linking?

Deep linking – это концепция перемещения по ссылке на конкретный ресурс или страницу веб-сайта или приложения. В андроиде под deep link подразумевают URL, который открывает экран приложения, если приложение установлено на устройстве.

Реализация механизма deep linking для Android-приложения состоит из двух частей:
1. Сделать так, чтобы операционная система запускала ваше приложение, когда пользователь кликает на ссылку.
2. Реализовать навигацию внутри приложения на нужный экран.

Один из способов запуска приложения по ссылке – использование intent-filter с кастомной схемой.

В интент фильтре на скриншоте задана схема itsobes . Это значит, что когда пользователь кликнет на ссылку вида itsobes:/// , система запустит SplashActivity . Если на устройстве установлены несколько приложений или активити с интентом, обрабатывающим данную схему, то система покажет пользователю диалог выбора приложения.

Ссылки с кастомной схемой работают в нативных приложениях, если поддерживаются операционной системой. Например ссылка для телеграмма: tg://resolve?domain=JavaSobes будет работать в приложениях под Android, iOS и Mac OS, но не откроется в браузере. Такие ссылки работают в телеграмме, несмотря на блокировку РКН, а вот ссылка на веб-клиент https://web.telegram.org/#/im?p=@JavaSobes заблокирована в России.

Как было сказано в предыдущем посте, ссылки с кастомной схемой не работают в браузерах. Обычно этого не достаточно и требуется использовать одну и ту же ссылку, которая будет открывать приложение или Play store на Android, приложение или App store на iOS, веб-сайт на десктопе. Например как эта ссылка на Google Maps https://goo.gl/maps/8JTWxetcw7PutAfu8.
Разберем алгоритм обработки таких ссылок на примере https://itsobes.ru/app/AndroidSobes/7.html (ссылка не рабочая):
1. Когда пользователь переходит по ссылке, открывается пустая веб-страница, которая по User-Agent определяет платформу пользователя.
2. Если это браузер на Android, происходит редирект на ссылку c кастомной схемой itsobes://AndroidSobes/7 .
3. Если браузер на iOS, то редиректится на Universal link.
4. Если браузер на десктопе, то редиректим на сайт https://itsobes.ru/AndroidSobes/7.html.

Самая сложная часть – это определение платформы по User-Agent, потому что под Android есть тысячи браузеров. Существуют готовые сервисы, реализующие механизм обработки deep link, например https://docs.adjust.com/en/deeplinking.

В API level 23 были добавлены App Links, упрощающие обработку deep links. Мы разберем App Links в одном из следующих постов.

После того, как система обработала deep link и запустила активити, необходимо выполнить второй шаг и открыть экран, заданный в deep link. Для этого в запущенной активити получаем интент методом getIntent() и далее получаем URI методом intent.getData(). Полученный URI – это и будет deep link, по которому запущена активити, в нашем примере это itsobes://AndroidSobes/7 .
Дальше нет никакой магии, нужно руками распарсить URI и реализовать логику перехода на экран, который должен быть отображен.

Не работает открытие ссылок внутри приложений на Android? Покажем как исправить и включить поддержку deeplink в Вордли

Инструкция очень простая и настроить все можно за пару минут. Особенности ОС Android такова, что в некоторых версиях нужно выдать разрешение на открытие сторонних ссылок внутри приложения. Пошагово покажем, как включить поддержку сторонних ссылок на примере игры Вордли и сайта wordle. belousov. one.

  1. Для начала необходимо зайти в настройки самой системы Андроид. Там найти кнопку «Приложения» или «Настройки приложений»
  2. В настройках найти нужное приложение для которого вы хотите включить поддержку сторонних ссылок. У нас это будет приложение Вордли. Примеры как будет выглядеть экран Настроек приложения в разных версиях Андроид. (нажмите на нужную картинку, чтобы увидеть ее в полном размере)

3. Найти пункт «Открывать по умолчанию» или «Использование по умолчанию». Нажать на него. Переключатель «Открывать поддерживаемые ссылки» должен быть включен (если выключен — включить)

Как будет выглядеть экран «Открывать по умолчанию».

4. Нажать на кнопку «+ Добавить ссылку»

5. В окошке поставить галочку у ссылки «wordle.belousov.one»

Нужно нажать на ссылку wordle.belousov.one, чтобы галочка стала активной.

6. Когда галочка станет активной, нажать на кнопку «Добавить»

Тут нажать добавить

7. На экране должна появиться ссылка wordle. belousov. one с галочкой

На разных версиях Андроид экраны могут отличаться.

После этого ссылки на сайт wordle.belousov.one будут открываться внутри приложения. В случае приложения Вордли вы сможете угадывать слова, которые вам отправили друзья.

22K открытий
2 комментария

Здравствуйте. У меня на смартфон перестали открываться внешние ссылки во всех приложениях. Например, в ватсапе ссылка на ютуб или телеграмм невозможна. А в Телеге также не открываются ссылки на другие приложения. Они только копируют я, ну и можно вставить потом там, в тех приложениях. Все эти настройки во всех приложениях на открытие ссылок я проверил, везде всё разрешено

Развернуть ветку

у меня такая же ошибка, решение не нашел

Deeplink – как сделать переход по ссылке в приложение

Реализация Deeplink на сайте links.glimake.ru

DeepLink – это глубинные ссылки. Но что такое глубинные ссылки? – сейчас объясню. Это такие ссылки, которое обеспечивают внешнее связывание, т. е. связывание вашей ссылки с приложением (или другим сайтом) напрямую. Наверняка, вы нажимали на ссылки на своем смартфоне, и он открывал приложение вместо сайта. Так, например, если вы перейдете на сайт links.glimake.ru и нажмете на любую иконку, то откроется соответствующее приложение, если оное у вас установлено. Ранее Deeplink-ами называли любые прямые ссылки с одного сайта на другой, например, instagram.com/glimake/. Т.е. с одного сайты Вы переходите на конкретную страницу другого ресурса внутри своего браузера.

Зачем нужны Deeplink-и?

Простой ответ — для увеличения конверсии. Чаще Deeplink используют коммерческие компании на своих сайтах, чтобы получить больший охват в социальных сетях. Сами подумайте, вам было бы проще нажать на сайте какой бы то ни было компании на иконку Вк и попасть в приложение Вконтакте или если открылся бы браузер и загрузилась страница vk.com? Логично, что первый вариант, так как приложения более удобны для пользователя.

Video не поддерживается вашим браузером

Как это работает?

При создании ссылки указывается не просто тело с URL, а добавляются специальные значения, которые переадресуют пользователя на необходимое приложение, если оно у вас установлено. Если нет, то откроется браузер с переходом на веб версию приложения. Например, Вы хотите переадресовать пользователя на свой Instagram аккаунт:
1 способ: [Instagram] Вы указываете обычную ссылку, нажав на нее, откроется браузер с соответствующим профилем.
2 способ: [ Instagram ] «Волшебная ссылка» откроет приложение, если у вас установлен Instagram, если нет, то также откроется профиль в браузере.

P.S. 2-й способ нужно пробовать через смартфон, чтобы увидеть эффект.

Переход с сайта прямо в приложение социальной сети | DeepLinks

Как сделать Deeplink?

  1. Заказать Deeplink – и на сайтах, которые предоставляют такую услугу. Таких сайтов много и по первым ссылкам в google вы можете найти то, что Вам подойдет.
  2. Сделать Deeplink самому под все необходимые социальные сети. При выборе данного метода вам будут необходимы базовые знания Html и JS (JavaScript)
  3. Попросить меня сделать Вам страничку аналогичную links.glimake.ru со всеми необходимыми социальными сетями и со своим дизайном

Deeplink – как сделать переход по ссылке в приложение

Как сделать Deeplink самому?

Если у вас есть базовые знания Html и JS , то приступим к делу. Сначала нужно понять логику работы ссылок: пользователь кликает по ссылке, дальше нужно определить с какого устройства был произведен клик (windows, ios, android) , дальше попытаться найти установленное приложение соц сети и если приложение найдено — открыть его, если не найдено, то открыть ссылку в браузере.
От слов к делу. Рассмотрим пример для Instagram. Для остальных социальных сетей делается аналогично.

Также необходимо в любое место кода между тегами и

Deep Dive Into Deep Link. Часть 1. Введение и исходная задача

Поводом к появлению этого материала послужила задача из прошлого проекта. Нужно было расширить покрытие контента приложения новыми Deep Link-ами. Все звучало просто, но, когда начали тестировать решение, появились неочевидные проблемы: на разных версиях Android, оболочках, устройствах, приложениях Deep Link-и работали по-разному.

Вы знаете ответы на вопросы?

  • Как отработает Deep Link на ссылку, если открыть ее в SMS клиенте Honor 9 Lite (Android 9.0, EMUI 9.1.0)?
  • А если попытаться в Gmail на Samsung A70 (Android 10.0, One UI 2.5)?
  • Или попробовать Telegram на Xiaomi Mi5 (Android 8.0, MIUI Global 10.2.2.0)?

Мы знаем, потому что провели 280+ тестов и увидели все своими глазами! Еще мы узнали, как можно обработать ссылки на уровне приложения (Linkify, HTML, Span), как выполняется их диспетчеризация (Jetpack Navigation Component, airbnb/DeepLinkDispatch, Custom), в какие нюансы Android придется удариться и как эти удары смягчить 🙂

Надеемся, этот цикл статей поможет вам сэкономить время и силы при работе с Deep Link.

В этой части мы зафиксируем основные понятия: ​​Deep Link, Web Link, App Link. Разберем особенности каждого вида Deep Link-ов и разницу между ними.

Deep Link

Перед тем, как начать наше глубокое погружение, надо расставить точки над i и разобраться что же такое Deep Link?

developer.andoroid.com говорит, что это URI произвольной схемы, которые переносят пользователей в наше приложение. Давайте разберем это определение по частям.

Deep links are URIs of any scheme that take users to your app”

Что такое URI? Это идентификатор ресурса. Какие виды URI есть? С этим сложнее. Основная сложность состоит в том, чтобы классифицировать URL и URN. Подробнее о “классическом” и “современном” взгляде на эти понятия можно почитать здесь.

Примеры классификации URI, URL, URN.

Мы будем пользоваться классификацией с картинки: URI — идентификатор общего вида, URL и URN его подвиды, которые не пересекаются.

Классификации URI, URL, URN в статье.

Но это не все. Давайте посмотрим на таблицу.

Виды идентификаторов ресурсов, их описание и примеры.

Имя

Описание

Пример

Обобщенный URI для унификации многообразия идентификаторов

URI с локализацией для удобства использования в не англоговорящих странах

Единый идентификатор ресурса

Единый локатор ресурса. Указывает на место, где ресурс расположен

Единое имя ресурса. Независимо от его расположения

Единая характеристика ресурса. Содержит метаинформацию о ресурсе / описание ресурса

Author: Arrowood, Adam;

Постоянный URL. Защищает от перемещения ресурса (404)

URL, способный определить схему по контексту использования

Compact URI. Сокращенное представление URI

Видов оказалось сильно больше. И мы уверены, что в таблице представлены не все. Давайте кратко о некоторых из них:

  • IRI — это URI с поддержкой разных языков мира
  • Uniform Resource Characteristics определяет метаданные о ресурсе
  • PURL — Persistent URL не подразумевает изменение (используется для избежания 404 ошибок)

Графически эту таблицу можно представить так:

Классификация идентификаторов ресурсов. Схематическое представление параметров URI (очень хорошо иллюстрирует обязательные и опциональные параметры).

Пару слов о формате URI. Он состоит из обязательных параметров:

  • scheme — определяет контекст / смысл идентификатора
  • path — иерархические данные для идентификации ресурса.
  • userinfo — информация о том, кто взаимодействует с ресурсом
  • host — адрес расположения ресурса
  • port — точка взаимодействия с host / конкретный процесс или сервис
  • query — неиерархические данные для идентификации ресурса
  • fragment — идентификация вторичного ресурса внутри исходного ресурса.

Подробнее о параметрах можно почитать тут и тут.

“Deep links are URIs of any scheme that take users to your app”

Следующая часть определения про схемы. Deep link — URI произвольной схемы. Схем море. Если схема зарегистрирована в IANA, то она считается официальной. Некоторые из популярных официальных схем:

  • geo:55.79378663446035,49.11699501723111
  • mailto:technokratos.com
  • tel:+78432776410
  • sms:+78432776410?body=hello%20technokratos
  • Другие примеры тут

Если схема не зарегистрирована в IANA, то она неофициальная. Но, даже не смотря на это, есть схемы, которые сыскали популярность в сообществе, например:

  • jdbc:mysql://host:port/database?params…
  • slack://open?team=
  • zoommtg://zoom.us/join?confno=.
  • Другие примеры тут

“Mobile deep links are one example of a class of unofficial URI schemes that allow for linking directly to a specific location in a mobile app.”

Есть специальных подвид неофициальных схем, которые используются для перехода в мобильные приложения. Наверное, кто-то из вас видел подобное:

  • myapp://example/path/to/resource
  • superapp://example/path/to/resource
  • wow://example/path/to/resource

“Deep links are URIs of any scheme that take users to your app

Ну и наконец, deep link, в большинстве случаев, используется для редиректа пользователя в ваше мобильное приложение. Посмотрите на три примера. На каждом из них изображены сценарии перехода в мобильное приложение по ссылке.

Снова обратимся к developer.android.com. Там написано нечто подобное: “Пользователи, переходящие по ссылкам на устройствах, преследуют одну цель: добраться до контента, который они хотят видеть”. Казалось бы, вcе просто:)

Но это был бы не Android, если история закончилась вот так. Чтобы добраться до “content they want to see” нужно еще кое-что. Видели когда-нибудь такой диалог?

Диалог выбора приложения для открытия ссылки.

При нажатии на ссылку система показывает (не всегда, но об этом после) пользователю disambiguation dialog. В нем отображается список приложений-кандидатов для обработки перехода по ссылке. Список формируется в зависимости от ссылки и intent-filter установленных приложений (об этом тоже после). Кроме списка приложений пользователю доступны две опции:

  • Just once (Только сейчас) открывает выбранное приложение и попросит заново выбрать из списка кандидатов при повторном нажатии. При этом система может запомнить предыдущий выбор и показать его в самом вверху диалога (возможно, для удобства пользователя).
  • Always (Всегда) запомнит выбор и больше не будет просить его сделать. В настройках приложения можно будет найти ссылки, которые всегда обрабатываются приложением и изменить поведение при необходимости.

Web Link

Теперь поговорим о web link. Это подвид deep link. Но, в отличие от них, web link могут иметь только http и https схемы.

Очень важный момент: на Android 11 и ниже клик по web link может быть обработан вашим приложением, но, начиная с 12 версии, web link открываются только в браузере. Это может быть связано с тем, что Google настаивает на использовании Android App Links.

Различие в обработке Web Link на разных версиях Android. На Android 11- (сверху) по клику на https-ссылку пользователю предлагается выбрать приложение. На Android 12+ (снизу) выполняется прямой переход в браузер.

Android App Link

В Android 6.0 появилась возможность выполнять переход по deep link без disambiguation dialog. Эта фича дает пользователю возможность не совершать дополнительных действий и сделать прямой переход в приложение, улучшая пользовательский опыт. Именно с версии 6.0 и появились Android App Link.

Давайте по порядку.

Q: Почему app link это web link?

A: Потому что app link связывается с веб-доменом по протоколу http (ссылка).

https://domain.name/.well-known/assetlinks.json

Q: Зачем связываться с веб-доменом?

A: Для того, чтобы выполнить верификацию приложения, то есть указать системе, что именно это приложение ответственно за выбранный домен (“. to associate an app with a web domain they own.»). Получается, после успешной верификации система знает, кому адресовать переход по ссылке, и может не открывать disambiguation dialog.

https://domain.name/.well-known/assetlinks.json

Q: Как происходит связывание между приложением и веб-доменом?

A: Автоматически (“. contain the autoVerify attribute”). Посмотрим на схему. Во время установки приложения система по autoVerify атрибуту в intent-filter понимает, что необходимо выполнить верификацию. Так как приложение обычно скачивается из сети (Google Play Store, например), это самый удобный момент для выполнения http запроса на специальный ресурс ( /.well-known/assetlinks.json , который описан в спецификации Digital Asset Link). В случае успеха система выполняет ассоциацию. Подробнее здесь.

Схема связывание приложения и веб-домена в момент установки. Связывание выполняется один раз — во время установки приложения.

Спойлер для самых пытливых читателей

Пытливый читатель спросит: «А что если не будет интернета? Или что-то пойдет не так на сервере?». Очень резонные вопросы! Выдают ваш профессионализм. Нюансов действительно много. Подробнее читаем здесь:

  • “The domain verification process requires an internet connection and could take some time to complete”
  • “The system must be able to verify the host specified in the app’s URL intent filters’ data elements against the Digital Asset Links files hosted on the respective web domains in that intent filter.”
  • “If the verification fails, the system then defaults to its standard behavior to resolve the intent. However, the app can still be verified as a default handler for any of the URL patterns defined in the app’s other intent filters.”
  • “On Android 11 (API level 30) and lower, the system doesn’t verify your app as a default handler unless it finds a matching Digital Asset Links file for all hosts that you define in the manifest.”
  • “On Android 12 and higher, you can also invoke the verification process manually to test the verification logic.”

А мы пока идем дальше.

Ранее было сказано, что web link не откроется на Android 12. Но web link можно превратить в app link и обойти это ограничение!

Другие фичи Deep Link

Также доступен поиск по контенту, на который есть deep link. На примере видно, что при вводе “Kenny” в поисковую строку у нас есть возможность перейти в другое приложение, для которого настроен deep link для обработки этой информации. Подробнее тут и тут.

Примеры использования deep link при поиске контента на устройстве.

Также deep link используются в дополнении к instant apps, делая вход в ваше приложении более нативным и прозрачным (ссылка). Посмотрите на каждый из примеров: пользователь нажимает на ссылку и сразу же переходит в ваше приложение (уменьшается порог вхождения, расширяются воронки, повышается конверсия!).

Что нам нужно было сделать?

Теперь, когда вы на 50% в теме, можем переходить к разбору задачи. Нам было необходимо реализовать переход в приложение по ссылкам:

  • scheme: http, https
  • host: domain1.domain2.ru, domain1.domain3.ru
  • path: /, /landing, /landing/, /path1/path2/

То есть сделать так, чтобы все эти ссылки:

  • http://domain1.domain2.ru
  • http://domain1.domain2.ru/
  • http://domain1.domain2.ru/landing
  • http://domain1.domain2.ru/landing/
  • http://domain1.domain2.ru/path1/path2/
  • http://domain1.domain2.ru/path1/path2//
  • https://domain1.domain2.ru
  • https://domain1.domain2.ru/
  • https://domain1.domain2.ru/landing
  • https://domain1.domain2.ru/landing/
  • https://domain1.domain2.ru/path1/path2/
  • https://domain1.domain2.ru/path1/path2//
  • http://domain1.domain3.ru
  • http://domain1.domain3.ru/
  • http://domain1.domain3.ru/landing
  • http://domain1.domain3.ru/landing/
  • http://domain1.domain3.ru/path1/path2/
  • http://domain1.domain3.ru/path1/path2//
  • https://domain1.domain3.ru
  • https://domain1.domain3.ru/
  • https://domain1.domain3.ru/landing
  • https://domain1.domain3.ru/landing/
  • https://domain1.domain3.ru/path1/path2/
  • https://domain1.domain3.ru/path1/path2//

стали диплинками. На это уже сложно смотреть. Проще только потерять какую-нибудь ссылку или сделать опечатки 🙂

Тогда мы решили придумать визуальную документацию deep link — Deep Link Tree. Она нужна для того, чтобы не забыть обработать ни один URL и сделать представление более наглядным.

Пример Deep Link Tree. Уровни дерева состоят из основных частей любой ссылки: scheme, host, port и path.

Теперь переложим нашу задачу на Deep Link Tree. Изначально наше приложение умело обрабатывать не все возможные диплинки — они все начинались с единственной https scheme, имели один host и заканчивались несколькими path.

Но нам этого оказалось мало. Мы хотели добавить обработку ссылок с http и еще один host. При этом, чтобы все это работало и не пришлось писать много однотипного кода.

Deep Link Tree нашего приложения ДО. Deep Link Tree нашего приложения ПОСЛЕ.

Теперь посмотрим, как это выглядит в коде. Внутри интент-фильтра прописываем параметры (подробнее читайте в документации):

  1. Сначала указываем action VIEW, чтобы наше приложение умело обрабатывать intent на просмотр контента.
  2. Затем обязательно устанавливаем category DEFAULT для пометки активности как обработчика для событий по умолчанию.
  3. Опционально добавляем category BROWSABLE. В этом случае мы говорим системе, что наше приложение способно обработать события, которые происходят в браузере.

Следующий обязательный тег — data. В нем описано, по каким данным фильтруется intent. Для deep link в качестве этих данных выступают части URL:

  1. scheme
  2. host
  3. port
  4. различные варианты путей: path, pathPrefix, pathPattern. Об их отличиях расскажем в следующих частях
  5. mimeType

Исходная задача описана. Можем приступать к решению! Но перед этим давайте поговорим о паре очень важных моментов.

Еще пару слов о Deep Link

Сравним URI форматы из основной спецификации и из спецификации Android. Зеленым отметим общие параметры, серым уникальные. В силу ограничений Android, мы не можем использовать параметры: userinfo, query, fragment. Поэтому URI формат урезается до нижней схемы. Обратите внимание, что в ней scheme и host стали обязательными (в отличие от scheme и path в основной спецификации).

Почему именно такой формат?

Есть предположение, что это сделано для того, чтобы ускорить intent-resolution в тот момент, когда система ищет приложения-кандидаты. Чем меньше атрибутов, тем меньше сравнивать, тем быстрее сравнение. Это проблема станет более ярко выраженной, когда мы будет говорить про регулярные выражения в path.

Сравнение URI форматов в основной спецификации и в Android. Серым отмечены параметры, которые не используются в Android.

Получается, что из-за ограничений формата URI Android не может обрабатывать все их виды. Из рассмотренных ранее примеров могут быть обработанными только: URL, PURL, Clean URL, а значит:

“Deep links are URIs of any scheme that take users to your app”

“Deep links are URIs URLs (but not all) of any scheme that take users to your app”

и классификация идентификаторов принимает вид:

Классификация идентификаторов ресурсов. Зеленым отмечены те, которые могут быть обработаны Android.

Резюме

Подведем итоги. Отношения между deep link, web link, app link можно представить в виде пирамиды.

Отношения между Deep Link, Web Link, Android App Link.

В ее основании которой лежит Deep Link — технология, пусть и самая старая, но базовая. Deep Link используется в уведомлениях, при поиске контента, в instant apps, передаче данных внутри приложения или между ними и т.д. Основная задача — перенести пользователя в мобильное приложение. Web Link нацелен на привлечение трафика из web в mobile. Поскольку http ссылки сильно распространены, именно такие ссылки дают возможность контенту шире распространяться в интернете. Android App Link — это современный и более продуманные с технической точки зрения Web Link. Нацелен на улучшение пользовательского опыта и безопасность.

Android накладывает ограничения на формат URI. Доступно всего четыре параметра для настройки:

Сравнение URI форматов в основной спецификации и в Android. Серым отмечены параметры, которые не используются в Android.

  • Два обязательных: scheme, host
  • Два опциональных: port, path

Чтобы не допустить ошибки в ваших deep link и сделать их список более наглядным, рекомендуем обратить внимание на Deep Link Tree. Для его построения начните с определения scheme, далее соедините их с host, потом с path. Deep Link Tree может быть представлен графически, простым списком URL, XML-разметкой / программным кодом в intent-filter.

Поздравляем! Вы дочитали статью и потому можете сказать себе: “Я молодец!”. Надеемся, вам понравилось. Ответь, пожалуйста, на опрос и напиши комментарий (твои впечатления, замечания, рабочий опыт, мнение — все, что считаешь нужным). Встретимся во второй части!

Валера Петров

Ангелина Евсикова

Android-разработчица Технократии. TG: @Angelina_dev

Также подписывайтесь на наш телеграм-канал «Голос Технократии». Каждое утро мы публикуем новостной дайджест из мира ИТ, а по вечерам делимся интересными и полезными мастридами.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *