Сайты с множественной переадресацией и поддержкой диплинков
Представьте, что у вас есть сайт, к примеру, 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
. Происходит именно то, что должно происходить.
- Вы переходите по глубинной ссылке на
m.yoursite.com
, открывается браузер. - Браузер перенаправляет пользователя на
www.yoursite.com
. - Поскольку
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. В нашем случае конечными адресами будут:
- https://www.yoursite.com/.well-known/assetlinks.json
- https://m.yoursite.com/.well-known/assetlinks.json
Результат
Пользователь кликает на www.yoursite.com
или m.yoursite.com
— и оба адреса по умолчанию напрямую открываются в приложении, даже не запрашивая разрешение. Многие разработчики упускают этот момент: он не очевиден.
Читайте также:
- Знакомьтесь, компонент Navigation в Android!
- Переоткрываем для себя эмулятор Android для ускорения тестирования
- Выполнение AES/GCM в Android
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи: Elye, “The Wrong, Hacked, and Correct way of Android Deep Linking for Redirected MultiSite with AutoVerify”