LoginSignup
5
6

More than 5 years have passed since last update.

SwiftのGraphQLClient Apolloを使う

Posted at

めっちゃメモ感あってすみません。

apolloを入れる

Carthageでいれる。Apollo.frameworkができるので、Projectに取り込む。

echo github \"apollostack/apollo-ios\" > Cartfile
carthage update --platform iOS

apollo-codegenでSwiftコードを生成する

後々説明するが、自分でapollo-codegenコマンドを叩きたい。
ここで注意したいのが、ApolloはApollo.frameworkapollo-codegenのバージョンの一致性が非常に重要らしく、組み合わせが悪いと生成されたSwiftコードのビルドが全然通らない(実際通らなかった)。
2018/03/28現在だと、普通にcarthage updatenpm installをすると、Apollo.frameworkはv0.8.0、apollo-codegenはv0.19.0が入る。
ただ、Apollo.frameworkにあったapollo-codegenのバージョンはv0.18系みたいで、動かなくて苦しんだ。

では、最適なバージョンはどこで知るんだという話だが、ざっと見た感じ公式サイトには書いてなかった。
あさってみたところ、BuildPhasesに設定する話が公式サイトには載ってて、
ここではshellでバージョンチェックをしているらしい。このshellはApollo.framework/check-and-run-apollo-codegen.shにあって、この中を読んでみると、1行目にこんなことが書いてあった。見つけた。

REQUIRED_APOLLO_CODEGEN_VERSION=0.18

このバージョンが必要らしい。ということで下記コマンドでapollo-codegenをインストール。

https://github.com/apollographql/apollo-codegen

$ npm info apollo-codegen # 0.18系で一番新しいバージョンを探す
$ npm i -g apollo-codegen@0.18.8

なんかいい感じにバージョン管理できるようにしたほうがいいな。apollo-codegenはglobalに入れるんじゃなくてちゃんとprojectのなかでpackage.jsonつかって管理しつつ、.framework内のバージョンと合わせる。最後が厄介だがとりあえず手運用でいっか。

schema.jsonの生成

叩きたいGraphQL APIからSchemaファイルを取得する。下記コマンドを叩く。

$ apollo-codegen introspect-schema [HOST]/graphql --output schema.json

ただ、HOSTがhttpsでオレオレ証明書を使っている場合(開発環境とか)はerror: Error while fetching introspection query result: request to https://oreore.com/graphql failed, reason: unable to verify the first certificateと怒られる。なので、--insecureオプションをつける。

$ apollo-codegen introspect-schema https://oreore.com/graphql --output schema.json --insecure

Swiftコードの生成

.graphqlファイルを作る。拡張子はなんでも良さそう。これにはquerymutationを書く。Xcodeのプロジェクト内においちゃったほうがまとめて管理できてよさそうなので、一旦./GraphQL/に置くことにする。

書いた.graphqlファイルをもとに、swiftコードをgenerateする。公式サイトにはBuildPhasesに書くように指定されているが、人によって利用しているTerminalの環境が違いすぎるので自分でコマンドを叩く。公式には下記が書いてあるが、これは適用範囲が広すぎてよろしくない。

$ apollo-codegen generate **/*.graphql --schema schema.json --output API.swift

こんな感じで範囲を絞るといい感じかもしれない。

$ apollo-codegen generate GraphQL/*.graphql --schema schema.json --output API.swift

実際に叩く

let url = URL(string: "YOUR URL")!
let client = ApolloClient(url: url)

client.perform(mutation: [上で作ったClass]) { result, error in
    // result.data.[上で作ったclass名のキャメルケース?]
}

参考

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6