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

更新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_genderuser_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

火山引擎 最新活动