IOS Facebook SDK:尽管授予权限,但登录不返回电子邮件

Posted

技术标签:

【中文标题】IOS Facebook SDK:尽管授予权限,但登录不返回电子邮件【英文标题】:IOS Facebook SDK: login doesn't return email despite permissions granted 【发布时间】:2015-07-14 15:22:46 【问题描述】:

我正在尝试通过 facebook sdk 获取信息,但到目前为止,我只获得了用户的 id 和名称,尽管我确信有可用的电子邮件,因为它是我的帐户。我一直在这里查看几个答案,但到目前为止,他们都没有解决我的问题。 我做错了什么,为什么在我请求多个权限时它没有返回更多数据?

这是我的代码:

fbLoginManager.logInWithReadPermissions(["public_profile", "email", "user_friends", "user_about_me", "user_birthday"], handler:  (result, error) -> Void in
        if ((error) != nil)
        
            // Process error
            println("There were an error: \(error)")
        
        else if result.isCancelled 
            // Handle cancellations
            fbLoginManager.logOut()
        
        else 
            var fbloginresult : FBSDKLoginManagerLoginResult = result
            if(fbloginresult.grantedPermissions.contains("email"))
            
                println(fbloginresult)
                self.returnUserData()
            
        
    )

以及获取用户数据的函数:

func returnUserData()

    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphpath: "me", parameters: nil)
    graphRequest.startWithCompletionHandler( (connection, result, error) -> Void in

        if ((error) != nil)
        
            // Process error
            println("Error: \(error)")
        
        else
        
            println("fetched user: \(result)")

            if let userName : NSString = result.valueForKey("name") as? NSString 
                println("User Name is: \(userName)")
            
            if let userEmail : NSString = result.valueForKey("email") as? NSString 
                println("User Email is: \(userEmail)")
            
        
    )

返回:

fetched user: 
id = 55555555;
name = "Kali Aney";

User Name is: Kali Aney

【问题讨论】:

【参考方案1】:

自 Graph-API 版本 2.4(Pod 版本 4.4.0)以来,Facebook Graph API 破坏了它的向后兼容性(以默认方式使用时)。

FB Graph-API 2.4 不会为用户返回所有默认字段

要解决此问题,您可以使用显式图形版本 2.3:

[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil tokenString:[FBSDKAccessToken currentAccessToken].tokenString version:@"v2.3" HTTPMethod:nil]

在这种情况下,FB 保证 v2.3 至少在 2 年后可用。 https://developers.facebook.com/docs/graph-api/overview:

Graph API 有多个版本可供任何人访问 时间。每个版本都包含一组核心字段和边缘操作。 我们保证这些核心 API 将可用,并且 自发布之日起至少 2 年内未在该版本中进行修改。这 平台变更日志可以告诉你当前有哪些版本 可用。

您可以通过询问您感兴趣的特定字段来使用新的 Graph-API (v2.4):

[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@@"fields" : @"email,name"]

【讨论】:

使用 Graph-API 2.4,如何获取登录用户的生日或在 @"fields" 中传递什么作为生日? 来自 FB 的惊喜,感谢@HeTzi 的回答 已经在那里了。为应用程序捐款,但为浏览器捐款。它没有返回电子邮件 由于这是谷歌搜索中出现的第一个答案,我认为您应该补充一点,您不会收到未验证电子邮件的用户的电子邮件,并且 对于已完成验证的用户。 即使指定了@@"fields" : @"email,name",我仍然无法收到我的电子邮件。这是上周工作的。我的情况似乎是一个单独的问题。【参考方案2】:

我在这个问题上苦苦挣扎了将近一天,直到找到了@HeTzi 的答案,它非常有效。这种请求的快速版本是:

func referenceFBData() 
    var request = FBSDKGraphRequest(graphPath:"me", parameters: ["fields":"email,first_name,gender"]);

    request.startWithCompletionHandler  (connection : FBSDKGraphRequestConnection!, result : AnyObject!, error : NSError!) -> Void in
        if error == nil 
            println("The information requested is : \(result)")
         else 
            println("Error getting information \(error)");
        
    

请记住,您必须首先请求正确的读取权限才能使用此请求获取数据。

【讨论】:

【参考方案3】:

在我的情况下,用户没有验证电子邮件,这就是为什么即使在授予权限后也没有得到它;)

【讨论】:

你是怎么知道这是问题所在,因为 Facebook 没有抛出任何此类错误? 我记不太清楚了,但我想我是在没有明确授予电子邮件权限的情况下使用测试用户,然后当我使用我的个人帐户时,收到了回复的电子邮件,然后我才知道实际原因。跨度> 【参考方案4】:

这行得通...希望对您有所帮助..

NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    [parameters setValue:@"id, name, email" forKey:@"fields"];

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 

         NSLog(@"Fetched user is:%@", result);
];

【讨论】:

【参考方案5】:

这样的 swift 函数:

func fbsignup() 
        let lgManager = FBSDKLoginManager()
        lgManager.logInWithReadPermissions(["public_profile","email"], fromViewController: self,handler:  (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
            if error != nil
                print("facebook error")
            else if result.isCancelled 
                print("Canceled")
            else
                if result.grantedPermissions.contains("email") 
                    if (FBSDKAccessToken.currentAccessToken() != nil) 
                        FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"]) .startWithCompletionHandler( (connection:FBSDKGraphRequestConnection!, result:AnyObject!, error:NSError!) -> Void in
                            print(result)
                        )
                    
                
            
        )
    

【讨论】:

【参考方案6】:

在 Swift 2.2 中测试

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) 
        print("User Logged In")
if ((error) != nil)
        
            // Process error
        
        else if result.isCancelled 
            // Handle cancellations
        
        else 
            // If you ask for multiple permissions at once, you
            // should check if specific permissions missing
            if result.grantedPermissions.contains("email")
            
                // Do work
                getUserData()
            
        

func getUserData()

    if ((FBSDKAccessToken.currentAccessToken()) != nil)
    
        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "email, name"])
        graphRequest.startWithCompletionHandler( (connection, result, error) -> Void in

            if ((error) != nil)
            
                // Process error
                print("Error: \(error)")
            
            else
            
                print("fetched user: \(result)")
                let userName : NSString = result.valueForKey("name") as! NSString
                print("User Name is: \(userName)")
                let userEmail : NSString = result.valueForKey("email") as! NSString
                print("User Email is: \(userEmail)")

            
        )
    

【讨论】:

【参考方案7】:

使用这些功能肯定会起作用

@IBAction func fbsignup(_ sender: Any) 
        let fbloginManger: FBSDKLoginManager = FBSDKLoginManager()
        fbloginManger.logIn(withReadPermissions: ["email"], from:self)  (result, error) -> Void in
            if(error == nil)
                let fbLoginResult: FBSDKLoginManagerLoginResult  = result!

                if( result?.isCancelled)!
                    return 


                if(fbLoginResult .grantedPermissions.contains("email"))
                    self.getFbId()
                
              

    
    func getFbId()
    if(FBSDKAccessToken.current() != nil)
    FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id,name , first_name, last_name , email"]).start(completionHandler:  (connection, result, error) in
    if(error == nil)
    print("result")
    
    )
    
    

并用您的按钮连接fbsignup(_sender: Any) 函数

【讨论】:

【参考方案8】:

我从未与 ios 合作过,但我对 Facebook 有很多经验。我的第一个观察是,每当您请求 Facebook 许可时,您必须确保: - 你让你的用户知道你为什么需要这个权限 - 你尊重 Facebook 的条款 - 在不久的将来你肯定会需要这个权限

这个列表

["public_profile", "email", "user_friends", "user_about_me", "user_birthday"]

似乎很模糊。您必须确保您请求的权限是您在不久的将来肯定需要的最低权限。

关于请求本身,您必须确保使用有效的 Facebook 会话。我在 PHP 中这样做:

        $request = new \Facebook\FacebookRequest( self::$session, 'GET', '/me' );
        $response = $request->execute();
        // get response
        $graphObject = $response->getGraphObject()->asArray();

我相信你的 SDK 中也必须有类似 getGraphObject 的东西。

【讨论】:

感谢您的回答,但我不确定如何在 iOS 上使用它...我正在请求电子邮件权限,所以这个应该在退货中。【参考方案9】:

在 Facebook 开发者网站中启用您的电子邮件访问权限

https://developers.facebook.com/apps/app-review/permissions/

转到 Facebook 开发者网站-> 点击 App Review-> 检查权限和功能-> 将标准访问更改为高级访问

查看图片

https://developers.facebook.com/search/?q=apps%20app%20review%20permissions&notfound=1

【讨论】:

以上是关于IOS Facebook SDK:尽管授予权限,但登录不返回电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

Facebook iOS SDK - 第二次登录时多余的“确定”点击?

如何知道用户之前是不是已经授予 Facebook SDK 权限

使用 SDK 3.5 在 iOS 上连接 Facebook

如何使用 facebook sdk 在 ios 中创建 facebook 测试用户

安装了 Facebook 应用程序的 Facebook SDK iOS 登录

尽管授予了适当的文件权限,但 Java AccessControlException