React原生深层链接与Facebook SDK conflct

时间:2016-09-01 20:44:33

标签: objective-c facebook react-native

我在我的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];
}

````

请告诉我如何修改方法以获得这两种功能。

谢谢

5 个答案:

答案 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;
}