在 Flutter 應用程式中接收 Firebase 動態連結

如要接收您建立的 Firebase 動態連結,您必須在應用程式中加入 Dynamic Links 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

在 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 指紋,請參閱「驗證用戶端」頁面。

Apple 平台

  1. 如果您還沒有 Apple 開發人員帳戶,請建立帳戶

  2. 在 Firebase 主控台的「專案設定」頁面中,確認 iOS 應用程式已正確設定 App Store ID 和團隊 ID。

  3. 在 Apple 開發人員網站上,為應用程式建立佈建設定檔,並啟用「關聯網域」功能。

  4. 在 Xcode 中執行下列操作:

    1. 在「TARGETS」標題下方開啟應用程式。

    2. 在「Signing & Capabilities」頁面,確認團隊已註冊,且已設定佈建設定檔。

    3. 在「簽署與功能」頁面中,啟用「關聯網域」,然後將下列項目新增至「關聯網域」清單 (將範例替換為您的網域):

      applinks:example.page.link
      
    4. 在「資訊」頁面中,為專案新增網址類型。將「URL Schemes」欄位設為應用程式的軟體包 ID。(ID 可以是 Bundle ID 或任何您想要的內容)。

    5. 如果您已為 Firebase 專案設定自訂網域,請使用 FirebaseDynamicLinksCustomDomains 鍵,將 Dynamic Link 網址前置字元新增至 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 剪貼簿。

      根據預設,Dynamic Links SDK 會使用剪貼簿,提高安裝後深層連結的可靠性。透過剪貼簿,Dynamic Links 可確保使用者開啟動態連結時,即使必須先安裝應用程式,安裝完成後首次開啟應用程式時,也能立即前往原始連結內容。

      但缺點是,在 iOS 14 以上版本中,使用剪貼簿會觸發通知。因此,使用者首次開啟應用程式時,如果剪貼簿含有 Dynamic Link 網址,系統會顯示應用程式存取剪貼簿的通知,這可能會造成混淆。

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

如要在應用程式中處理動態連結,必須實作兩種情境。

終止狀態

設定下列方法:

  1. FirebaseDynamicLinks.getInitialLink - 傳回 Future<PendingDynamicLinkData?>
  2. FirebaseDynamicLinks.onLink - 事件處理常式,會傳回包含 PendingDynamicLinkData?Stream

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) 執行應用程式。