我在我的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];
}
````
请告诉我如何修改方法以获得这两种功能。
谢谢
答案 0 :(得分:6)
这就是我设法解决问题的方法:
- (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>
答案 1 :(得分:1)
结束编写一个简单的if语句来查看传入的URL是否为Facebook,如果是,则返回FBSDKApplicationDelegate,如果不是,则返回RCTLinkingManager对象。
答案 2 :(得分:1)
建立@erdostom之前写的内容(这是一个救命的洞察力,谢谢!)这是我如何更新我的AppDelegate.m
在fbsdk提供的方法中,而不是返回'processed',
- (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]];
}
}
答案 3 :(得分:-1)
我需要点击此链接以使其起作用https://github.com/facebook/react-native-fbsdk#32-ios-project。它说,AppDelegate.m文件只能具有FacebookSDK和Deeplinking都需要的openUrl方法。还有一种解决方案可以正确实现该功能。
答案 4 :(得分:-1)
[FBSDKApplicationDelegate sharedInstance]
和 RCTLinkingManager
均返回 BOOL
。
因为您只能在AppDelegate
中声明一次以下方法:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
如果YES
或[FBSDKApplicationDelegate sharedInstance]
之一返回RCTLinkingManager
,则只需将它们都包含在同一方法中,然后返回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;
}