Подтвердить что ты не робот

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
4b9b3361

Ответ 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) функцию с помощью кнопки