Я — Денис, KMP-разработчик в «Black Bricks». В этой статье я коротко расскажу как реализовал функционал Firebase Dynamic Links своими силами в KMP.
Сразу оговорюсь, что:
-
не претендую, что это хорошее решение;
-
предполагаю, что вы знакомы с Dynamic Links.
Firebase Dynamic Links deprecated
Популярный сервис для работы с Dynamic Links от Firebase – deprecated. Теперь его больше невозможно добавить в существующий проект. По этому случаю, Firebase в документации предлагает ряд альтернативных сервисов и нативных решений.
Современные расценки на сервисы отбивают всякое желание их использовать. Я придумал объединить несколько решений в одно.
Доверенный источник ссылок
Начнём с создания «доверенного источника» ссылок. Это может быть ваш сервер, Firebase, Github Pages или любой другой ресурс, обеспечивающий круглосуточный доступ.
Независимо от того, что вы выбрали – для хранения файла, создадим директорию, так чтобы путь до неё выглядел так: /.well-known/assetlinks.json
.
Можно воспользоваться App Links Assistant в Android Studio. Она автоматически создаст файл assetlinks.json
.
[ { "relation": [ "delegate_permission/common.handle_all_urls" ], "target": { "namespace": "android_app", "package_name": "имя пакета", "sha256_cert_fingerprints": [ "ключ" ] } } ]
Для iOS это — apple-app-site-association
. Обратите внимание, что расширение у файла нет. В нём помимо appId, важно указать как вы будете работать с параметрами ссылки.
{ "applinks": { "details": [ { "appIDs": [ "appID ios", "appID macOS", ], "components": [ { "/": "/параметр_отправки*", "comment": "" }, { "?": { "первый_параметр": "*", "второй_параметр": "*" }, "comment": "" } ] } ] }, "webcredentials": { "apps": [ "appID ios", "appID macOS", ] } }
Считывание ссылок в Android Manifest
Указываем имя хоста и параметры, которые хотим передать в ссылке.
<intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" /> <data android:host="ваш хост" /> <data android:pathPattern="параметр" /> </intent-filter>
Считывание ссылок в iOS
<key>com.apple.developer.associated-domains</key> <array> <string>applinks:имя хоста</string> <string>webcredentials:имя хоста</string> </array>
Редирект
Нужно организовать флоу редиректа в Google Play и AppStore в случае, если приложение не установлено. После таймаута, если переход из ссылки не произошел, то перекидываем пользователя в стор.
app.get('/параметр', (req, res) => { const linkToGooglePlay = ""; const linkToAppStore = ""; const linkToWindows = ""; const linkToMacOS = ""; const userAgent = req.headers['user-agent'] || ''; setTimeout(() => { if (/android/i.test(userAgent)) { res.redirect(linkToGooglePlay); } else if (/iphone|ipad/i.test(userAgent)) { res.redirect(linkToAppStore); } }, 1000); });
Реализация на Desktop
Ситуация здесь немного сложнее из-за специфики ОС. У нас есть со-программа, которая слушает сокет. Когда пользователь нажимает на ссылку, программа записывает специальный файл в локальную БД. Если приложение закрыто, со-программа пробуждает его. После файл парсится и параметры извлекаются из ссылки, а сам файл удаляется.
Спасибо за чтение!

Денис Попков
KMP разработчик в «Black Bricks»
Если вы нашли неточности/ошибки в статье или просто хотите дополнить её своим мнением — то прошу в комментарии! Или можете написать мне в Telegram.
ссылка на оригинал статьи https://habr.com/ru/articles/864708/
Добавить комментарий