Интеграция Google Contacts API в мое приложение Swift 3

#ios #swift #swift3 #google-api #httprequest

#iOS #swift #swift3 #google-api #httprequest

Вопрос:

У меня возникли большие проблемы с интеграцией Google contacts API в мое приложение. По сути, мне нужно запросить разрешение у пользователя и получить все контакты пользователя Gmail (имя и адрес электронной почты).

Для справки, вот где находится Google Contacts API:https://developers.google.com/google-apps/contacts/v3

У меня уже правильно реализован вход в Google, и пользователь прошел аутентификацию таким образом.

Я действительно изо всех сил пытаюсь собрать все части вместе, вот что у меня есть на данный момент:

   func retrieveContacts(){

        let clientID = "blabla-5blablablabla9gisc.apps.googleusercontent.com"
        let clientSecret = "blablablaDXEwmgilOXgVsQ"

  //How do I ask permission to the user to look at their contacts?
        let url2 = URL(string: "https://www.googleapis.com/auth/contacts.readonly")

        let user = GIDSignIn.sharedInstance().currentUser
        //let name = user?.profile.name
         let email = user?.profile.email

        var url = URL(string:"")

        if let aEmail = email{
         url = URL(string: "https://www.google.com/m8/feeds/contacts/(aEmail)/full")
            print(email)
        }
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
            guard error == nil else {
                print(error)
                return
            }
            guard let data = data else {
                print("Data is empty")
                return
            }

            print(response)
        }

        task.resume()
    }
  

Прямо сейчас я получаю код ошибки: 401 Не авторизован, что очевидно, потому что на самом деле я нигде не запрашиваю разрешения у пользователя.

Комментарии:

1. теперь вы можете извлекать контакты из Google api? Если да, не могли бы вы, пожалуйста, направить меня

2. Взгляните на эту библиотеку. Это то, что в конечном итоге помогло мне. github.com/jackfreeman/GoogleContactsAppSwift

3. Хорошо. Спасибо. Я могу запустить код, предложенный n.by.n, но он всегда говорит, что «JSON не удалось сериализовать из-за ошибки: данные не могут быть прочитаны, потому что они не в правильном формате».

4. Я могу извлекать контакты. Спасибо JP Aquino

Ответ №1:

В Swift 4.2 и Xcode 10.1

Оно извлекает контакты gmail вместе с сохраненными номерами телефонов в формате JSON.

 func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
    print("***********************************************************")
    print("signIn - didSignInForUser")
    if let error = error {
        print("Error 1 :(error.localizedDescription)")
    } else {
        //Get google contacts
        let urlString = "https://www.google.com/m8/feeds/contacts/default/full?access_token=(GIDSignIn.sharedInstance().currentUser.authentication.accessToken!)amp;max-results=(999)amp;alt=jsonamp;v=3.0"
        //            let urlString = "https://www.google.com/m8/feeds/contacts/default/full?access_token=(user.authentication.accessToken!)"
        print(urlString)
        print(GIDSignIn.sharedInstance().scopes!)

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

        let session = URLSession.shared
        session.dataTask(with: url!, completionHandler: { data, response, error in
            if(error != nil) {
                print("Error 2 :(error!)")
            } else {
                do {
                    let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String:Any]
                    print(json)
                    //print(json["feed"] as Any)
                } catch let error as NSError {
                    print("Error 3 :(error)")
                }
            }
        }).resume()

    }
}
  

Но перед этим вам нужно упомянуть о областях

 @IBAction func onClickGmailSignin(_ sender: UIButton) {
    GIDSignIn.sharedInstance().delegate = self
    GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().scopes = ["https://www.google.com/m8/feeds","https://www.googleapis.com/auth/user.phonenumbers.read"];//"https://www.google.com/m8/feeds", "https://www.googleapis.com/auth/user.birthday.read",
    GIDSignIn.sharedInstance().signIn()
}
  

Определенно, вы получите хороший ответ в формате JSON.

Ответ №2:

Xcode 8 Swift 3

Вы должны отправить токен доступа в своем запросе вместе с версией Contacts API, чтобы получить полный список контактов.

 func getGoogleContacts() {

    let urlString = "https://www.google.com/m8/feeds/contacts/default/full?access_token=(GIDSignIn.sharedInstance().currentUser.authentication.accessToken!)amp;max-results=(999)amp;alt=jsonamp;v=3.0"

    Alamofire.request(urlString, method: .get)
        .responseJSON { response in

            switch response.result {
            case .success(let JSON):
                print(JSON as! NSDictionary)
            case .failure(let error):
                print(error.localizedDescription)
            }
    }

}
  

Комментарии:

1. Я могу запустить этот код, но он всегда говорит, что «JSON не удалось сериализовать из-за ошибки: данные не могут быть прочитаны, потому что они не в правильном формате». В чем может быть причина?