Получение динамических ссылок Firebase в приложении Flutter

Чтобы получить созданные вами динамические ссылки Firebase, вы должны включить SDK динамических ссылок в свое приложение и вызвать метод FirebaseDynamicLinks.getDynamicLink() при загрузке приложения, чтобы получить данные, переданные в динамической ссылке.

  1. Установите и инициализируйте пакеты Firebase SDK для Flutter , если вы еще этого не сделали.

  2. В корневом каталоге вашего проекта Flutter выполните следующую команду, чтобы установить плагин Dynamic Links:

    flutter pub add firebase_dynamic_links
    
  3. Если вы создаете приложение для Android, откройте страницу настроек проекта в консоли Firebase и убедитесь, что вы указали ключ подписи SHA-1. Если вы используете ссылки на приложения, также укажите свой ключ SHA-256.

Интеграция с платформой

Выполните следующие шаги по интеграции платформы для платформ, для которых вы создаете свое приложение.

Андроид

На Android вы должны добавить новый фильтр намерений, улавливающий глубокие ссылки вашего домена, поскольку динамическая ссылка будет перенаправлять на ваш домен, если ваше приложение установлено. Это необходимо для того, чтобы ваше приложение получало данные Dynamic Link после его установки/обновления из Play Store и нажатия кнопки «Продолжить». В AndroidManifest.xml :

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:host="example.com"
        android:scheme="https"/>
</intent-filter>

Когда пользователи открывают динамическую ссылку с глубокой ссылкой на указанную вами схему и хост, ваше приложение запускает действие с этим фильтром намерений для обработки ссылки.

Платформы Apple

  1. Создайте учетную запись разработчика Apple, если у вас ее еще нет.

  2. На странице настроек проекта консоли Firebase убедитесь, что ваше приложение iOS правильно настроено с вашим идентификатором App Store и Team ID.

  3. На сайте Apple Developer создайте профиль подготовки для своего приложения с включенной функцией «Связанный домен».

  4. В Xcode сделайте следующее:

    1. Откройте свое приложение под заголовком TARGETS .

    2. На странице «Подписание и возможности» убедитесь, что ваша команда зарегистрирована и настроен ваш профиль подготовки.

    3. Добавьте домен, который вы создали в консоли Firebase, в Ассоциированные домены с префиксом applinks: (например, applinks:example.page.link ).

    4. На странице информации добавьте тип URL-адреса в свой проект. В поле Схемы URL укажите идентификатор пакета вашего приложения. (Идентификатор может быть Bundle ID или любым другим по вашему желанию.)

    5. Если вы настроили собственный домен для своего проекта Firebase, добавьте префикс URL-адреса динамической ссылки в файл Info.plist вашего проекта iOS с помощью ключа FirebaseDynamicLinksCustomDomains .

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      <key>FirebaseDynamicLinksCustomDomains</key>
      <array>
          <string>https://custom.domain.io/path1</string>
          <string>https://custom.domain.io/path2</string>
      </array>
      
      ...other settings
      
      </dict>
      </plist>
      
    6. Необязательно: отключите использование SDK Dynamic Links монтажного стола iOS.

      По умолчанию Dynamic Links SDK использует монтажный стол для повышения надежности глубоких ссылок после установки. Используя монтажный стол, динамические ссылки могут гарантировать, что когда пользователь открывает динамическую ссылку, но ему необходимо сначала установить ваше приложение, пользователь может сразу перейти к исходному связанному содержимому при открытии приложения в первый раз после установки.

      Недостатком этого является то, что использование монтажного стола вызывает уведомление на iOS 14 и более поздних версиях. Таким образом, когда пользователи впервые откроют ваше приложение, если монтажный стол содержит URL-адрес динамической ссылки, они увидят уведомление о том, что ваше приложение получило доступ к монтажному столу, что может вызвать путаницу.

      Чтобы отключить это поведение, отредактируйте файл Info.plist вашего проекта Xcode и установите для ключа FirebaseDeepLinkPasteboardRetrievalEnabled значение NO .

Для обработки динамической ссылки в приложении необходимо реализовать два сценария.

Прекращенное состояние

Если приложение завершено, метод FirebaseDynamicLinks.getInitialLink позволяет получить динамическую ссылку, которая открыла приложение.

Это асинхронный запрос, поэтому имеет смысл обрабатывать ссылку перед рендерингом логики приложения, например навигатора. Например, вы можете обработать это в main функции:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseConfig.platformOptions);

  // Get any initial links
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  runApp(MyApp(initialLink));
}

Затем в логике вашего приложения вы можете проверить, была ли обработана ссылка, и выполнить действие, например:

if (initialLink != null) {
  final Uri deepLink = initialLink.link;
  // Example of using the dynamic link to push the user to a different screen
  Navigator.pushNamed(context, deepLink.path);
}

В качестве альтернативы, если вы хотите определить, использовалась ли для открытия приложения конкретная динамическая ссылка, вместо этого передайте ее методу getDynamicLink :

String link = 'https://dynamic-link-domain/ke2Qa';

final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getDynamicLink(Uri.parse(link));

Состояние фона/переднего плана

Пока приложение открыто или работает в фоновом режиме, вы можете прослушивать события Dynamic Links с помощью обработчика потока. Получатель FirebaseDynamicLinks.onLink возвращает Stream , содержащий PendingDynamicLinkData :

FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
  Navigator.pushNamed(context, dynamicLinkData.link.path);
}).onError((error) {
  // Handle errors
});