Apollo iOSを使ってGitHub API v4(GraphQL)クライアントを作る

Apollo iOSを試す

巷で話題のGraphQL。弊社でもGraphQL(AWS AppSync)を活用した案件も現れてきており、モバイルアプリ業界ではいま学ぶべき技術なのかなぁと思ったりしています。

GraphQLのiOS向けのクライアントとしてはやはりApollo。ということでGitHub API v4とApollo iOSを使って、GraphQLクライアントを試しに作ってみました。

AWS AppSyncがリリースされた直後に軽く触ってみたことがありましたが、現在試してみたところ個人的な感覚では数倍簡単に利用できるようになっていました。

サンプルコード

以下のサンプルコードを公開しています。こちらもご一緒に参考にしていただけると幸いです。

環境構築

まずはじめに、XcodeでiOSアプリプロジェクトはすでに作成済みとして進めます。CocoaPodsは使わず、CarthageのみでApolloをインストールします。

まずCarthageが入っていなければインストール。

$ brew install carthage
$ touch Cartfile

Cartfile にApollo iOSを書きます。

github "apollostack/apollo-ios"

ビルドを実行します。

$ carthage update --platform iOS

基本的なCarthageのライブラリ導入方法と同じです。出来上がった Carthage/Build/iOS/Apollo.framework をLinked Frameworks and Librariesに加えます。またBuild PhaseのRun Scriptに以下を追加し、InputFilesに $(SRCROOT)/Carthage/Build/iOS/Apollo.framework を加えます。

$ /usr/local/bin/carthage copy-frameworks

GitHubのトークンの取得

GitHub API v4からSchemaを取得したりする際にGitHubアカウントのトークンを取得しておく必要があります。Developer settingsのPersonal access tokensで新規に作成します。

GitHub API v4のSchemaの取得

次にGraphQLのSchemaを取得します。

GraphQLのSchemaは Apollo CLI を使って取得できます。

$ yarn global add apollo
$ apollo schema:download --endpoint="https://api.github.com/graphql" --header "Authorization: Bearer <GitHub Token>"

<GitHub Token> には前項で取得したGitHubトークンを設定しましょう。

APIクライアントコードの自動生成

GraphQLではSchemaの他に、クライアントからどのような呼び出し方を行うかを記述するGraphQLファイルを作成する必要があります。このファイルを作成することにより、APIクライアントのコードを自動生成できます。

まずGraphQLファイルは次のように書きます。これはGitHubのユーザーアカウントの情報の一部を取得しています。

query ShowViewer {
  viewer {
    id
    name
    email
    avatarUrl
    company
  }
}

あとは次のコマンドを実行すると API.swift (名前は自由)が生成できます。

$ apollo codegen:generate --queries=query.graphql --localSchemaFile=schema.json --target=swift API.swift

なおこのコマンドをRun Scriptに追加すると、デバッグ時に自動生成されるような仕組みにでき、便利です。

iOSアプリの実装

View ControllerにGraphQLにクエリを投げる処理を実装します。結果は適当に配置したLabelやImageViewに反映しています。

class ViewController: ApolloClientViewController {

    static let githubToken = "<GitHub Token>"

    let apollo: ApolloClient = {
        let configuration = URLSessionConfiguration.default
        configuration.httpAdditionalHeaders = ["Authorization": "Bearer \(ApolloClientViewController.githubToken)"]
        let url = URL(string: "https://api.github.com/graphql")!
        return ApolloClient(networkTransport: HTTPNetworkTransport(url: url, configuration: configuration))
    }()

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        apollo.fetch(query: ShowViewerQuery()) { [weak self] (result, error) in
            guard let strongSelf = self else { return }
            if let viewer = result?.data?.viewer {
                strongSelf.nameLabel.text = viewer.name
                do {
                    let url = URL(string: viewer.avatarUrl)!
                    let data = try Data(contentsOf: url)
                    strongSelf.imageView.image = UIImage(data: data)!
                } catch {
                    print(error)
                }
            }
        }
    }

}

動作結果

実行すると、以下のような感じでユーザー情報が取得できます。

GraphQL+Apolloで爆速開発をしよう

興味本位でApolloをiOSに導入してみましたが、非常に簡単に実行するところまででき、好感が持てました。通信処理が完全に自動生成で済むので、モバイルアプリエンジニアとしては非常に作りやすいと思います。

ぜひ皆さんもお試しください!