Swift4でGoogleCalendarAPIを叩いてみた

#経緯
SwiftでGoogleAPIを利用する際のチュートリアル的な資料等があまりにも少ないと思ったのでこれから利用される方の参考になればいいなと考えたから。というか[iOS](https://developers.google.com/calendar/overview?hl=ja)はもはや表示すらされてないんだよなぁ...

#開発環境と手順
###開発環境
- Swift 4.1.2
- Xcode 9.4.1

###手順
大きく分けてGoogle API Console編,Xcode編,開発編です。
1つずつ進めていきましょう！
#Google API Consoleでの作業
[Google API Console](https://console.developers.google.com/flows/enableapi?apiid=calendar-json.googleapis.com)から以下の2つを登録します。2つともAPIを叩く上で必須の値なのでしっかりと入手しましょう！
この辺の設定はQiita等で記事が豊富なので駆け足でいきます。
##クライアントIDを登録
[こちらの方の記事](https://qiita.com/garagara-jp/items/df461947344bb76ee25f)を参考にクライアントIDを取得します。（わかりやすい記事本当にありがとうございます！！）
簡単にまとめますとプロジェクトを作成、認証情報を選択、クライアントIDを取得です。
画像でまとめますと以下の画面でクライアントIDを選択する。
<img width="1211" alt="スクリーンショット 2019-03-22 12.10.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/295919/c2c6f8f9-f1a9-8df2-4b58-761e2dee77b5.png">
そしてここでしっかりとiOSを選択、ご自身のアプリ名とバンドルIDもしっかり入力しましょう。
<img width="677" alt="スクリーンショット 2019-03-22 12.10.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/295919/639a8ecd-fe75-c51c-e075-3fe7731ee8b6.png">
その後表示されるクライアントIDをメモしておいてください。

##APIキーを取得
これは簡単です。
認証情報を作成の右を押して__APIキーを作成する__で表示されます。
こちらもメモしておいてください。

#Xcode での作業
どんどんいきます！！
ここでの作業は簡単です！
##ライブラリの導入
必要なライブラリはGoogleの認証用に`GTMAppAuth`,あとAPIを叩くように`Alamofire`,そのレスポンスように`SwiftyJSON`を導入します。

Podfileはこんな感じです。

``` ruby
platform :ios, '10.0'

target 'あなたのアプリ名'do
  
  use_frameworks!

  pod 'GTMAppAuth'
  pod 'Alamofire'
  pod 'SwiftyJSON'
end
```
##URL Typesの登録

Google APIsの認証情報ページから、先ほど作成した認証情報の詳細ページへいきます。
そして、「iOS の URL スキーム」欄にある値をコピーします。

Xcodeに戻り、InfoのURL Typesにて+を押し、URL Schemeの欄に値をペーストします。

#いざ開発　
ようやくコーディングに移れます！
認証部分とAPI叩く部分の二部構成です！
##Googleの認証
認証部分は[この方の記事](https://qiita.com/ryokkkke/items/dd04bea2b579c16a9b19)を参考にさせていただきました。(iOSでのGoogleAPI系の記事は少ないため本当に救われました。ありがとうございます。)

Delegateの部分は参考ページと同じように追記してください。
ViewControllerは

```swift:viewController
import UIKit
import AppAuth
import GTMAppAuth

class ViewController: UIViewController {
    
    private let scopes = ["https://www.googleapis.com/auth/calendar","https://www.googleapis.com/auth/calendar.readonly","https://www.googleapis.com/auth/calendar.events","https://www.googleapis.com/auth/calendar.events.readonly"]
    private let kClientID = "クライアントID"
    private let kRedirectURL = URL.init(string: "リバースクライアントID:/oauthredirect")
    private let configuration = GTMAppAuthFetcherAuthorization.configurationForGoogle()
    private var authorization: GTMAppAuthFetcherAuthorization?

    override func viewDidLoad() {
        super.viewDidLoad()
        let request = OIDAuthorizationRequest.init(configuration: configuration,
                                                   clientId: kClientID,
                                                   scopes: self.scopes,
                                                   redirectURL: kRedirectURL!,
                                                   responseType: OIDResponseTypeCode,
                                                   additionalParameters: nil)
        let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
        print("Initiating authorization request with scope: \(request.scope!)")

        appDelegate.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request,
            presenting: self,
            callback: { (authState, error) in if (authState != nil) {
            // 認証情報オブジェクトを生成
            self.authorization = GTMAppAuthFetcherAuthorization.init(authState: authState!)
            let accessToken = authState?.lastTokenResponse?.accessToken
            print("Authorization トークンを取得しました：\(String(describing: accessToken))")
                
            }
        })
    }
```
ほぼ参考通りです。ただAPIごとにスコープの部分が違うため、[Google APIs Explorer](https://developers.google.com/apis-explorer/#s/)を参考に自分に合うスコープを探してください。
今回はcalendar.events.listですので、４つのスコープを設定しました。
##AlamofileとSwiftyJSON
Googleでうまく返してくれる[ライブラリ](http://cocoadocs.org/docsets/GoogleAPIClientForREST/1.1.1/Classes/GTLRCalendar_Events.html)があるらしいですが、私はうまく扱えなかったのでAlamofire使ってAPIを叩きました！
alamofireがリクエストを送る部分は[Google APIs Explorer](https://developers.google.com/apis-explorer/#s/)の以下の画像の部分をコピペしてGoogle API Console編で取得したAPIキーをいれるとできます！
SwiftyJSONに関しては勉強のために使ってみましたが使いやすくてよかったです！

<img width="999" alt="スクリーンショット 2019-03-22 12.58.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/295919/e2d2d0dd-b585-eccb-563d-31c4cded66d3.png">

以下その実装コードになります。

```swift
Alamofire.request("https://www.googleapis.com/calendar/v3/calendars/メールアドレス/events?key=あなたのAPIキー", method:.get)
            .responseJSON{response in
                let json = JSON(response.result.value)
                json["items"].forEach{(_, data) in
                    let summary = data["summary"].string
                    print(summary)
                print("イベントの取得に成功しました。")
            }
        }
```

###その結果

<img width="181" alt="スクリーンショット 2019-03-13 16.04.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/295919/09b453aa-cce4-7276-e859-378e2165a8dd.png">
こんな風に取得できました！！


#あとがき
SwiftではじめてAPIを叩けたのですごい達成感を感じました。まだまだ勉強していくぞー！
ご質問、ご意見お待ちしております。
また完成品は[GitHub](https://github.com/ichiyuri/GoogleCalendarAPI)にも置いてありますので参考になれば。では！