В прошлый раз мы с вами дружно:
Ввели основные понятия: Deep Link, Web Link, Android App Link, disambiguation dialog
Поговорили о том, чем они похожи и чем отличаются
Разобрали особенности URI формата в Android
Описали исходную задачу
Презентовали Deep Link Tree
Если вы до сих пор не прочитали первую часть, то ознакамливайтесь и возвращайтесь :)
Сегодня мы будем разбирать две проблемы, связанные с работой deep link на разных устройствах и версиях Android. Каждую проблему будет разбирать на экспериментах (которых мы провели аж 280+ штук).
Содержание
Описание эксперимента
Перед тем как разбираться с проблемами, давайте познакомимся с форматом экспериментов. Мы решили подойти к исследованию проблем эмпирически: проверить, как фактически отрабатывают deep link в реальных условиях.
Взяли семь устройств
Pixel 2
Samsung A70
Samsung A7
Honor 9 Lite
Samsung Galaxy Tab A
Xiaomi Mi5
Восемь версий Android
5.0
6.0
7.0
8.0
9.0
10.0
11.0
12.0
Пять оболочек
One UI 2.5
Samsung Experience 9.0
One UI 3.1
EMUI 9.1.0
MIUI Global 10.2.2.0
Семь приложений
SMS-клиент
Telegram
VK
WhatsApp
Gmail
Google Search
VK Toasters
Запаслись терпением, таблицами и начали тестировать.
Посмотрим на таблицу выше. Мы решили описать конфигурацию в виде набора из шести параметров:
Config – идентификатор конфигурации;
Real/Emulator — является ли устройство реальным или эмулятором;
Android OS — версия Android;
OS Shell — оболочка операционной системы и ее версия;
Device — название устройства;
App — приложение, из которого будем переходить по deep link.
Теперь разберем таблицу эксперимента. В нее внесены три тестовых URL: developer.andorid.com/about, http://developer.andorid.com/about, https://developer.andorid.com/about и две scheme: http, https.
Q: Почему именно они?
A: Давайте вспомним исходную задачу: нам нужны deep link на ресурсы http://domain1.domain2.ru/landing, https://domain1.domain3.ru/path1/path2/{id}/ и другие. То есть http, https ссылки с host (не особо важно какой) и path (не особо важно какой).
Q: Что тут забыл developer.andorid.com/about (без схемы)?
A: Такие ссылки тоже работают! У них нет обязательного параметра scheme, но посмотрите на скринкаст.
Теперь опишем процедуру выполнения эксперимента:
Выберем реальное устройство или эмулятор, версию Android, оболочку ОС, приложение.
Запускаем выбранное устройство.
Открываем выбранное приложение.
Вставляем три вида ссылок.
Настраиваем intent-filter внутри нашего приложения. Так как исходная задача заключалась в реализации Web Link, то были выбраны http и https схемы. Начинаем с http.
<data
android:host="developer.android.com"
android:path="/about"
android:scheme="http"/> <!-- Тут –->
Компилируем, открываем приложение, в которое вставили ссылки. Начинаем кликать :)
Если Android предложил открыть наше приложение, то помечаем этот сценарий плюсом, иначе минусом.
http схема протестирована! Повторяем шаги 5, 6, 7 для https scheme.
Кстати, вот ссылка на таблицы всех экспериментов. Не торопитесь очень подробно рассматривать, там есть спойлеры к следующим статьям.
Хронология появления проблем
ТЕПЕРЬ ВЫ ГОТОВЫ! Давайте посмотрим на список проблем, с которыми нам пришлось столкнуться на пути решения исходной задачи:
Разные устройства. Обработка deep link отличалась на разных устройствах.
Разные версии Android. Обработка deep link отличалась на разных версиях Android.
Разные оболочки ОС. Обработка deep link отличалась на разных оболочках Android.
Разные приложения. Обработка deep link отличалась в зависимости от приложения, из которого открывалась ссылка.
Ссылки без scheme. Ссылки вида host/path обрабатывались по-разному.
Второй host. Мы забыли о том, что у нас есть второй домен.
Перехват всех ссылок. В один момент приложение начало перехватывать все ссылки с нашим доменом (даже те, для которых у нас не было сценариев обработки).
В этот раз мы разберем первые две проблемы. Остальные будут в следующих статьях. Поехали!
Проблема №1. Разные устройства
Опишем условия, в которых воспроизводится проблема:
На обоих устойствах открываем Gmail, отправляем сами себе письмо с ссылкой domain1.domain2.ru/landing, получаем, открываем, кликаем по ней. А теперь внимание на экран:
Как всегда, реальность внесла свои коррективы… Несмотря на то, что мы открываем одну и ту же ссылку, в одном и том же приложении, на одном и том же Android, в наше приложение смог перейти только Config X-1 (Samsung A70). Мы решили сформулировали гипотезу:
Гипотеза 1. Разные устройства.
Устройство (аппаратная часть) влияет на работу Deep Link
Ответ пришел быстро. Во-первых, тут разные оболочки. Во-вторых, Deep Link — это механизм, реализованный на программном уровне (то есть в устройстве нет специального чипа, который отвечает за обработку deep link). Поэтому
Гипотеза 1. Разные устройства — ОПРОВЕРГНУТА.
Устройство (аппаратная часть) НЕ ВЛИЯЕТ на работу Deep Link
Это значит, что в последующих тест-кейсах параметр конфигурации Device считаем незначимым (его изменение не влияет на результаты экспериментов).
Проблема №2. Разные версии Android
Как и в прошлый раз, опишем условия, в которых воспроизводится проблема:
На обоих устройствах открываем стандартный СМС клиент, отправляем куда-нибудь сообщение с ссылкой http://domain1.domain2.ru/landing, кликаем по ней. Обратите внимание на экран:
Как и в прошлый раз, мы открываем одну и ту же ссылку, в одном и том же приложении, но на разных версиях Android. В этот раз в наше приложение смог перейти только Confix X-2 (Android 10.0).
Сформулируем гипотезу:
Гипотеза 2. Разные версии Android.
Версия Android OС влияет на работу Deep Link
Для проверки этой гипотезы будем использовать мажорные версии Android: 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0… Попались! :) С 12.0 web link не обрабатывается приложением (только Android App Link, смотри предыдущую статью), поэтому 12.0 и 13.0 исключаем из списка.
В рамках гипотезы мы зафиксировали все параметры, кроме Android OS, чтобы отследить его влияние на обработку Deep Link. Результаты оказались неоднозначными. Посмотрите на таблицы:
Рассмотрим самый распространенный результат (исходники тут Config 1, Config 2, Config 3, Config 5, Config 6, Config 7):
Для http scheme первая и вторая ссылки открываются в нашем приложении, https ссылка — нет.
Https работает почти также, но https ссылка обрабатывается, в отличие от строчки выше.
Теперь разберем исключительный случай:
Для http scheme никаких отличий нет.
Для https Android 8.0 отличился. Здесь система предложила открыть приложение при переходе по первым двум ссылкам (в предыдущей таблице тут стоят +).
Давайте не будем торопиться с выводами. Внимание на скринкасты.
Изначально в списке приложений нет нашего, но при выборе браузера появляется disambiguation dialog, в котором оно есть!
Если не слишком придираться, то можно сказать, что в конечном итоге пользователю было предложено открыть наше приложение (с оговоркой о том, что сначала пришлось выбрать браузер). Давайте подкорректируем таблицы с учетом этого допущения.
Вернемся к гипотезе. Если считать, что переход через браузер в наше приложение равносилен прямому переходу в приложение, то Android не влияет на обработку Deep Link. В противном случае вывод обратный. Мы считаем эти переходы равносильными, поэтому
Гипотеза 2. Разные версии Android – ОПРОВЕРГНУТА.
Версия Android OС НЕ ВЛИЯЕТ на работу Deep Link.
Это значит, что в последующих тест-кейсах параметр конфигурации Android ОС считаем незначимым (его изменение не влияет на результаты экспериментов).
Резюме
Подведем итоги. Сегодня мы рассмотрели две из семи проблемы, с которыми столкнулись при решении исходной задачи.
Проблема первая: на разных девайсах диплинк обрабатывается по-разному. Означает ли это, что аппаратная часть устройства может влиять на обработку? Нет. Deep Link — это механизм, реализованный на программном уровне (нет чипа, отвечающего за обработку deep link).
Гипотеза 1. Разные устройства — ОПРОВЕРГНУТА. Устройство (аппаратная часть) НЕ ВЛИЯЕТ на работу Deep Link.
Вторая проблема состояла в том, что на разных версиях Android диплинки обрабатывались не всегда ожидаемо (посмотрите еще раз на скринкасты). Сначала нам не удалось перейти в приложение на Android 8.0. Но после выбора браузера появился disambiguation dialog с нашим приложением. Кто-то скажет, что перехода в приложение нет (ваше право). Мы же считаем, что он есть (пусть и пользователю приходится делать один дополнительный клик).
Гипотеза 2. Разные версии Android – ОПРОВЕРГНУТА.
Версия Android OС НЕ ВЛИЯЕТ на работу Deep Link.
Поздравляем! Ты дважды молодец! Позади вторая часть пути, но настоящие сложности еще впереди. Как ощущения? Напиши в комментариях, ожидал ли ты такие исходы по первой и второй гипотезам?
В следующий раз мы разберем еще две проблемы и сделаем выводы по гипотезам:
Гипотеза 3. Разные оболочки ОС.
Оболочка Android ОС влияет на работу Deep Link.
Гипотеза 4. Приложение.
Приложение, из которого открывается ссылка, влияет на работу Deep Link.
Увидимся в третьей части, а пока можете посмотреть на то, как Валера щелкает алгоритмы с LeetCode в «Алгоритмической качалке». До встречи!
Валера Петров
Android-разработчик. TG: @valeryvpetrov
Ангелина Евсикова
Android-разработчица Технократии. TG: @Angelina_dev
Также подписывайтесь на наш телеграм-канал «Голос Технократии». Каждое утро мы публикуем новостной дайджест из мира ИТ, а по вечерам делимся интересными и полезными мастридами.