🐥

Google Sign-In と GoogleAPIClientForREST で簡単 Google カレンダーアクセス

2021/07/07に公開

この記事の内容

iOS アプリで Google カレンダーにアクセスする方法の一つとして、GCP を介して Google Calendar API を利用するというものがあります。
この記事では「Google Sign-In」と「GoogleAPIClientForREST」という二つのライブラリを用いて Google OAuth 認証を行い、Google カレンダーからカレンダーの予定を取得する部分までの手順について説明します。

ライブラリの紹介・導入方法

まず今回利用する二つのライブラリについて簡単に説明します。

Google Sign-In

一つ目は「Google Sign-In」というライブラリです。
このライブラリを使うと Google の OAuth 認証を簡単に iOS アプリから行うことができます。
また、Google カレンダーから予定を取得するための権限なども簡単に取得することができます。

このライブラリを使って認証を行う際は、GCP から取得した「OAuth クライアント ID」と「URL スキーム」が必要になります。
この記事では GCP からそれらを取得する方法については説明しませんが、ググるとすぐに出てくるかなと思います。

GoogleAPIClientForREST

二つ目は「GoogleAPIClientForREST」というライブラリです。
こちらのライブラリは Google の様々な API へのアクセス・データの取得などを簡単にできるようにしてくれるものになっています。

先ほど紹介した「Google Sign-In」などのライブラリによって取得したログインユーザー情報を利用して、API にアクセスすることができます。
今回は Google Calendar API を利用する時にこのライブラリを使います。
Google Calendar API にアクセスするためには、認証の時と同じように GCP から設定してアクセスできるようにする必要がありますが、同じくこの記事では割愛します。

ライブラリの導入方法

「Google Sign-In」は Google から CocoaPods で導入することが推奨されており、「GoogleAPIClientForREST」も CocoaPods で導入することができるため、Podfile に以下のように記述して pod install を実行すればライブラリは導入完了です。

Podfile
pod 'GoogleSignIn'
# Calendar API にアクセスできれば良いため、このように記述している
pod 'GoogleAPIClientForREST/Calendar', "1.5.2"

二つのライブラリを用いて Google カレンダーにアクセスする

ここからは実際に先ほど紹介した二つのライブラリを利用した以下について説明します。

  • Google Sign-In を用いた OAuth 認証
  • GoogleAPIClientForREST を用いた予定の取得

Google Sign-In を用いた OAuth 認証

こちらについては、自分が説明するまでもなく公式ドキュメントに詳しく説明があるので、そちらを主に参照してもらえると良いかなと思います。

一応、今回は Google Calendar API を利用する関係上、OAuth 認証時に scopes というものを設定する必要があります。
こちらのスコープ一覧から必要に応じてスコープを以下のように設定した上で signIn メソッドを呼び出します。

let scopes = [
  "https://www.googleapis.com/auth/calendar.readonly",
  "https://www.googleapis.com/auth/calendar.events.readonly"
]

GIDSignIn.sharedInstance()?.scopes = scopes
GIDSignIn.sharedInstance()?.signIn()

これでカレンダーにアクセスできる権限を取得した上で OAuth 認証を行うことができるようになります。

また、気をつけなければいけないこととしては、GIDSignIn.sharedInstance() をはじめとした GIDSignIn 系のプロパティやメソッドの多くは implicitly unwrapped optional で型が表現されているため、nil である値にアクセスしないようにコードを書いていく必要があることかなと思います。(ドキュメントに記載されているサンプル通りに書くと、思わぬタイミングでクラッシュしてしまう可能性があるかもしれません)

GoogleAPIClientForREST を用いた予定の取得

前に説明した OAuth 認証を無事成功できている状態であれば、例えば以下のようなコードで GIDGoogleUser 型の値を取得できます。

let gidCurrentUser = GIDSignIn.sharedInstance()?.currentUser

この GIDGoogleUser 型の値を利用しつつ、GoogleAPIClientForREST でカレンダーから予定を取得するコードは以下のようになります。

import GoogleAPIClientForREST
import GoogleSignIn
// このモジュールは GoogleAPIClientForREST を導入すると利用できるようになります
import GTMSessionFetcher

// ...
let calendarService = GTLRCalendarService()
// calendarService に OAuth 認証済みのユーザーの情報をセットする
calendarService.authorizer = gidCurrentUser.authentication.fetcherAuthorizer()

// カレンダーの予定検索用の Query を条件を指定しつつ作成していく
let query = GTLRCalendarQuery_EventsList.query(withCalendarId: "primary") // primary を設定するとユーザーのプライマリカレンダーにアクセスできる
query.timeMin = GTLRDateTime(dateComponents: minDateComponents)
query.timeMax = GTLRDateTime(dateComponents: maxDateComponents)
query.orderBy = "startTime"
query.maxResults = 2500

calendarService.executeQuery(query) { _, calendarEvents, error in
  if let error = error {
    // エラー処理
  }
  
  guard let calendarEvents = calendarEvents as? GTLRCalendar_Events,
        let items = calendarEvents.items
  else { return }
  
  // items などを利用して、予定取得成功時の処理を書いていく
}

あくまで一例ではありますが、上記のようにするとカレンダーの予定を取得して様々な処理をアプリ上で行うことができるようになります。
「GoogleAPIClientForREST」でイベント用の型などは用意してくれているため、それを利用してコードを書いていくことができますが、View などで扱う際には適宜扱いやすいように変換していくと良さそうな気がします。

参考

Discussion