Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swiftでもapollo-iosで快適にGraphQL

 Swiftでもapollo-iosで快適にGraphQL

ymanya

May 15, 2019
Tweet

More Decks by ymanya

Other Decks in Programming

Transcript

  1. 11 schema.json取得 • Apolloのツールを使うことで GraphQLスキーマの取得や、クエリから Swiftファイルを生成するのが コマンドで簡単にできるようになります • ツールはnpmパッケージとして提供されているので node.jsなどが必要となります

    npm init # 以下対話的に聞かれるのでプロジェクトに合わせて入力ください ... # Apolloのツールをインストール npm install --save-dev [email protected] # ENDPOINTで指定したGraphQLサーバーからスキーマファイルをダウンロードし、 schema.jsonとして保存します # このスキーマファイルがクエリやミューテーションでどういう値を受け付けるかを持っている ので、コード生成のときに使用されます # なお、最新版だと公式 Docsと少しコマンドが違うので注意です npx apollo service:download --endpoint=$ENDPOINT schema.json
  2. 13 schema.jsonとGraphQLクエリからSwiftファイルを生成 • このクエリを実行できる Swiftコードをapolloのツールからコマンド一つで生成します # クエリやミューテーションが書かれた graphqlファイルとスキーマファイルから、 Swiftのコードを生成しま す

    # namespace指定することで生成されるコードの enumの名前を任意にすることができます。 npx apollo client:codegen ./GraphQLAPI.swift --target=swift --queries=./*.graphql --localSchemaFile=./schema.json --namespace=GraphQLAPI
  3. 14 schema.jsonとGraphQLクエリからSwiftファイルを生成 • GraphQLスキーマの情報から、 Swiftコード上で も型定義されており、個人的には JavaScriptより もプログラミングしやすかったです • もちろん、GraphQLのEnumeration

    typesも Swiftのenumに変換されます • すごく簡略化していますが、上のクエリはこんな 感じで変換されます public enum GraphQLAPI { ... public final class SearchRoomsQuery: GraphQLQuery { ... public var page: Int? ... public struct Data: GraphQLSelectionSet { ... public struct SearchRoom: GraphQLSelectionSet { ... public var results: [Result?]? { ... } public struct Result: GraphQLSelectionSet { ... public var id: Int? { get { return resultMap["id"] as? Int } set { resultMap.updateValue(newValue, forKey: "id") } } ... } ... } ... } ... } ... }
  4. 16 ApolloClientを生成し、あとはクエリを実行する • 以下のようなコードで ApolloClientを生成 し、あとはクエリを実行します • 実際のコードではシングルトンで Apolloク ライアントを保持するようにしました

    // 追加したいHTTPヘッダがあれば var apiHeaders: [AnyHashable : Any] = [ "Accept-Language": NSLocale.current.identifier, "Accept-Timezone": NSTimeZone.default.identifier ] let configuration: URLSessionConfiguration = .default configuration.httpAdditionalHeaders = apiHeaders // GRAPHQL_ENDPOINTに接続するApolloクライントを生成 let graphqlClient = ApolloClient(networkTransport: HTTPNetworkTransport(url: URL(string: GRAPHQL_ENDPOINT)!, configuration: configuration)) // 先程のクエリとクライアントでこのようにデータ取得ができます graphqlClient.fetch(query: searchRoomsQuery) { (result, error) in guard let rooms = result?.data?.searchRooms?.results, error == nil else { // エラー時の処理 print(error) return } // 正常に取得できた時の処理 print(rooms) }
  5. 24 開発に便利なツール • XcodeでGraphQLファイルのシンタックスハイライトしてくれる Apollo製のプラグイン ◦ https://github.com/apollographql/xcode-graphql • GraphiQL /

    Insomnia ◦ スキーマを確認しながら、クエリを書き、その場で叩くこともできるツール ◦ GraphiQLはブラウザの拡張機能のほか スタンドアロンアプリ もあります ◦ REST APIも叩けるInsomniaも弊社では人気です • ビルド時に自動的にクエリファイルから Swiftコードを生成する設定もあります ◦ https://www.apollographql.com/docs/ios/installation.html#adding-build-step ◦