反应原生深度链接与 Facebook SDK 冲突
Posted
技术标签:
【中文标题】反应原生深度链接与 Facebook SDK 冲突【英文标题】:React native deep linking vs Facebook SDK conflct 【发布时间】:2016-09-01 20:44:33 【问题描述】:我在我的 react-native 应用中使用 Facebook SDK,现在我还想添加对通用深度链接的支持。
我按照此处的说明修改了我的 appdelegate:https://developers.facebook.com/docs/ios/getting-started/
对于深度链接,我正在尝试遵循:https://facebook.github.io/react-native/docs/linking.html
但是,他们似乎都使用相同的方法,我不知道如何调和:
````
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
````
请让我知道我应该如何修改该方法以同时具有这两种功能。
谢谢
【问题讨论】:
【参考方案1】:这就是我设法解决问题的方法:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
NSString *myUrl = url.absoluteString;
if ([myUrl containsString:@"PLACE_YOUR_FB_APP_ID_HERE"])
return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
];
else
return [RCTLinkingManager application:application openURL:url options:options];
只需将 PLACE_YOUR_FB_APP_ID_HERE
替换为 info.plist 中的字符串即可。例如,在以下情况下,它的 fb9999999999:
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb9999999999</string>
</array>
</dict>
</array>
【讨论】:
更改时出现错误:无法读取未定义的属性应用。有什么想法吗? 你是个好人,这解决了我的问题。非常感谢您的精彩回答!【参考方案2】:最后编写了一个简单的 if 语句来查看传入的 URL 是否是 Facebook 的,如果是则返回 FBSDKApplicationDelegate,如果不是则返回 RCTLinkingManager 对象。
【讨论】:
【参考方案3】:以@erdostom 之前所写的内容为基础(顺便说一句,这是一个救命稻草,谢谢!)这是我更新 AppDelegate.m 的方式
在 fbsdk 提供的方法中,而不是返回 'handled',
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
NSString *myUrl = url.absoluteString;
if ([myUrl containsString:@"nameONonFBUrl"])
return [RCTLinkingManager application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
else
return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
【讨论】:
【参考方案4】:我需要点击此链接才能使其正常工作 https://github.com/facebook/react-native-fbsdk#32-ios-project 。它表示 AppDelegate.m 文件只能具有 FacebookSDK 和 Deeplinking 都需要的 openUrl 方法。还有一个解决方案可以正确实现该功能。
【讨论】:
【参考方案5】:[FBSDKApplicationDelegate sharedInstance]
和 RCTLinkingManager
都返回 BOOL
。
因为你只能在AppDelegate
中声明一次以下方法:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
如果[FBSDKApplicationDelegate sharedInstance]
或RCTLinkingManager
之一返回YES
,您可以简单地将它们都包含在同一个方法中,并返回YES
,如下所示:
完整方法:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
BOOL handleFBSDK = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation
];
BOOL handleRCT = [RCTLinkingManager application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation
];
return handleFBSDK || handleRCT;
【讨论】:
以上是关于反应原生深度链接与 Facebook SDK 冲突的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ios 的新 facebook sdk 中实现深度链接?
Facebook iOS SDK 3.0 中的深度链接和 FBSessionDelegate