iOS集成Firebase与Facebook SDK遇application:openURL:options:重复声明错误解决
解决iOS项目中Firebase Dynamic Link与Facebook SDK共存时的
application:openURL:options:重复声明问题 这个问题我之前帮不少开发者解决过——当你同时集成Facebook SDK和Firebase Dynamic Link时,两个SDK都要求你在AppDelegate.m里实现application:openURL:options:方法,直接写两个方法就会触发编译错误:
Duplicate declaration of method 'application:openURL:options:'
本质原因是Objective-C不允许同一个类中存在两个签名完全相同的方法,所以我们需要把两个SDK的处理逻辑合并到同一个方法里。
先看一下冲突的原有代码
Facebook SDK 原有实现
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]; // Add any custom logic here. return handled; }
Firebase Dynamic Link 原有实现
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options { return [[RNFirebaseLinks instance] application:application openURL:url options:options]; }
合并后的解决方案
核心思路是:让两个SDK依次处理URL请求,只要其中一个能处理当前URL,就返回YES,否则继续交给下一个处理。下面是合并后的代码:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { // 先让Facebook SDK尝试处理URL BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]; // 如果Facebook没处理成功,再交给Firebase Dynamic Link处理 if (!handled) { handled = [[RNFirebaseLinks instance] application:application openURL:url options:options]; } // 你也可以在这里添加自己的自定义URL处理逻辑 return handled; }
额外说明
- 处理顺序可以根据你的业务需求调整:如果希望Firebase优先处理,就先调用Firebase的方法,再判断是否交给Facebook处理。
- 两个SDK的处理方法都会返回布尔值,用来标识是否成功处理了当前URL,我们正是利用这个返回值来实现逻辑的串联。
内容的提问来源于stack exchange,提问作者FeelRightz
相关产品推荐
相关产品推荐

