Я — Денис, 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.