Как получить возраст и пол из Google Sign-In

Я интегрировал функцию входа через Google в свое приложение для iOS. Я хотел бы получить доступ к полу и возрасту пользователя. Документация недостаточно ясна, чтобы понять, как это сделать. Я понял, что должен запросить правильный объем. Я не нашел в документации официального списка областей видимости и не знаю, какую область мне следует использовать. Также я не знаю, как мне получить данные, когда я их получу. Буду признателен, если кто-нибудь поможет мне получить эту информацию от Google. Спасибо!
Вот мой код:

func googleLogin() {

    self.appDelegate.setIdentityAvailableValue(false)

    GIDSignIn.sharedInstance().clientID = kClientId
    GIDSignIn.sharedInstance().shouldFetchBasicProfile = true
    GIDSignIn.sharedInstance().delegate = self
    GIDSignIn.sharedInstance().uiDelegate = self

    GIDSignIn.sharedInstance().signInSilently()
}

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) {

    if (error == nil) {

        let idToken = user.authentication.idToken

        let url = NSURL(string:  "https://www.googleapis.com/oauth2/v3/userinfo?access_token=\(user.authentication.accessToken)")
        let session = NSURLSession.sharedSession()
        session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
            //UIApplication.sharedApplication().networkActivityIndicatorVisible = false
            if error != nil {
                print("dataTaskWithURL error \(error)")
            }
            else {
                do {
                    let userData = try NSJSONSerialization.JSONObjectWithData(data!, options:[]) as? [String:AnyObject]
                    /*
                    Get the account information you want here from the dictionary
                    Possible values are
                    "id": "...",
                    "email": "...",
                    "verified_email": ...,
                    "name": "...",
                    "given_name": "...",
                    "family_name": "...",
                    "link": "https://plus.google.com/...",
                    "picture": "https://lh5.googleuserco...",
                    "gender": "...",
                    "locale": "..."

                    so in my case:
                    */
                    let gender = userData!["gender"] as! String
                    let locale = userData!["locale"] as! String
                    print("gender = \(gender)")
                    print("locale = \(locale)")

                } catch {
                    NSLog("Account Information could not be loaded")
                }
            }
        })

    } else {
        // some error handling code
    }
}

person user2732722    schedule 05.03.2016    source источник
comment
@user-Вы не можете найти возраст с помощью вздоха Google, потому что вход в Google перестал указывать возраст любого пользователя.   -  person Devendra Agnihotri    schedule 05.03.2016
comment
Спасибо, что сообщили мне о возрасте.   -  person user2732722    schedule 05.03.2016
comment
Если это полезно для вас, то проголосуйте за мой комментарий друг.   -  person Devendra Agnihotri    schedule 05.03.2016
comment
@ ДЕВЕНДРА АГНИХОТРИ Наконец-то мне удалось получить нужную мне информацию. Возраст в виде возрастного диапазона является частью информации, которую я получил. Так что не совсем верно, что Google не предоставляет информацию о возрасте.   -  person user2732722    schedule 05.03.2016
comment
Как ты взрослеешь?   -  person Konstantin.Efimenko    schedule 24.02.2017


Ответы (2)


Это Swift 3:

Просто используйте следующий метод:

 func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
                  withError error: Error!)

Код получения информации о пользователе: и поместите этот код в описанный выше метод –

let gplusapi = "https://www.googleapis.com/oauth2/v3/userinfo?access_token=\(user.authentication.accessToken!)"
            let url = NSURL(string: gplusapi)!


            let request = NSMutableURLRequest(url: url as URL)
            request.httpMethod = "GET"
            request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

            let session = URLSession.shared


            session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) in
                UIApplication.shared.isNetworkActivityIndicatorVisible = false
                do {
                    let userData = try JSONSerialization.jsonObject(with: data!, options:[]) as? [String:AnyObject]
                    let picture = userData!["picture"] as! String
                    let gender = userData!["gender"] as! String
                    let locale = userData!["locale"] as! String

                } catch {
                    NSLog("Account Information could not be loaded")
                }

            }).resume()

В конце вам нужно вызвать возобновление(), иначе закрытие не будет вызвано. Мне потребовалось три дня, чтобы понять это. Так что я надеюсь, что это поможет кому-то.

person indikaanu83    schedule 03.12.2016
comment
до сих пор я не получаю пол в ответ, картинка есть - person MiTal Khandhar; 30.05.2017
comment
Большое спасибо. Сохранить мое время. :) - person Dolly Vaish; 10.07.2017
comment
я могу получить пол, но какую область следует использовать для получения даты рождения пользователя? - person Pratik Jamariya; 13.07.2017
comment
userData дает этот ответ, где пол? [изображение: lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAI/AAAAAAAAAAAA /, family_name: User, name: User, email: [email protected], sub: 10855413580866685, named_name: dev, locale: en, email_verified: 1] - person User558; 01.12.2017

Вы можете получить доступ только к тому, что пользователь сделал общедоступным. Если пользователь не хочет, чтобы эта информация была общедоступной, вы не можете получить эту информацию.

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!,
    withError error: NSError!) {
        if (error == nil) {
            // Perform any operations on signed in user here.
            let userId = user.userID                  // For client-side use only!
            let idToken = user.authentication.idToken // Safe to send to the server
            let name = user.profile.name
            let email = user.profile.email

          let url = NSURL(string:  "https://www.googleapis.com/oauth2/v3/userinfo?access_token=\(user.authentication.accessToken)")
    let session = NSURLSession.sharedSession()
    session.dataTaskWithURL(url!) {(data, response, error) -> Void in
        UIApplication.sharedApplication().networkActivityIndicatorVisible = false
        do {
            let userData = try NSJSONSerialization.JSONObjectWithData(data!, options:[]) as? [String:AnyObject]
            /*
            Get the account information you want here from the dictionary
            Possible values are
            "id": "...",
            "email": "...",
            "verified_email": ...,
            "name": "...",
            "given_name": "...",
            "family_name": "...",
            "link": "https://plus.google.com/...",
            "picture": "https://lh5.googleuserco...",
            "gender": "...",
            "locale": "..."

            so in my case:
            */
           let gender = userData!["gender"] as! String
           let locale = userData!["locale"] as! String

        } catch {
            NSLog("Account Information could not be loaded")
        }
    }

        } else {
            print("\(error.localizedDescription)")
        }
}

func signIn(signIn: GIDSignIn!, didDisconnectWithUser user:GIDGoogleUser!,
    withError error: NSError!) {
        // Perform any operations when the user disconnects from app here.
        // ...
}
person Anbu.Karthik    schedule 05.03.2016
comment
Спасибо за ответ! Этот код не работает. Закрытие никогда не вызывается. Я также изменил его, чтобы он имел вид session.dataTaskWithURL(url!, completeHandler: { (data, response, error) -> Void in, но он все равно не вызывается! Я получаю следующую ошибку: Error Domain=com. google.GIDSignIn Code=-4 (null) 2016-03-04 21:19:22.292 One[8794:5006509] url.scheme: com.googleusercontent.apps./*моя схема URL*/ - person user2732722; 05.03.2016
comment
код работает на 100%, но вы забыли добавить несколько строк в этот код, см. эту ссылку stackoverflow.com/questions/31461139/ - person Anbu.Karthik; 05.03.2016
comment
Я добавил ваш код в часть signIn для успешного входа (signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!). Это означает, что вход в систему прошел успешно. Какой код мне не хватает? - person user2732722; 05.03.2016