Сайты с множественной переадресацией и поддержкой диплинков

Представьте, что у вас есть сайт, к примеру, https://www.yoursite.com. Когда пользователь кликает по ссылке http://www.yoursite.com, где нет s или https, вы хотите, чтобы он оказался на вашем сайте, поэтому включаете автоматическое перенаправление на https.

Также предположим, что у вас есть https://m.yoursite.com и http://m.yoursite.com с переадресацией на https://www.yoursite.com, как показано ниже: 

И вам хочется, чтобы мобильные и https-версии через глубинное связывание (иначе  —  диплинк) вели в ваше приложение с помощью AutoVerify. Как этого добиться?

Некорректное решение

Чтобы удостовериться, что все эти сайты ссылаются на приложение, вы пишете в AndroidManifest.xml такие строки:

<data android:host="www.yoursite.com" />
<data android:host="m.yoursite.com" />
<data android:scheme="http" />
<data android:scheme="https" />

Это делается, чтобы охватить все возможные комбинации из диаграммы выше. Также у вас есть файл assetlink.json по адресу https://www.yoursite.com/.well-known/assetlinks.json

Результат

Если вы воспользуетесь глубинной ссылкой с вашего сайта на приложение, то увидите всплывающее окно:

Такой вариант может показаться работоспособным, но он просто неправильный. AutoVerify, начиная с Android SDK 23, не спрашивает разрешения, открывая глубинную ссылку сразу в приложении.

Если вы не видите этого запроса, то, вероятно, столкнулись с багом.

Хак

Есть способ быстро решить эту проблему: просто удалите <data android:host=”m.yoursite.com” /> из файла AndroidManifest.xml.

<data android:host=”www.yoursite.com" />
<data android:scheme=”http” />
<data android:scheme=”https” />

При этом assetlink.json остаётся здесь: https://www.yoursite.com/.well-known/assetlinks.json.

Результат

На первый взгляд всё хорошо: нет всплывающего окна с просьбой открыть браузер или приложение. Последнее, что вы точно видите — ваше приложение, открытое через диплинк без запроса. На самом деле происходит вот что: сначала открывается браузер и только после — ваше приложение. Причина в том, что m.yoursite.com нет в AndroidManifest.xml. Происходит именно то, что должно происходить.

  1. Вы переходите по глубинной ссылке на m.yoursite.com, открывается браузер.
  2. Браузер перенаправляет пользователя на www.yoursite.com.
  3. Поскольку www.yoursite.com указан в AndroidManifest.xml, вместо страницы браузер открывает приложение.

Такой подход позволяет избежать появления всплывающего окна, но пользователь всё равно может на секунду увидеть браузер, открытый раньше приложения.

Правильное решение

Чтобы гарантировать, что все сайты ссылаются на ваше приложение, AndroidManifest.xml должен содержать такие строки:

<data android:host="www.yoursite.com" />
<data android:host="m.yoursite.com" />
<data android:scheme="http" />
<data android:scheme="https" />

Здесь указаны два хоста и оба должны иметь assetlink.json. Перенаправление не допускается, о чём сказано в документации AutoVerify. В нашем случае конечными адресами будут:

Результат

Пользователь кликает на www.yoursite.com или m.yoursite.com  —  и оба адреса по умолчанию напрямую открываются в приложении, даже не запрашивая разрешение. Многие разработчики упускают этот момент: он не очевиден.

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи: Elye, “The Wrong, Hacked, and Correct way of Android Deep Linking for Redirected MultiSite with AutoVerify”

Предыдущая статьяЗачем и как реализовать ленивую загрузку компонентов в Angular
Следующая статьяНовая библиотека превосходит Pandas по производительности