要接收您創建的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
- 返回一個Future<PendingDynamicLinkData?>
-
FirebaseDynamicLinks.onLink
- 返回包含 PendingDynamicLinkData 的Stream
的事件處理程序PendingDynamicLinkData?
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
。),如果測試來自已終止(即應用程序已關閉)應用程序狀態的動態鏈接。