如需接收您创建的 Firebase 动态链接,您必须将 Dynamic Links SDK 添加到应用中,并在应用加载时调用 FirebaseDynamicLinks.getDynamicLink()
方法,以获取动态链接中传递的数据。
设置 Firebase 和 Dynamic Links SDK
安装并初始化适用于 Flutter 的 Firebase SDK(如果您尚未这样做)。
从 Flutter 项目的根目录中,运行以下命令来安装 Dynamic Links 插件:
flutter pub add firebase_dynamic_links
如果您要构建 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 平台
创建 Apple 开发者账号(如果您还没有该账号)。
在 Firebase 控制台的项目设置页面上,确保您的 iOS 应用已使用您的 App Store ID 和团队 ID 正确完成了配置。
在 Apple Developer 网站上,为您的应用创建预配配置文件并启用关联网域功能。
在 Xcode 中,执行以下操作:
在 TARGETS(目标)标题下打开您的应用。
在“Signing & Capabilities”(签名和功能)页面上,确保您的团队已完成注册,并且您的预配配置文件已设置。
在“Signing & Capabilities”(签名和功能)页面上,启用 Associated Domains(关联的网域),并将以下内容添加到“Associated Domains”(关联的网域)列表中(请将 example 替换为您的网域):
applinks:example.page.link
在“Info”(信息)页面上,为您的项目添加网址类型。将“URL Schemes”(网址方案)字段设置为您的应用的软件包 ID。“Identifier”(标识符)可以是
Bundle ID
,也可以是您希望使用的任何内容。如果您为 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>
可选:禁止 Dynamic Links SDK 使用 iOS 粘贴板。
默认情况下,Dynamic Links SDK 会使用粘贴板来提升安装后深层链接的可靠性。通过使用粘贴板,Dynamic Links 可以确保当用户打开动态链接但需要先安装您的应用时,可以在安装应用后首次打开应用时立即转到原本链接到的内容。
这样做的缺点是,在 iOS 14 及更高版本的平台上使用粘贴板会触发通知。因此,当用户第一次打开您的应用时,如果粘贴板中包含动态链接网址,他们会看到一条通知,提示您的应用已访问粘贴板,用户可能不理解为什么会收到这条通知。
如需阻止此行为,请修改 Xcode 项目的
Info.plist
文件并将FirebaseDeepLinkPasteboardRetrievalEnabled
键设为NO
。
处理深层链接
如需在您的应用中处理动态链接,您需要实现两种场景。
终止状态
请设置以下方法:
FirebaseDynamicLinks.getInitialLink
- 返回Future<PendingDynamicLinkData?>
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 平台)
如需在 iOS 平台上测试动态链接,您必须使用一台实体设备。如果测试动态链接时,应用处于终止状态(即应用已被滑动关闭),那么您还需要在发布模式下运行该应用(即,需运行 flutter run --release
命令)。