要接收您创建的 Firebase 动态链接,您必须在您的应用中包含动态链接 SDK,并在您的应用加载时调用FirebaseDynamicLinks.getDynamicLink()
方法以获取动态链接中传递的数据。
设置 Firebase 和动态链接 SDK
如果您还没有安装并初始化 Firebase SDKs for Flutter ,请执行此操作。
在 Flutter 项目的根目录中,运行以下命令来安装动态链接插件:
flutter pub add firebase_dynamic_links
如果您正在构建 Android 应用程序,请打开 Firebase 控制台的项目设置页面并确保您已指定 SHA-1 签名密钥。如果您使用 App Links,还请指定您的 SHA-256 密钥。
平台整合
针对您为其构建应用程序的平台完成以下平台集成步骤。
安卓
在 Android 上,您必须添加一个新的意图过滤器来捕获您域的深层链接,因为如果安装了您的应用程序,动态链接将重定向到您的域。这是您的应用在从 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 以处理该链接。
下一步是确保签名证书的 SHA-256 指纹已在应用程序的 Firebase 控制台中注册。您可以在验证您的客户页面上找到有关如何检索您的 SHA-256 指纹的更多详细信息。
苹果平台
如果您还没有Apple 开发者帐户,请创建一个。
在 Firebase 控制台的项目设置页面上,确保您的 iOS 应用程序正确配置了您的 App Store ID 和团队 ID。
在 Apple Developer 站点上,为您的应用程序创建配置文件,并启用关联域功能。
在 Xcode 中,执行以下操作:
在TARGETS标题下打开您的应用程序。
在 Signing & Capabilities 页面上,确保您的团队已注册,并且您的配置文件已设置。
在 Signing & Capabilities 页面上,启用关联域并将以下内容添加到关联域列表(将示例替换为您的域):
applinks:example.page.link
在“信息”页面上,将 URL 类型添加到您的项目。将 URL Schemes 字段设置为您应用程序的包 ID。 (标识符可以是
Bundle ID
或任何你想要的。)如果您为 Firebase 项目设置了自定义域,请使用
FirebaseDynamicLinksCustomDomains
键将动态链接 URL 前缀添加到 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>
可选:禁用动态链接 SDK 对 iOS 粘贴板的使用。
默认情况下,动态链接 SDK 使用粘贴板来提高安装后深层链接的可靠性。通过使用粘贴板,动态链接可以确保当用户打开动态链接但需要先安装您的应用时,用户在安装后首次打开应用时可以立即转到原始链接内容。
这样做的缺点是使用粘贴板会在 iOS 14 及更高版本上触发通知。因此,用户第一次打开您的应用时,如果粘贴板包含动态链接 URL,他们将看到一条通知,告知您的应用访问了粘贴板,这可能会造成混淆。
要禁用此行为,请编辑 Xcode 项目的
Info.plist
文件并将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));
背景/前景状态
当应用程序打开或在后台时,您可以使用流处理程序收听动态链接事件。 FirebaseDynamicLinks.onLink
getter 返回一个包含PendingDynamicLinkData
的Stream
:
FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
Navigator.pushNamed(context, dynamicLinkData.link.path);
}).onError((error) {
// Handle errors
});
在 iOS 平台上测试动态链接
要在 iOS 上测试动态链接,您需要使用实际设备。您还需要在发布模式下运行应用程序(即flutter run --release
。),如果测试来自已终止(即应用程序已关闭)应用程序状态的动态链接。