IOS Facebook SDK: логин не возвращает адрес электронной почты, несмотря на предоставленные разрешения
Я пытаюсь получить информацию через facebook sdk, но до сих пор я получаю только идентификатор и имя пользователя, хотя я уверен, что есть доступная электронная почта, так как это моя учетная запись. Я смотрел несколько ответов здесь, но никто из них не решил мою проблему до сих пор.
Что я делаю неправильно, и почему он не возвращает больше данных, поскольку я запрашиваю несколько разрешений?
Вот мой код:
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
Facebook Graph API нарушил свою обратную совместимость (при использовании по умолчанию) Начиная с Graph-API версии 2.4 (Pod Version 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:
API-интерфейс Graph имеет несколько версий, доступных для доступа к любому время. Каждая версия содержит набор полей и операций с краем. Мы гарантируем, что эти основные API-интерфейсы будут доступны и не изменен в этой версии в течение как минимум 2 лет с момента выпуска. платформенный журнал изменений может сказать вам, какие версии в настоящее время доступны.
ИЛИ
вы можете использовать новый Graph-API (v2.4), задав интересующие вас поля:
[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"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
В моем случае электронная почта не была проверена пользователем, поэтому не получать ее даже после предоставления разрешений;)
Ответ 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
Функция в быстром:
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
Я никогда не работал с 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();
Я уверен, что у вас должно быть что-то вроде getGraphObject
в вашем SDK.
Ответ 8
Используйте эти функции, это будет работать уверенно
@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)
функцию с помощью кнопки