Работа с Google API в iOS приложении

При работе над одним из внутренних проектов возникла необходимость в работе с Google API, а именно: Google Sheets API и Google Drive API.
Для того, чтобы начать работу с приватными файлами, приложение должно быть авторизовано под пользователем, у которого есть доступ к этим файлам.

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

О том как работать с данными API и как максимально облегчить нам жизнь, и пойдет речь в данной статье.
Создание проекта в Google API Console:
Google API Console позволяет управлять различными процессами вашего проекта, такими как создание учетных данных, подключение необходимых API и менеджмент людей, которые работают над данным проектом.

При создании можно выбрать организацию, она будет стоять во главе иерархии проектов, созданных под ее доменом:
Указываем название проекта и его идентификатор, который нельзя изменить после создания. Обратите внимание, что бесплатно создавать проекты можно в ограниченном количестве:
Как только проект будет создан, переходим в панель управления и добавляем API, которые будем использовать, в нашем случае это Drive и Sheets APIs:
Создание учетных данных для проекта:
Каждый запрос в Google API должен сопровождаться уникальным идентификатором, который необходим, чтобы консоль могла привязать запросы к соответствующим проектам.

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

Протокол OAuth 2.0 позволяет запросить согласие пользователя на доступ приложения к его данным. Таким образом используя данный протокол мы можем получить доступ к профилю Google авторизованного пользователя и сгенерировать токен, содержащий уникальный идентификатор, который мы и будем использовать для аутентификации и получения доступа к приватным файлам.

Как API ключ, так и идентификатор клиента OAuth можно создать в разделе учетных данных, но во втором случае нужно сперва настроить окно запроса доступа OAuth. При создании идентификатора клиента OAuth необходимо обратить внимание на тип приложения и на идентификатор пакета, который нельзя будет изменить после завершения настройки. Чтобы найти идентификатор пакета, именуемый Bundle Identifier, нужно в XCode перейти в раздел Identity вашего проекта:
Необходимо скачать plist файл вашего идентификатора OAuth, в котором содержатся два ключа, которые мы будем использовать в дальнейшем.
Реализация обобщенных методов
Для того, чтобы прочесть публичную таблицу, нужно отправить запрос: GET https://sheets.googleapis.com/v4/
spreadsheets/{spreadsheetId}/
values:batchGet
, где spreadsheetId - это id нужной таблицы. Также можно указать дополнительные параметры:

  • APIKey - ключ, который необходимо указать, чтобы произвести чтение
  • ranges - диапазон значений, который нужно получить
  • majorDimension - измерение, в котором будет считывание, а именно ряды или столбцы
В нашем примере будем использовать данную таблицу:
Указав в параметрах диапазон значений A1:Z и считывание по рядам, получаем в ответ JSON:
Чтобы произвести запись, необходимо авторизовать пользователя с помощью OAuth и указать OAuth токен в виде параметра access_token. В данном случае уже не нужно будет указывать API ключ.
Запись в публичную таблицу производится посредством запроса:POST https://sheets.googleapis.com/v4/
spreadsheets/{spreadsheetId}/
values:batchUpdate
. Также нужно указать обязательные параметры в теле запроса:

  • valueInputOption - то, как ваши данные будут интерпретироваться, а именно, будут ли они подвергаться форматированию или останутся такими, какими их ввел пользователь
  • data
В свою очередь data также состоит из массива valueRanges:

  • range
  • majorDimension
  • values - массив массивов, в котором будут указаны значение, которые необходимо записать
Отправляем в теле запроса данный JSON:
Производится запись в таблицу:
Интеграция Google Sign-In:
Google Sign-In - фреймворк, позволяющий интегрировать авторизацию через Google в вашем сервисе, для нас он особенно интересен тем, что очень упрощает работу с OAuth. После авторизации пользователя, вы сможете получить доступ к его профилю Google, токен, который при работе с Google API мы будем отправлять в запросе, а также запросить разрешения на работу с файлами данного пользователя.
Установка Google Sign-In с помощью CocoaPods:
  • в директории вашего проекта в терминале вводим: -pod init
  • указываем в созданном Podfile pod 'GoogleSignIn'
  • вводим в терминале -pod install
Переходим в раздел Info --> URL Types и создаем новый тип ссылки, которая будет обрабатывать callback. В URL Scheme указываем ваш ключ REVERSED_CLIENT_ID:
Наиболее простым способом будет настроить основные процессы данного фреймворка в AppDelegate, но учитывая, что его методы будут вызываться достаточно часто, то рекомендуется вынести его в отдельный сервис.

Импортируем GoogleSignIn:
Указываем ключ CLIENT_ID и обозначаем делегат, который в нашем случае будет сервисом:
Имплементируем метод application:openURL:options: в AppDelegate:
Реализуем протокол GIDSignInDelegate, обозначая данные методы:
Создаем кнопки для авторизации:
Чтение/запись в закрытый файл таблицы:
Производить чтение таблицы можно как напрямую, указав в запросе ее id, так и сперва получить список файлов на Google Drive, узнать id нужного файла и уже тогда прочесть его. Рассмотрим второй вариант.
Получаем список файлов: GET https://www.googleapis.com/drive/
v3/files


В параметрах указываем:

  • access_token - токен OAuth, который получаем с помощью Google Sign-In
  • q - параметр поиска, который может объединить один или несколько параметров для фильтрации. Для нашего примера нужен будет mimeType, чтобы отображать только Spreadsheets
Получаем список нужных файлов:
Чтение с закрытой таблицы производится так же, как и с публичной, нужно лишь вместо API ключа использовать токен OAuth.

Пример записи в закрытую таблицу с помощью iOS приложения:
Спасибо за внимание!