Universal Links (iOS)
Universal Links — механизм Apple с iOS 9: обычная https-ссылка открывает нужный экран приложения, если домен подтверждён файлом apple-app-site-association.
Что должно совпасть, чтобы ссылка открыла приложение
Связка домена и приложения подтверждается с двух сторон. Со стороны сайта — файл apple-app-site-association: JSON без расширения в имени, отдаётся по HTTPS из корня домена или из каталога /.well-known/, код ответа 200 сразу, без промежуточных редиректов. Внутри — идентификаторы приложений и пути, которые им передаются.
Со стороны приложения — включённая возможность Associated Domains с записью вида applinks:example.com на каждый перехватываемый домен. Домен в записи и домен, откуда отдаётся файл, должны совпадать буквально: поддомен — уже другой домен.
Проверка идёт не в момент тапа: файл считывается при установке или обновлении приложения, результат система запоминает. Правки на сайте применяются с задержкой — там, где приложение уже стоит, действует прежняя связка. Схожая по смыслу схема на Android разобрана в термине App Links, требования там свои.
Почему ссылка вдруг открывается в браузере
Самая частая причина не в коде. Если пользователь однажды нажал на плашке сверху «Открыть в Safari», система запомнила выбор и дальше ведёт домен в браузер: у разработчика всё исправно, а на конкретном телефоне приложение не всплывает. Возвращает приложение долгое нажатие на ссылку с выбором открытия в нём.
Вторая причина — контекст перехода. Механизм рассчитан на осознанный тап; переход, инициированный кодом, или клик во встроенном веб-просмотре чужого приложения нередко остаётся в браузере. Отсюда жалобы «из почты открывает, из чата — нет».
Третья — редиректы. Цепочка через промежуточные домены и трекинговые прослойки мешает опознать ссылку: система смотрит на адрес, по которому идёт переход.
Как класть такие ссылки в QR-коды и сокращатели
В QR-код кодируйте обычный https-адрес верифицированного домена — тот же, что уходит в письме. Кастомная схема myapp:// внутри кода вредна: на телефоне без установленного приложения она не открывается вовсе. Https-адрес в худшем случае просто откроет сайт.
С сокращателями смотрите на домен и длину цепочки. Чужой публичный сервис отдаёт свой домен, файла привязки вашего приложения там нет, и переход почти наверняка уйдёт в браузер. Короткие ссылки на собственном домене ведут себя иначе: домен ваш, файл лежит там же, что и на сайте, промежуточных переходов минимум.
Частые вопросы
Чем Universal Links отличаются от схемы myapp://?
Кастомная схема — отдельный протокол, который регистрирует само приложение: без установленного приложения ссылка myapp:// не открывается вовсе, пользователь упирается в ошибку. Universal Link остаётся обычным https-адресом: приложение есть — откроется оно, приложения нет — откроется страница сайта по тому же адресу.
Почему ссылка перестала открывать приложение?
Чаще всего сработала память системы о выборе пользователя: если один раз открыть такую ссылку в браузере кнопкой на плашке сверху, дальше домен будет уходить в браузер. Помогает долгое нажатие на ссылку и выбор открытия в приложении. Реже виноваты редиректы в цепочке перехода или изменившийся файл привязки.
Где должен лежать файл apple-app-site-association?
На том же домене, что указан в Associated Domains, и отдаваться по HTTPS: либо из корня, либо из каталога /.well-known/. Имя файла — без расширения, содержимое — JSON, ответ — код 200 напрямую, без промежуточных редиректов. Если сервер отвечает переадресацией или ошибкой, связка домена с приложением не подтверждается.
Почему правки в файле применяются не сразу?
Система считывает файл привязки при установке или обновлении приложения, а не при каждом переходе по ссылке. На устройствах, где приложение уже стоит, какое-то время действует прежняя версия связки. Поэтому изменения проверяют на чистой установке, а не на телефоне, где приложение живёт с прошлой сборки.
Можно ли поместить Universal Link в QR-код?
Да, и это правильный вариант: в код кладут обычный https-адрес верифицированного домена. У кого приложение установлено, откроется приложение, у остальных — сайт, отдельный код под iOS делать не нужно. Избегать стоит кастомных схем внутри кода и длинных цепочек редиректов через чужие домены.