更新Facebook API后获取用户信息失败:无效权限问题求助
解决Facebook API无效权限(user_birthday、user_photos、user_gender)问题
首先明确你遇到的错误提示:
无效权限:user_birthday、user_photos、user_gender。此消息仅对开发者显示
作为应用管理员却碰到这个问题,其实是Facebook近几年收紧隐私权限政策导致的——哪怕是开发者,也不能直接在未配置测试环境的情况下请求这些敏感权限。下面给你拆解可能的问题和修复办法:
可能的操作误区及修复方案
1. 测试用户与开发权限未配置
Facebook现在要求,要测试生日、性别、照片这类受限权限,哪怕是应用管理员/开发者,也必须完成以下配置:
- 确保你的应用处于Development Mode(在Facebook开发者后台的应用首页就能查看并切换状态)
- 把你自己添加为应用的测试用户(进入开发者后台的
Roles->Test Users页面操作) - 在
App Review->Permissions and Features页面,找到对应的权限,点击Test in Development(不同版本界面措辞可能略有不同),开启开发环境下的测试权限
2. 部分权限已被废弃或政策变更
user_photos权限已经被Facebook废弃,现在要访问用户的照片/视频,需要使用user_media权限,而且这个权限同样需要申请审核,开发阶段只能用测试用户测试user_gender和user_birthday属于隐私敏感权限,即使是测试环境,也必须通过上述测试用户配置才能访问,不能直接用管理员账号随意请求
3. 代码层面的调整建议
你现在的代码一次性请求了多个受限权限,很容易触发错误。建议先简化代码,测试基础登录流程,再逐步添加权限:
你的原始代码:
FBSDKLoginManager().logIn(withReadPermissions: ["email", "public_profile", "user_birthday", "user_photos", "user_gender"], from: self) { (result, err) in print("open facebook safari") if (err != nil) { print("Fb Login Failed", err ?? "") self.dismiss(animated: true, completion: nil) } self.handleFirebase() } FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, first_name, last_name, gender, birthday, picture.width(400).height(400)"]).start(completionHandler: { (connection, result, error) in if let error = error { print(error.localizedDescription) } else { if let userData = result as? NSDictionary { self.firstName = userData.object(forKey: "first_name") as? String self.gender = userData.object(forKey: "gender") as? String self.birthday = userData.object(forKey: "birthday") as? String ?? "" let pictureDictionary = userData.object(forKey: "picture") as! NSDictionary let pictureSubDictionary = pictureDictionary.object(forKey: "data") as! NSDictionary self.userProfileUrl = pictureSubDictionary.object(forKey: "url") as! String } } })
调整后的测试代码(先移除受限权限,确保流程正常):
// 先只请求基础权限,确保登录流程正常 FBSDKLoginManager().logIn(withReadPermissions: ["email", "public_profile"], from: self) { (result, err) in print("open facebook safari") if let err = err { print("Fb Login Failed", err) self.dismiss(animated: true, completion: nil) return } // 确认获取到登录token后再发起Graph请求 guard let _ = result?.token else { print("No valid Facebook login token received") self.dismiss(animated: true, completion: nil) return } // 先请求基础字段,后续配置好测试权限后再添加gender、birthday等字段 FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, first_name, last_name, picture.width(400).height(400)"]).start(completionHandler: { (connection, result, error) in if let error = error { print(error.localizedDescription) } else { if let userData = result as? NSDictionary { self.firstName = userData.object(forKey: "first_name") as? String let pictureDictionary = userData.object(forKey: "picture") as! NSDictionary let pictureSubDictionary = pictureDictionary.object(forKey: "data") as! NSDictionary self.userProfileUrl = pictureSubDictionary.object(forKey: "url") as! String // 等测试权限配置完成后,再添加gender和birthday的解析逻辑 } } self.handleFirebase() }) }
总结
核心问题就是Facebook的隐私权限政策更新后,受限权限不再对普通管理员账号开放,必须配置测试用户和开发环境权限才能测试。按照上面的步骤配置后,你应该就能正常请求这些权限了。
内容的提问来源于stack exchange,提问作者Max Voskresenskyy




