【问题标题】:React native deep linking vs Facebook SDK conflct反应原生深度链接与 Facebook SDK 冲突
【发布时间】: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];
}

````

请让我知道我应该如何修改该方法以同时具有这两种功能。

谢谢

【问题讨论】:

    标签: objective-c facebook react-native


    【解决方案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;
          }
          

          【讨论】: