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

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

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

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

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

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

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

Андроид

На Android необходимо добавить новый фильтр намерений (Intent Filter), который будет перехватывать внешние ссылки вашего домена, поскольку динамическая ссылка будет перенаправлять на ваш домен при установке приложения. Это необходимо для того, чтобы ваше приложение получало данные динамической ссылки после установки/обновления из 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>

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

Следующий шаг — убедиться, что отпечаток SHA-256 сертификата подписи зарегистрирован в консоли Firebase для приложения. Подробнее о получении отпечатка SHA-256 см. на странице «Аутентификация клиента» .

Платформы Apple

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

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

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

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

    1. Откройте приложение под заголовком ЦЕЛИ .

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

    3. На странице «Подписание и возможности» включите «Связанные домены» и добавьте следующее в список «Связанные домены» (замените в примере свой домен):

      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 ссылок на монтажный стол iOS.

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

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

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

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

Завершенное состояние

Настройте следующие методы:

  1. FirebaseDynamicLinks.getInitialLink — возвращает Future<PendingDynamicLinkData?>
  2. FirebaseDynamicLinks.onLink — обработчик событий, который возвращает Stream , содержащий PendingDynamicLinkData?

Android всегда получит ссылку через FirebaseDynamicLinks.getInitialLink из завершённого состояния, но на iOS это не гарантировано. Поэтому стоит настроить оба метода в следующем порядке, чтобы ваше приложение получило ссылку:

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

  // Check if you received the link via `getInitialLink` first
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  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);
  }

  FirebaseDynamicLinks.instance.onLink.listen(
        (pendingDynamicLinkData) {
          // Set up the `onLink` event listener next as it may be received here
          if (pendingDynamicLinkData != null) {
            final Uri deepLink = pendingDynamicLinkData.link;
            // Example of using the dynamic link to push the user to a different screen
            Navigator.pushNamed(context, deepLink.path);
          }
        },
      );

  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);
}

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

Пока приложение открыто или находится в фоновом режиме, используйте метод получения FirebaseDynamicLinks.onLink :

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

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

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

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

Для тестирования динамической ссылки на iOS требуется использовать настоящее устройство. Также потребуется запустить приложение в режиме релиза (например, flutter run --release .), если вы тестируете динамическую ссылку из завершённого состояния приложения (например, после свайпа).