求助:Firebase动态链接在iOS<=9首次安装时无法正常工作
我之前也碰到过几乎一模一样的问题,折腾了好久才梳理出几个关键的修复点,你可以逐一排查:
1. iOS 8 专属:启动时主动拉取动态链接
iOS 8 系统下,从 App Store 首次安装并启动应用后,系统不会自动把动态链接的参数通过代理方法传递过来,这时候必须主动触发拉取:
在 application:didFinishLaunchingWithOptions: 里,完成 Firebase 初始化后,立即调用:
[[FIRDynamicLinks dynamicLinks] fetchDynamicLinksWithCompletionHandler:^(NSArray<FIRDynamicLink *> * _Nullable dynamicLinks, NSError * _Nullable error) { if (error) { NSLog(@"获取动态链接失败: %@", error.localizedDescription); return; } for (FIRDynamicLink *dynamicLink in dynamicLinks) { // 这里处理你的动态链接逻辑 if ([dynamicLink.url.host isEqualToString:@"你的动态链接域名"]) { // 解析参数、跳转对应页面等 } } }];
Swift 版本:
DynamicLinks.dynamicLinks().fetchDynamicLinks { (dynamicLinks, error) in guard error == nil else { print("获取动态链接失败: \(error!.localizedDescription)") return } if let links = dynamicLinks { for link in links { if let url = link.url, url.host == "你的动态链接域名" { // 处理链接逻辑 } } } }
这个方法会主动去 Firebase 服务器拉取当前设备对应的未处理动态链接,弥补 iOS 8 系统的回调缺失问题。
2. iOS 9:检查 Universal Links 配置与代理方法实现
iOS 9 及以上默认用 Universal Links,出现 dynamicLink 为 nil 大概率是以下两个问题:
- 确保
continueUserActivity:restorationHandler:正确实现:
这个方法是 Universal Links 回调的关键,你需要在 AppDelegate 里添加: - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id
> * _Nullable))restorationHandler {
BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL completion:^(FIRDynamicLink * _Nullable dynamicLink, NSError * _Nullable error) {
if (error) {
NSLog(@"处理 Universal Link 失败: %@", error.localizedDescription);
return;
}
if (dynamicLink) {
// 处理动态链接
}
}];
return handled;
}Swift 版本: ```swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { (dynamicLink, error) in
if let error = error {
print("处理 Universal Link 失败: (error.localizedDescription)")
return
}
if let dynamicLink = dynamicLink {
// 处理动态链接
}
}
return handled
}
- **验证 Associated Domains 配置**: 确保你的 App ID 已开启 Associated Domains,并且在 Xcode 的 `Signing & Capabilities` 里添加了 `applinks:你的动态链接域名`(比如 `applinks:xxx.page.link`)。同时检查 Firebase 控制台里的动态链接域名是否和这里一致。 ## 3. 通用排查点:确保动态链接生成与跳转流程正确 - **检查动态链接的 iOS 配置**:生成动态链接时,必须指定正确的 `iOS Bundle ID`,并且确保没有设置错误的跳转限制(比如过期时间、地区限制)。 - **测试时避免用备忘录的链接直接跳转**:可以尝试用 Safari 直接打开动态链接,再跳转 App Store,有时候备忘录的链接会被系统转义导致参数丢失。 - **确认 Firebase 初始化时机**:必须在 `application:didFinishLaunchingWithOptions:` 的最开始就初始化 Firebase(`[FIRApp configure];` 或 `FirebaseApp.configure()`),不要延迟初始化,否则会错过回调时机。 ## 4. 额外:iOS 8 下的 URL Scheme 回调补充 虽然你说已经实现了代理方法,但再确认下 `application:openURL:sourceApplication:annotation:` 是否正确处理了动态链接: ```objc - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:url completion:^(FIRDynamicLink * _Nullable dynamicLink, NSError * _Nullable error) { // 处理逻辑 }]; return handled; }
Swift 版本:
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { let handled = DynamicLinks.dynamicLinks().handleUniversalLink(url) { (dynamicLink, error) in // 处理逻辑 } return handled }
按照这些步骤排查后,我当时的问题就解决了,希望对你也有用!
内容的提问来源于stack exchange,提问作者Petre-Daniel Puiu

