要接收您创建的 Firebase 动态链接,您必须在您的应用中包含动态链接 SDK,并在您的应用加载时调用handleUniversalLink:
和 dynamicLinkFromCustomSchemeURL dynamicLinkFromCustomSchemeURL:
方法以获取动态链接中传递的数据。
先决条件
在开始之前,请确保将 Firebase 添加到您的 iOS 项目中。
设置 Firebase 和动态链接 SDK
使用 Swift Package Manager 安装和管理 Firebase 依赖项。
- 在 Xcode 中,打开您的应用程序项目,导航至File > Add Packages 。
- 出现提示时,添加 Firebase Apple 平台 SDK 存储库:
- 选择动态链接库。
- 为了获得动态链接的最佳体验,我们建议在您的 Firebase 项目中启用 Google Analytics ,并将适用于 Google Analytics 的 Firebase SDK 添加到您的应用程序中。您可以选择没有 IDFA 集合或有 IDFA 集合的库。
- 完成后,Xcode 将自动开始在后台解析和下载您的依赖项。
https://github.com/firebase/firebase-ios-sdk
现在,执行一些配置步骤:
- 在Firebase 控制台中,打开动态链接部分。如果系统提示您接受服务条款,请接受。
确保您的应用程序的 App Store ID 和您的应用程序 ID 前缀已在您的应用程序设置中指定。要查看和编辑您应用的设置,请转到您的 Firebase 项目的设置页面并选择您的 iOS 应用。
您可以打开以下网址,确认您的 Firebase 项目已正确配置为在您的 iOS 应用程序中使用动态链接:
https://your_dynamic_links_domain/apple-app-site-association
如果您的应用程序已连接,
apple-app-site-association
文件将包含对您应用程序的应用程序 ID 前缀和包 ID 的引用。例如:{"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["NOT /_/*","/*"]}]}}
如果
details
字段为空,请仔细检查您是否指定了 App ID 前缀。请注意,您的 App ID 前缀可能与您的团队 ID 不同。可选:禁用动态链接 SDK 对 iOS 粘贴板的使用。
默认情况下,动态链接 SDK 使用粘贴板来提高安装后深层链接的可靠性。通过使用粘贴板,动态链接可以确保当用户打开动态链接但需要先安装您的应用时,用户在安装后首次打开应用时可以立即转到原始链接内容。
这样做的缺点是使用粘贴板会在 iOS 14 及更高版本上触发通知。因此,用户第一次打开您的应用程序时,如果粘贴板包含 URL,他们将看到一条通知,表明您的应用程序访问了粘贴板,这可能会造成混淆。
要禁用此行为,请编辑 Xcode 项目的
Info.plist
文件并将FirebaseDeepLinkPasteboardRetrievalEnabled
键设置为NO
。
在您的应用中打开动态链接
- 在您应用的 Xcode 项目的信息选项卡中,创建一个新的 URL 类型以用于动态链接。将标识符字段设置为唯一值,并将URL 方案字段设置为您的包标识符,这是动态链接使用的默认 URL 方案。
- 在应用的 Xcode 项目的功能选项卡中,启用关联域并将以下内容添加到关联域列表:
applinks:your_dynamic_links_domain
- 如果您想接收具有完全自定义域的动态链接,请在您的 Xcode 项目的
Info.plist
文件中创建一个名为FirebaseDynamicLinksCustomDomains
的键并将其设置为您应用的动态链接 URL 前缀。例如:FirebaseDynamicLinksCustomDomains https://example.com/promos https://example.com/links/share - 在您的
UIApplicationDelegate
中导入FirebaseCore
模块,以及您的应用委托使用的任何其他Firebase 模块。例如,要使用 Cloud Firestore 和身份验证:斯威夫特用户界面
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
迅速
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
目标-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- 在您的应用委托的
application(_:didFinishLaunchingWithOptions:)
方法中配置一个FirebaseApp
共享实例:斯威夫特用户界面
// Use Firebase library to configure APIs FirebaseApp.configure()
迅速
// Use Firebase library to configure APIs FirebaseApp.configure()
目标-C
// Use Firebase library to configure APIs [FIRApp configure];
- 如果您使用的是 SwiftUI,则必须创建一个应用程序委托并通过
UIApplicationDelegateAdaptor
或NSApplicationDelegateAdaptor
将其附加到您的App
结构。您还必须禁用应用委托调配。有关详细信息,请参阅SwiftUI 说明。斯威夫特用户界面
@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } }
- 接下来,在
application:continueUserActivity:restorationHandler:
方法中,处理已安装应用程序时收到的作为通用链接的链接:迅速
注意:此产品不适用于 macOS、Mac Catalyst、tvOS 或 watchOS 目标。func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { let handled = DynamicLinks.dynamicLinks() .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in // ... } return handled }
目标-C
注意:此产品不适用于 macOS、Mac Catalyst、tvOS 或 watchOS 目标。- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler: #if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0) (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler { #else (nonnull void (^)(NSArray *_Nullable))restorationHandler { #endif // __IPHONE_12_0 BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL completion:^(FIRDynamicLink * _Nullable dynamicLink, NSError * _Nullable error) { // ... }]; return handled; }
- 最后,在
application:openURL:options:
处理通过应用的自定义 URL 方案接收的链接。当您的应用程序在安装后首次打开时调用此方法。如果在您的应用首次启动时未找到动态链接,将调用此方法并将
DynamicLink
的url
设置为nil
,表明 SDK 未能找到匹配的待处理动态链接。迅速
注意:此产品不适用于 macOS、Mac Catalyst、tvOS 或 watchOS 目标。@available(iOS 9.0, *) func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool { return application(app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey .sourceApplication] as? String, annotation: "") } func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) { // Handle the deep link. For example, show the deep-linked content or // apply a promotional offer to the user's account. // ... return true } return false }
目标-C
注意:此产品不适用于 macOS、Mac Catalyst、tvOS 或 watchOS 目标。- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options { return [self application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url]; if (dynamicLink) { if (dynamicLink.url) { // Handle the deep link. For example, show the deep-linked content, // apply a promotional offer to the user's account or show customized onboarding view. // ... } else { // Dynamic link has empty deep link. This situation will happens if // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link, // but pending link is not available for this device/App combination. // At this point you may display default onboarding view. } return YES; } return NO; }
要接收您创建的 Firebase 动态链接,您必须在您的应用中包含动态链接 SDK,并在您的应用加载时调用handleUniversalLink:
和 dynamicLinkFromCustomSchemeURL dynamicLinkFromCustomSchemeURL:
方法以获取动态链接中传递的数据。
先决条件
在开始之前,请确保将 Firebase 添加到您的 iOS 项目中。
设置 Firebase 和动态链接 SDK
使用 Swift Package Manager 安装和管理 Firebase 依赖项。
- 在 Xcode 中,打开您的应用程序项目,导航至File > Add Packages 。
- 出现提示时,添加 Firebase Apple 平台 SDK 存储库:
- 选择动态链接库。
- 为了获得动态链接的最佳体验,我们建议在您的 Firebase 项目中启用 Google Analytics ,并将适用于 Google Analytics 的 Firebase SDK 添加到您的应用程序中。您可以选择没有 IDFA 集合或有 IDFA 集合的库。
- 完成后,Xcode 将自动开始在后台解析和下载您的依赖项。
https://github.com/firebase/firebase-ios-sdk
现在,执行一些配置步骤:
- 在Firebase 控制台中,打开动态链接部分。如果系统提示您接受服务条款,请接受。
确保您的应用程序的 App Store ID 和您的应用程序 ID 前缀已在您的应用程序设置中指定。要查看和编辑您应用的设置,请转到您的 Firebase 项目的设置页面并选择您的 iOS 应用。
您可以打开以下网址,确认您的 Firebase 项目已正确配置为在您的 iOS 应用程序中使用动态链接:
https://your_dynamic_links_domain/apple-app-site-association
如果您的应用程序已连接,
apple-app-site-association
文件将包含对您应用程序的应用程序 ID 前缀和包 ID 的引用。例如:{"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["NOT /_/*","/*"]}]}}
如果
details
字段为空,请仔细检查您是否指定了 App ID 前缀。请注意,您的 App ID 前缀可能与您的团队 ID 不同。可选:禁用动态链接 SDK 对 iOS 粘贴板的使用。
默认情况下,动态链接 SDK 使用粘贴板来提高安装后深层链接的可靠性。通过使用粘贴板,动态链接可以确保当用户打开动态链接但需要先安装您的应用时,用户在安装后首次打开应用时可以立即转到原始链接内容。
这样做的缺点是使用粘贴板会在 iOS 14 及更高版本上触发通知。因此,用户第一次打开您的应用程序时,如果粘贴板包含 URL,他们将看到一条通知,表明您的应用程序访问了粘贴板,这可能会造成混淆。
要禁用此行为,请编辑 Xcode 项目的
Info.plist
文件并将FirebaseDeepLinkPasteboardRetrievalEnabled
键设置为NO
。
在您的应用中打开动态链接
- 在您应用的 Xcode 项目的信息选项卡中,创建一个新的 URL 类型以用于动态链接。将标识符字段设置为唯一值,并将URL 方案字段设置为您的包标识符,这是动态链接使用的默认 URL 方案。
- 在应用的 Xcode 项目的功能选项卡中,启用关联域并将以下内容添加到关联域列表:
applinks:your_dynamic_links_domain
- 如果您想接收具有完全自定义域的动态链接,请在您的 Xcode 项目的
Info.plist
文件中创建一个名为FirebaseDynamicLinksCustomDomains
的键并将其设置为您应用的动态链接 URL 前缀。例如:FirebaseDynamicLinksCustomDomains https://example.com/promos https://example.com/links/share - 在您的
UIApplicationDelegate
中导入FirebaseCore
模块,以及您的应用委托使用的任何其他Firebase 模块。例如,要使用 Cloud Firestore 和身份验证:斯威夫特用户界面
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
迅速
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
目标-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- 在您的应用委托的
application(_:didFinishLaunchingWithOptions:)
方法中配置一个FirebaseApp
共享实例:斯威夫特用户界面
// Use Firebase library to configure APIs FirebaseApp.configure()
迅速
// Use Firebase library to configure APIs FirebaseApp.configure()
目标-C
// Use Firebase library to configure APIs [FIRApp configure];
- 如果您使用的是 SwiftUI,则必须创建一个应用程序委托并通过
UIApplicationDelegateAdaptor
或NSApplicationDelegateAdaptor
将其附加到您的App
结构。您还必须禁用应用委托调配。有关详细信息,请参阅SwiftUI 说明。斯威夫特用户界面
@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } }
- 接下来,在
application:continueUserActivity:restorationHandler:
方法中,处理已安装应用程序时收到的作为通用链接的链接:迅速
注意:此产品不适用于 macOS、Mac Catalyst、tvOS 或 watchOS 目标。func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { let handled = DynamicLinks.dynamicLinks() .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in // ... } return handled }
目标-C
注意:此产品不适用于 macOS、Mac Catalyst、tvOS 或 watchOS 目标。- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler: #if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0) (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler { #else (nonnull void (^)(NSArray *_Nullable))restorationHandler { #endif // __IPHONE_12_0 BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL completion:^(FIRDynamicLink * _Nullable dynamicLink, NSError * _Nullable error) { // ... }]; return handled; }
- 最后,在
application:openURL:options:
处理通过应用的自定义 URL 方案接收的链接。当您的应用程序在安装后首次打开时调用此方法。如果在您的应用首次启动时未找到动态链接,将调用此方法并将
DynamicLink
的url
设置为nil
,表示 SDK 未能找到匹配的待处理动态链接。迅速
注意:此产品不适用于 macOS、Mac Catalyst、tvOS 或 watchOS 目标。@available(iOS 9.0, *) func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool { return application(app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey .sourceApplication] as? String, annotation: "") } func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) { // Handle the deep link. For example, show the deep-linked content or // apply a promotional offer to the user's account. // ... return true } return false }
目标-C
注意:此产品不适用于 macOS、Mac Catalyst、tvOS 或 watchOS 目标。- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options { return [self application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url]; if (dynamicLink) { if (dynamicLink.url) { // Handle the deep link. For example, show the deep-linked content, // apply a promotional offer to the user's account or show customized onboarding view. // ... } else { // Dynamic link has empty deep link. This situation will happens if // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link, // but pending link is not available for this device/App combination. // At this point you may display default onboarding view. } return YES; } return NO; }