You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React Native iOS13+中Facebook登录失效,求手动更新FBSDK方案

我之前在维护旧版RN项目时也碰到过一模一样的问题——iOS13+下Facebook登录直接返回isCancelled: true,还因为Pod更新搞出重复依赖的坑。结合你的技术栈(react 16.8.3、react-native 0.59.9、react-native-fbsdk 0.8.0),给你一套手动更新原生FBSDK的可行方案,完全避开Pod的依赖冲突:

一、iOS端手动替换FBSDK组件(选v5.x版本适配)

旧版FBSDK(对应你用的react-native-fbsdk 0.8.0)不兼容iOS13+的权限和回调逻辑,我们需要手动替换成v5.x系列的SDK(v6+对旧RN版本兼容性差,不建议):

  • 第一步:彻底移除旧版FBSDK文件
    打开iOS项目的Xcode工程,找到之前手动添加的FBSDKCoreKit.frameworkFBSDKLoginKit.frameworkFBSDKShareKit.framework,右键选择「删除」,弹窗里选「Move to Trash」彻底清理。

  • 第二步:下载兼容的FBSDK版本
    去Facebook开发者平台下载v5.x的SDK包(推荐v5.15.1,亲测兼容iOS13+和RN0.59.x),解压后找到FBSDKCoreKit.xcframeworkFBSDKLoginKit.xcframeworkFBSDKShareKit.xcframework(如果是.framework格式也能用,xcframework是多平台通用的)。

  • 第三步:手动添加新版本到项目
    把这几个框架文件拖到iOS项目的Libraries目录下,弹出窗口时勾选「Copy items if needed」,并确保你的主App Target已经被勾选「Add to targets」。

  • 第四步:更新项目配置项

    1. 打开项目的「Build Settings」,找到Framework Search Paths,添加框架所在路径(如果拖到Libraries里,直接填$(SRCROOT)/Libraries就行)。
    2. 检查Other Linker Flags,确保包含-ObjC(这是FBSDK必须的链接标记)。
    3. 打开Info.plist,确认Facebook基础配置:CFBundleURLTypes(包含fb开头的URL Scheme)、FacebookAppIDFacebookDisplayName都正确。另外iOS13+必须添加LSApplicationQueriesSchemes数组,包含fbapifb-messenger-share-apifbauth2fbshareextension这几个字段。
  • 第五步:修复react-native-fbsdk的桥接代码
    因为react-native-fbsdk 0.8.0的原生桥接和v5.x FBSDK有API差异,需要调整两个关键文件:

    • 打开RCTFBSDKLoginManager.m,把旧的declinedPermissionsgrantedPermissions调用改成declinedPermissions.arraygrantedPermissions.array(新版本返回的是NSSet类型,需要转成数组)。
    • 检查RCTFBSDKGraphRequest.m,确保FBSDKGraphRequest的初始化参数正确,新版本的初始化方法是[[FBSDKGraphRequest alloc] initWithGraphPath:parameters:tokenString:version:HTTPMethod:],如果旧代码缺了tokenString参数,补传nil即可。
二、彻底清理Pod避免重复依赖

如果你之前用Pod安装过FBSDK导致冲突,先彻底清理Pod环境:

  • 终端执行pod deintegrate移除所有Pod集成的组件
  • 删除项目根目录的Podfile.lockPods文件夹
  • 打开Podfile,确保没有添加FBSDKCoreKitFBSDKLoginKit这类依赖(我们已经手动添加了)
  • 重新执行pod install,只安装RN相关的依赖,不会和手动添加的FBSDK冲突
三、验证调试

做完以上步骤后,清理Xcode缓存(Cmd+Shift+K),重新编译运行:

  • 测试LoginButton,检查是否还返回isCancelled: true
  • 如果还是有问题,在AppDelegate.m里添加初始化日志,确认SDK是否正常启动:
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      // 其他RN初始化代码
      [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
      NSLog(@"FBSDK初始化状态:AppID = %@", [FBSDKSettings appID]);
      return YES;
    }
    
    同时确认回调方法是否正确处理了Facebook的跳转:
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
      BOOL fbHandled = [[FBSDKApplicationDelegate sharedInstance] application:app openURL:url options:options];
      BOOL rnHandled = [RCTLinkingManager application:app openURL:url options:options];
      return fbHandled || rnHandled;
    }
    

另外提个小细节:iOS13+对权限要求更严格,如果你的用到了分享功能,记得在Info.plist里添加NSCameraUsageDescriptionNSPhotoLibraryUsageDescription,否则可能因为权限弹窗被系统拦截,导致登录流程中断。

内容的提问来源于stack exchange,提问作者TalESid

火山引擎 最新活动