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

如要接收您建立的 Firebase Dynamic Links,您必須在應用程式中加入 Dynamic Links SDK,並在應用程式載入時呼叫 FirebaseDynamicLinks.getDynamicLink() 方法,才能透過 Dynamic Link 取得資料。

  1. 如果您尚未安裝並初始化 Flutter 專用的 Firebase SDK,請先完成安裝。

  2. 在 Flutter 專案的根目錄中執行下列指令,安裝 Dynamic Links 外掛程式:

    flutter pub add firebase_dynamic_links
    
  3. 如果您正在建構 Android 應用程式,請開啟 Firebase 控制台的「Project settings」(專案設定) 頁面,並確認您已指定 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>

當使用者開啟含有您指定配置和主機深層連結的動態連結時,應用程式就會使用這個意圖篩選器啟動活動,以便處理該連結。

下一步是確保已在 Firebase 控制台中為應用程式註冊簽署憑證的 SHA-256 指紋。如要進一步瞭解如何擷取 SHA-256 指紋,請參閱「驗證用戶端」頁面。

Apple 平台

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

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

  3. 在 Apple Developer 網站上,為已啟用關聯網域功能的應用程式建立佈建設定檔。

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

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

    2. 在「簽署與功能」頁面中,確認您的團隊已完成註冊,且佈建設定檔已設定完成。

    3. 在「Signing & Capabilities」(簽署與能力) 頁面上,啟用「Associated Domains」,並將下列內容新增至關聯網域清單 (請將此範例替換為您的網域):

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

    5. 如果您已為 Firebase 專案設定自訂網域,請使用 FirebaseDynamicLinksCustomDomains 鍵將動態連結網址前置字串新增至 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 會使用貼上板提高安裝後深層連結的可靠性。藉由使用貼上板,動態連結可確保當使用者開啟動態連結,但需要先安裝應用程式時,使用者可以在安裝後第一次開啟應用程式時,立即導向原始連結內容。

      這樣做的缺點是,使用貼上板會在 iOS 14 以上版本中觸發通知。因此,當使用者首次開啟應用程式時,如果貼上板含有動態連結網址,系統會顯示通知,指出您的應用程式已存取剪貼簿,進而造成混淆。

      如要停用這項行為,請編輯 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) 中執行應用程式。