如要接收您建立的 Firebase 動態連結,您必須在應用程式中加入 Dynamic Links SDK,並在應用程式載入時呼叫 FirebaseDynamicLinks.getDynamicLink()
方法,取得動態連結中傳遞的資料。
設定 Firebase 和 Dynamic Links SDK
如果尚未安裝並初始化 Flutter 適用的 Firebase SDK,請先完成這項操作。
在 Flutter 專案的根目錄中,執行下列指令來安裝 Dynamic Links 外掛程式:
flutter pub add firebase_dynamic_links
如果您要建構 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 平台
如果您還沒有 Apple 開發人員帳戶,請建立帳戶。
在 Firebase 主控台的「專案設定」頁面中,確認 iOS 應用程式已正確設定 App Store ID 和團隊 ID。
在 Apple 開發人員網站上,為應用程式建立佈建設定檔,並啟用「關聯網域」功能。
在 Xcode 中執行下列操作:
在「TARGETS」標題下方開啟應用程式。
在「Signing & Capabilities」頁面,確認團隊已註冊,且已設定佈建設定檔。
在「簽署與功能」頁面中,啟用「關聯網域」,然後將下列項目新增至「關聯網域」清單 (將範例替換為您的網域):
applinks:example.page.link
在「資訊」頁面中,為專案新增網址類型。將「URL Schemes」欄位設為應用程式的軟體包 ID。(ID 可以是
Bundle ID
或任何您想要的內容)。如果您已為 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>
選用:禁止 Dynamic Links SDK 使用 iOS 剪貼簿。
根據預設,Dynamic Links SDK 會使用剪貼簿,提高安裝後深層連結的可靠性。透過剪貼簿,Dynamic Links 可確保使用者開啟動態連結時,即使必須先安裝應用程式,安裝完成後首次開啟應用程式時,也能立即前往原始連結內容。
但缺點是,在 iOS 14 以上版本中,使用剪貼簿會觸發通知。因此,使用者首次開啟應用程式時,如果剪貼簿含有 Dynamic Link 網址,系統會顯示應用程式存取剪貼簿的通知,這可能會造成混淆。
如要停用這項行為,請編輯 Xcode 專案的
Info.plist
檔案,並將FirebaseDeepLinkPasteboardRetrievalEnabled
鍵設為NO
。
處理深層連結
如要在應用程式中處理動態連結,必須實作兩種情境。
終止狀態
設定下列方法:
FirebaseDynamicLinks.getInitialLink
- 傳回Future<PendingDynamicLinkData?>
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 平台上測試動態連結
如要在 iOS 上測試動態連結,必須使用實際裝置。如果從已終止 (即應用程式已滑動關閉) 的應用程式狀態測試動態連結,您也需要以發布模式 (即 flutter run --release
) 執行應用程式。