如需接收您创建的 Firebase Dynamic Links 动态链接,您必须将 Dynamic Links SDK 添加到应用中,并在应用加载时调用 handleUniversalLink:
和 dynamicLinkFromCustomSchemeURL:
方法,以获取动态链接中传递的数据。
前提条件
Firebase 动态链接要求使用 iOS 8 或更高版本。您可以在应用中将 iOS 7 定为目标,但如果应用不是在 iOS 8 或更高版本中运行,则对 Firebase Dynamic Links SDK 的所有调用都不会起作用。
设置 Firebase 和 Dynamic Links SDK
- 将 Firebase 添加到您的 iOS 项目。
在您的
Podfile
中添加以下 pod:pod 'Firebase/Analytics' pod 'Firebase/DynamicLinks'
- 运行
pod install
并打开创建的.xcworkspace
文件。 - 在 Firebase 控制台中,打开动态链接部分。如有提示,请接受服务条款。
-
确保已在您的应用的设置中指定应用的 App Store ID 和应用 ID 前缀。要查看和修改应用的设置,请转到 Firebase 项目的“设置”页面,然后选择您的 iOS 应用。
您可以打开下面的网址,确认您的 Firebase 项目已正确配置为在 iOS 应用中使用动态链接:
https://your_dynamic_links_domain/apple-app-site-association
如果您的应用已关联,则
apple-app-site-association
文件中包含对应用的 App ID 前缀和软件包 ID 的引用。例如:{"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["/*"]}]}}
如果
details
字段为空,请仔细检查您是否指定了应用 ID 前缀。请注意,应用 ID 前缀可能与团队 ID 不同。 -
可选:禁止 Dynamic Links SDK 使用 iOS 粘贴板。
默认情况下,Dynamic Links SDK 使用粘贴板来提升安装后深层链接的可靠性。通过使用粘贴板,Dynamic Links 可以确保当用户打开动态链接但需要先安装您的应用时,可以在安装应用后首次打开应用时立即转到原本链接到的内容。
这样做的缺点是,在 iOS 14 及更高版本的平台上使用粘贴板会触发通知。因此,当用户第一次打开您的应用时,如果粘贴板中包含动态链接网址,他们会看到一条通知,提示您的应用已访问粘贴板,这可能会引起混淆。
要阻止此行为,请修改 Xcode 项目的
Info.plist
文件并将FirebaseDeepLinkPasteboardRetrievalEnabled
键设为NO
。
在您的应用中打开动态链接
- 在应用的 Xcode 项目的 Info 标签中,创建一个新的网址类型以用于动态链接。将 Identifier 字段设为一个唯一的值,将 URL scheme 字段设为软件包标识符,即动态链接使用的默认网址架构。
- 在应用的 Xcode 项目的功能 (Capabilities) 标签页中,启用 Associated Domains,并将以下内容添加到相关网域 (Associated Domains) 列表中:
applinks:your_dynamic_links_domain
- 如果您想要接收带有完全自定义域名的 Dynamic Links 动态链接,请在 Xcode 项目的
Info.plist
文件中,创建一个名为FirebaseDynamicLinksCustomDomains
的键,并将其设置为应用的动态链接网址前缀。例如:FirebaseDynamicLinksCustomDomains https://example.com/promos https://example.com/links/share - 在
UIApplicationDelegate
中导入 Firebase 模块:Swift
import Firebase
Objective-C
@import Firebase;
- 配置一个
FirebaseApp
共享实例(通常在应用的application:didFinishLaunchingWithOptions:
方法中配置):Swift
// Use Firebase library to configure APIs FirebaseApp.configure()
Objective-C
// Use Firebase library to configure APIs [FIRApp configure];
- 如果已经(在 iOS 9 及更高版本上)安装了应用,则接下来在
application:continueUserActivity:restorationHandler:
方法中处理收到的通用链接形式的链接:Swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in // ... } return handled }
Objective-C
- (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:sourceApplication:annotation:
(iOS 8 及更早版本)和application:openURL:options:
(iOS 9 及更高版本)方法中,处理通过应用的自定义网址架构接收的链接。 当您的应用在 iOS 8 及以下版本上接收链接时,以及在安装到任何 iOS 版本上后首次被打开时,都会调用这些方法。如果在您的应用(在任何 iOS 版本上)首次启动时未找到动态链接,系统在调用此方法时会将
FIRDynamicLink
的url
设置为nil
,以表明 SDK 未找到匹配的待处理动态链接。Swift
@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 }
Objective-C
- (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; }