要接收您創建的 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
});