反应原生深度链接与 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 原生分享

如何在 ios 的新 facebook sdk 中实现深度链接?

Facebook iOS SDK 3.0 中的深度链接和 FBSessionDelegate

Firebase SDK 与 Facebook SDK 冲突

反应原生渲染 Facebook 登录

如何通过深度链接重新启动反应原生应用程序