it-swarm.com.ru

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
13
Kali Aney

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 заверяет, что версия 2.3 будет доступна по крайней мере через 2 года . https://developers.facebook.com/docs/graph-api/overview :

Graph API имеет несколько версий для доступа к любой время. Каждая версия содержит набор основных полей и операций Edge . Мы гарантируем, что эти основные API будут доступны и не изменяется в этой версии в течение как минимум 2 лет с момента выпуска. журнал изменений платформы может сказать вам, какие версии в настоящее время имеется в наличии.

ИЛИ ЖЕ

вы можете использовать новый Graph-API (v2.4), запрашивая конкретные поля, которые вас интересуют:

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

38
HeTzi

Я боролся с этой проблемой почти сутки, пока не нашел ответ @HeTzi, который работал отлично. Версия Swift такого запроса:

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)");
        }
    }
}

Помните, что вы должны сначала запросить правильные разрешения на чтение, чтобы получить данные, используя этот запрос.

7
Trey Pringle

В моем случае электронная почта не была проверена пользователем, поэтому не может получить ее даже после предоставления разрешений;)

5
Ammar Mujeeb

это работает ... надеюсь, это поможет ..

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
user5465487

Протестировано в 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)")

            }
        })
    }
}
1
karthikPrabhu Alagu

Функция в 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)
                        })
                    }
                }
            }
        })
    }
1
William Hu

Я никогда не работал с 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.

0
Lajos Arpad

Используйте эти функции, это будет работать наверняка

@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)с помощью кнопки

0
Ayush Dixit