接收 Firebase 动态链接(Flutter 应用)

如需接收您创建的 Firebase 动态链接,您必须将 Dynamic Links SDK 添加到应用中,并在应用加载时调用 FirebaseDynamicLinks.getDynamicLink() 方法,以获取动态链接中传递的数据。

  1. 安装并初始化适用于 Flutter 的 Firebase SDK(如果您尚未这样做)。

  2. 从 Flutter 项目的根目录中,运行以下命令来安装 Dynamic Links 插件:

    flutter pub add firebase_dynamic_links
    
  3. 如果您要构建 Android 应用,请打开 Firebase 控制台的项目设置页面,并确保您已指定 SHA-1 签名密钥。如果您使用 App Links,还需要指定 SHA-256 密钥。

平台集成

针对您要为其构建应用的平台,完成以下平台集成步骤。

Android

在 Android 上,您必须添加一个新的 intent 过滤器来捕获您的网域的深层链接,因为如果用户安装了您的应用,那么动态链接将会重定向到您的网域。在用户从 Play 商店安装/更新了您的应用并点按“继续”按钮后,若要让应用能收到动态链接数据,则必须执行此操作。在 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>

当用户打开动态链接(该链接包含指向您指定的方案和主机的深层链接)时,您的应用将会启动包含此 intent 过滤器的 Activity 来处理该链接。

下一步是确保在 Firebase 控制台中为应用注册签名证书的 SHA-256 指纹。如需详细了解如何检索 SHA-256 指纹,请参阅对客户端进行身份验证页面。

Apple 平台

  1. 创建 Apple 开发者账号(如果您还没有该账号)。

  2. 在 Firebase 控制台的项目设置页面上,确保您的 iOS 应用已使用您的 App Store ID 和团队 ID 正确完成了配置。

  3. 在 Apple Developer 网站上,为您的应用创建预配配置文件并启用关联网域功能。

  4. 在 Xcode 中,执行以下操作:

    1. TARGETS(目标)标题下打开您的应用。

    2. 在“Signing & Capabilities”(签名和功能)页面上,确保您的团队已完成注册,并且您的预配配置文件已设置。

    3. 在“Signing & Capabilities”(签名和功能)页面上,启用 Associated Domains(关联的网域),并将以下内容添加到“Associated Domains”(关联的网域)列表中(请将 example 替换为您的网域):

      applinks:example.page.link
      
    4. 在“Info”(信息)页面上,为您的项目添加网址类型。将“URL Schemes”(网址方案)字段设置为您的应用的软件包 ID。“Identifier”(标识符)可以是 Bundle ID,也可以是您希望使用的任何内容。

    5. 如果您为 Firebase 项目设置了自定义网域,请使用 FirebaseDynamicLinksCustomDomains 键将动态链接网址前缀添加到 iOS 项目的 Info.plist 文件中。

      <?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. 可选:禁止 Dynamic Links SDK 使用 iOS 粘贴板。

      默认情况下,Dynamic Links SDK 会使用粘贴板来提升安装后深层链接的可靠性。通过使用粘贴板,Dynamic Links 可以确保当用户打开动态链接但需要先安装您的应用时,可以在安装应用后首次打开应用时立即转到原本链接到的内容。

      这样做的缺点是,在 iOS 14 及更高版本的平台上使用粘贴板会触发通知。因此,当用户第一次打开您的应用时,如果粘贴板中包含动态链接网址,他们会看到一条通知,提示您的应用已访问粘贴板,用户可能不理解为什么会收到这条通知。

      如需阻止此行为,请修改 Xcode 项目的 Info.plist 文件并将 FirebaseDeepLinkPasteboardRetrievalEnabled 键设为 NO

如需在您的应用中处理动态链接,您需要实现两种场景。

终止状态

请设置以下方法:

  1. FirebaseDynamicLinks.getInitialLink - 返回 Future<PendingDynamicLinkData?>
  2. FirebaseDynamicLinks.onLink - 事件处理脚本,返回包含 PendingDynamicLinkData?Stream

在有终止状态发生时,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 getter 方法来接收链接:

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 命令)。