Альтернатива Firebase Dynamic Links на KMP

от автора

Я — Денис, KMP-разработчик в «Black Bricks». В этой статье я коротко расскажу как реализовал функционал Firebase Dynamic Links своими силами в KMP.

Сразу оговорюсь, что:

  1. не претендую, что это хорошее решение;

  2. предполагаю, что вы знакомы с 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *