GoogleSignIn IOS добавить в листы Google - PullRequest
0 голосов
/ 11 октября 2018

В настоящее время я работаю над приложением для 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)

И я вызываю метод для записи на лист только тогда, когда знаю, что у меня есть пользователь.

Спасибо

1 Ответ

0 голосов
/ 11 октября 2018

Для всех, кто сталкивался с подобными проблемами, мне удалось заставить это работать с GoogleAPIClient.

Проблема заключается в том, что Swift без вывода сообщений отбрасывает импорт для предварительных объявлений.

Таким образом, вам нужен соединительный заголовок, как показано ниже

#import <GTMSessionFetcher/GTMSessionFetcher.h>
#import <GTMSessionFetcher/GTMSessionFetcherService.h>

, и его необходимо импортировать перед платформой APIClient в любом классе, в котором вы его используете.

Например,

import GTMSessionFetcher
import GoogleAPIClientForREST
import GoogleSignIn

тогда вы сможете получить доступ к свойству authorizer и методу fetcherAuthorizer()!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...