В настоящее время я работаю над приложением для iOS, которое необходимо записать на лист Google, принадлежащий пользователю, вошедшему в систему.
Чтобы войти в систему, я использую модуль GoogleSignIn
идля добавления на страницу Google я использую GoogleAPIClientForREST/Sheets
pod.
Я могу заставить пользователя войти в систему нормально, но я не могу писать на листе из-заошибки аутентификации.Каждый пример, который я нашел в SO (например, Обновление определенной строки в iOS Swift с использованием Google SpreadSheet API ) и тому подобное, указывает на использование метода fetcherAuthorizer()
текущего пользователя и назначение его service.authorizer
однако это даже не скомпилируется со следующей ошибкой value of type 'GIDAuthentication?' has no member 'fetcherAuthorizer'
Так что для моего подфайла у меня есть:
pod 'GoogleSignIn'
pod 'GoogleAPIClientForREST/Sheets'
Мой AppDelegate didFinishLaunchingWithOptions
имеет следующее:
GIDSignIn.sharedInstance().clientID = "clientIdHere"
GIDSignIn.sharedInstance()?.scopes.append(kGTLRAuthScopeSheetsSpreadsheets)
GIDSignIn.sharedInstance()?.scopes.append(kGTLRAuthScopeSheetsDrive)
GIDSignIn.sharedInstance()?.delegate = self
И когда я пытаюсь записать на лист, который я использую:
let service = GTLRSheetsService()
// following line errors with authorizer not being a property of the service
//variable and fetchAuthorizer() not being a method on authentication
service.authorizer = GIDSignIn.sharedInstance().currentUser.authentication.fetcherAuthorizer()
let spreadsheetId = "id"
let range = "Sheet1"
let valueRange = GTLRSheets_ValueRange.init();
valueRange.values = [
["Hello", "World"]
]
let query = GTLRSheetsQuery_SpreadsheetsValuesAppend
.query(withObject: valueRange, spreadsheetId:spreadsheetId, range:range)
query.valueInputOption = "USER_ENTERED"
service.executeQuery(query) { (ticket, any, error) in
if let error = error {
print(error)
}
print(any)
print(ticket)
}
Я попытался использовать стандартный URLSession с заголовком authorization
, таким как
let data = ["range":"Sheet1!A1:D1", "majorDimension":"ROWS", "values": ["123","123","123","123"]] as [String : Any]
urlRequest.addValue("application/json", forHTTPHeaderField: "content-type")
urlRequest.addValue(GIDSignIn.sharedInstance()!.currentUser.authentication.accessToken, forHTTPHeaderField: "authorization")
urlRequest.httpBody = try! JSONSerialization.data(withJSONObject: data, options: .sortedKeys)
let session = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
if let error = error {
print(error)
} else {
print(String(data: data!, encoding: .utf8))
}
}.resume()
но это также не говорит мне, что мне нужно передать токен доступа.Кто-нибудь может посоветовать, как это должно работать?Кажется, я просто хожу по кругу с документами, и все другие примеры, которые я могу найти, похоже, используют методы / свойства, которые, кажется, не существуют!
Это текущие версии pod, которые я использую
Using GTMOAuth2 (1.1.6)
Using GTMSessionFetcher (1.2.0)
Using GoogleAPIClientForREST (1.3.6)
Using GoogleSignIn (4.2.0)
Using GoogleToolboxForMac (2.1.4)
И я вызываю метод для записи на лист только тогда, когда знаю, что у меня есть пользователь.
Спасибо