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的依赖冲突:
旧版FBSDK(对应你用的react-native-fbsdk 0.8.0)不兼容iOS13+的权限和回调逻辑,我们需要手动替换成v5.x系列的SDK(v6+对旧RN版本兼容性差,不建议):
第一步:彻底移除旧版FBSDK文件
打开iOS项目的Xcode工程,找到之前手动添加的FBSDKCoreKit.framework、FBSDKLoginKit.framework、FBSDKShareKit.framework,右键选择「删除」,弹窗里选「Move to Trash」彻底清理。第二步:下载兼容的FBSDK版本
去Facebook开发者平台下载v5.x的SDK包(推荐v5.15.1,亲测兼容iOS13+和RN0.59.x),解压后找到FBSDKCoreKit.xcframework、FBSDKLoginKit.xcframework、FBSDKShareKit.xcframework(如果是.framework格式也能用,xcframework是多平台通用的)。第三步:手动添加新版本到项目
把这几个框架文件拖到iOS项目的Libraries目录下,弹出窗口时勾选「Copy items if needed」,并确保你的主App Target已经被勾选「Add to targets」。第四步:更新项目配置项
- 打开项目的「Build Settings」,找到
Framework Search Paths,添加框架所在路径(如果拖到Libraries里,直接填$(SRCROOT)/Libraries就行)。 - 检查
Other Linker Flags,确保包含-ObjC(这是FBSDK必须的链接标记)。 - 打开
Info.plist,确认Facebook基础配置:CFBundleURLTypes(包含fb开头的URL Scheme)、FacebookAppID、FacebookDisplayName都正确。另外iOS13+必须添加LSApplicationQueriesSchemes数组,包含fbapi、fb-messenger-share-api、fbauth2、fbshareextension这几个字段。
- 打开项目的「Build Settings」,找到
第五步:修复react-native-fbsdk的桥接代码
因为react-native-fbsdk 0.8.0的原生桥接和v5.x FBSDK有API差异,需要调整两个关键文件:- 打开
RCTFBSDKLoginManager.m,把旧的declinedPermissions、grantedPermissions调用改成declinedPermissions.array、grantedPermissions.array(新版本返回的是NSSet类型,需要转成数组)。 - 检查
RCTFBSDKGraphRequest.m,确保FBSDKGraphRequest的初始化参数正确,新版本的初始化方法是[[FBSDKGraphRequest alloc] initWithGraphPath:parameters:tokenString:version:HTTPMethod:],如果旧代码缺了tokenString参数,补传nil即可。
- 打开
如果你之前用Pod安装过FBSDK导致冲突,先彻底清理Pod环境:
- 终端执行
pod deintegrate移除所有Pod集成的组件 - 删除项目根目录的
Podfile.lock和Pods文件夹 - 打开
Podfile,确保没有添加FBSDKCoreKit、FBSDKLoginKit这类依赖(我们已经手动添加了) - 重新执行
pod install,只安装RN相关的依赖,不会和手动添加的FBSDK冲突
做完以上步骤后,清理Xcode缓存(Cmd+Shift+K),重新编译运行:
- 测试LoginButton,检查是否还返回
isCancelled: true - 如果还是有问题,在
AppDelegate.m里添加初始化日志,确认SDK是否正常启动:
同时确认回调方法是否正确处理了Facebook的跳转:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 其他RN初始化代码 [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]; NSLog(@"FBSDK初始化状态:AppID = %@", [FBSDKSettings appID]); return YES; }- (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里添加NSCameraUsageDescription和NSPhotoLibraryUsageDescription,否则可能因为权限弹窗被系统拦截,导致登录流程中断。
内容的提问来源于stack exchange,提问作者TalESid




