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

Kal*_*ney 14 facebook-graph-api facebook-ios-sdk swift

我正在尝试通过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()
            }
        }
    })
Run Code Online (Sandbox Code Playgroud)

以及获取用户数据的功能:

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)")
            }
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

哪个回报:

fetched user: {
id = 55555555;
name = "Kali Aney";
}
User Name is: Kali Aney
Run Code Online (Sandbox Code Playgroud)

HeT*_*Tzi 38

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

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"}]

  • 由于这是google搜索的第一个答案,我想您应该补充一点:对于未验证电子邮件的用户,您不会收到电子邮件;对于已验证电子邮件的用户,则只会**接收**。 (2认同)

Tre*_*gle 7

几天前我一直在努力解决这个问题,直到找到了@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)");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Amm*_*eeb 6

在我的情况下,用户未验证电子邮件,即使在授予权限后仍未获取电子邮件;)


小智 5

这工作......希望它有帮助..

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);
}];
Run Code Online (Sandbox Code Playgroud)