Firebase is back at Google I/O on May 10! Register now

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

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

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

  1. 如果您還沒有安裝並初始化 Firebase SDKs for Flutter ,請執行此操作。

  2. 在 Flutter 項目的根目錄中,運行以下命令來安裝動態鏈接插件:

    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>

當用戶打開包含指向您指定的方案和主機的深層鏈接的動態鏈接時,您的應用程序將使用此 Intent 過濾器啟動 Activity 以處理該鏈接。

下一步是確保簽名證書的 SHA-256 指紋已在應用程序的 Firebase 控制台中註冊。您可以在驗證您的客戶頁面上找到有關如何檢索您的 SHA-256 指紋的更多詳細信息。

蘋果平台

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

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

  3. 在 Apple Developer 站點上,為您的應用程序創建配置文件,並啟用關聯域功能。

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

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

    2. 在 Signing & Capabilities 頁面上,確保您的團隊已註冊,並且您的配置文件已設置。

    3. 在 Signing & Capabilities 頁面上,啟用關聯域並將以下內容添加到關聯域列表(將示例替換為您的域):

      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
});

要在 iOS 上測試動態鏈接,您需要使用實際設備。您還需要在發布模式下運行應用程序(即flutter run --release 。),如果測試來自已終止(即應用程序已關閉)應用程序狀態的動態鏈接。