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

Комментарии (0)