めっちゃメモ感あってすみません。
apolloを入れる
Carthageでいれる。Apollo.frameworkができるので、Projectに取り込む。
echo github \"apollostack/apollo-ios\" > Cartfile
carthage update --platform iOS
apollo-codegenでSwiftコードを生成する
後々説明するが、自分でapollo-codegenコマンドを叩きたい。
ここで注意したいのが、ApolloはApollo.framework
とapollo-codegen
のバージョンの一致性が非常に重要らしく、組み合わせが悪いと生成されたSwiftコードのビルドが全然通らない(実際通らなかった)。
2018/03/28現在だと、普通にcarthage update
やnpm 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
ファイルを作る。拡張子はなんでも良さそう。これにはquery
やmutation
を書く。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名のキャメルケース?]
}