在 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 簽章金鑰。如果您使用應用程式鏈接,也請指定您的 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>

當使用者開啟包含指向您指定的方案和主機的深層連結的動態連結時,您的應用程式將使用此意圖過濾器啟動活動來處理該連結。

下一步是確保簽署憑證的 SHA-256 指紋已在已套用的 Firebase 控制台中註冊。您可以在驗證您的用戶端頁面上找到有關如何檢索 SHA-256 指紋的更多詳細資訊。

蘋果平台

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

  2. 在 Firebase 控制台的專案設定頁面上,請確保您的 iOS 應用程式已使用您的 App Store ID 和團隊 ID 正確配置。

  3. 在 Apple 開發人員網站上,為您的應用程式建立一個啟用關聯網域功能的設定檔。

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

    1. TARGETS標題下開啟您的應用程式。

    2. 在「簽名和功能」頁面上,請確保您的團隊已註冊,並且您的設定檔已設定。

    3. 在「簽章與功能」頁面上,啟用關聯網域並將下列內容新增至關聯網域清單(將範例取代為您的網域):

      applinks:example.page.link
      
    4. 在「資訊」頁面上,將 URL 類型新增至您的專案。將 URL 方案欄位設定為應用程式的捆綁包 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. 可選:停用 Dynamic Links SDK 對 iOS 貼簿的使用。

      預設情況下,動態連結 SDK 使用貼上板來提高安裝後深層連結的可靠性。透過使用貼上板,動態連結可以確保當用戶打開動態連結但需要先安裝您的應用程式時,用戶在安裝後首次打開應用程式時可以立即轉到原始連結內容。

      這樣做的缺點是使用黏貼簿會在 iOS 14 及更高版本上觸發通知。因此,當用戶第一次打開您的應用程式時,如果貼上包含動態連結 URL,他們將看到您的應用程式訪問貼上的通知,這可能會導致混亂。

      若要停用此行為,請編輯 Xcode 專案的Info.plist檔案並將FirebaseDeepLinkPasteboardRetrievalEnabled鍵設為NO

要在應用程式中處理動態鏈接,需要實現兩個場景。

終止狀態

設定以下方法:

  1. FirebaseDynamicLinks.getInitialLink - 回傳Future<PendingDynamicLinkData?>
  2. 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 上測試動態鏈接,需要使用實際裝置。如果從終止(即應用程式已關閉)應用程式狀態測試動態鏈接,您還需要在發布模式下運行應用程式(即flutter run --release 。)。