要接收您创建的 Firebase 动态链接,您必须在应用中包含动态链接 SDK,并在应用加载时调用FirebaseDynamicLinks.getDynamicLink()
方法以获取动态链接中传递的数据。
设置 Firebase 和动态链接 SDK
在 Flutter 项目的根目录中,运行以下命令来安装 Dynamic Links 插件:
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>
当用户打开带有指向您指定的方案和主机的深层链接的动态链接时,您的应用将使用此意图过滤器启动 Activity 以处理该链接。
苹果平台
如果您还没有Apple 开发者帐户,请创建一个。
在 Firebase 控制台的项目设置页面上,确保使用您的 App Store ID 和团队 ID 正确配置您的 iOS 应用。
在 Apple Developer 网站上,为您的应用创建一个启用了关联域功能的配置文件。
在 Xcode 中,执行以下操作:
在TARGETS标题下打开您的应用程序。
在 Signing & Capabilities 页面上,确保您的 Team 已注册,并且您的 Provisioning Profile 已设置。
将您在 Firebase 控制台中创建的域添加到关联域,前缀为
applinks:
例如,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
});