React Native深度链接与Facebook SDK冲突

11

我正在我的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个回答

13

这是我解决问题的方法:

- (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:

只需将PLACE_YOUR_FB_APP_ID_HERE替换为您的info.plist中的字符串。例如,在以下情况下,它是fb9999999999:

  <array>
    <dict>
      <key>CFBundleURLSchemes</key>
      <array>
        <string>fb9999999999</string>
      </array>
    </dict>
  </array>

当我尝试更改它时,出现了一个错误:无法读取未定义的apply属性。有什么想法吗? - Hugo
1
你是一个伟大的人,这解决了我的问题。非常感谢你提供的出色答案! - devtanc

1

最终编写了一个简单的if语句,用于判断传入的URL是否为Facebook URL,如果是,则返回FBSDKApplicationDelegate,否则返回RCTLinkingManager对象。


1

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

-1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接