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¬found=1
【讨论】:
以上是关于IOS Facebook SDK:尽管授予权限,但登录不返回电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
Facebook iOS SDK - 第二次登录时多余的“确定”点击?
如何知道用户之前是不是已经授予 Facebook SDK 权限
如何使用 facebook sdk 在 ios 中创建 facebook 测试用户