在 Flutter 應用中接收 Firebase 動態鏈接

要接收您創建的 Firebase 動態鏈接,您必須在應用中包含動態鏈接 SDK,並在應用加載時調用FirebaseDynamicLinks.getDynamicLink()方法以獲取動態鏈接中傳遞的數據。

  1. 如果您尚未安裝並初始化 Flutter 的 Firebase SDK

  2. 在 Flutter 項目的根目錄中,運行以下命令來安裝 Dynamic Links 插件:

    flutter pub add firebase_dynamic_links
    
  3. 如果您正在構建 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 以處理該鏈接。

蘋果平台

  1. 如果您還沒有Apple 開發者帳戶,請創建一個。

  2. 在 Firebase 控制台的項目設置頁面上,確保使用您的 App Store ID 和團隊 ID 正確配置您的 iOS 應用。

  3. 在 Apple Developer 網站上,為您的應用創建一個啟用了關聯域功能的配置文件。

  4. 在 Xcode 中,執行以下操作:

    1. TARGETS標題下打開您的應用程序。

    2. 在 Signing & Capabilities 頁面上,確保您的 Team 已註冊,並且您的 Provisioning Profile 已設置。

    3. 將您在 Firebase 控制台中創建的域添加到關聯域,前綴為applinks:例如, applinks:example.page.link )。

    4. 在信息頁面上,將 URL 類型添加到您的項目。將 URL Schemes 字段設置為您的應用程序的包 ID。 (標識符可以是Bundle ID或任何你想要的。)

    5. 如果您為 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>
      
    6. 可選:禁用動態鏈接 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 返回一個包含PendingDynamicLinkDataStream

FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
  Navigator.pushNamed(context, dynamicLinkData.link.path);
}).onError((error) {
  // Handle errors
});