Apollo-iosをバージョンアップしてcodegenでエラーが大量に出た時

apollo-ios 0.12.0から0.15.0にアップロードしたところエラーが大量に出てしまったためメモです。

リリースノートを見るといくつかの破壊的変更が入っていました。

変更内容

  • Apollo CLI を 1.9 から 2.17 に変更、これによってcodegenのコマンド引数が変更が必要
  • ApolloClientの引数に渡すHTTPNetworkTransportの引数が変更。これによって様々な機能をサポート(詳細は0.15.0のリリースノート)

apollo, apollo-codegen-swift のバージョンを上げましょう。

# apollo-ios 0.15.0 の場合
# Globalにインストールするかどうかはお任せします。チーム開発であれば、localでpackage.jsonで管理した方が良いでしょう。
$ npm install --save-dev apollo@2.17.0 apollo-codegen-swift@0.35.0

BREAKING, SUPER-BREAKING
この文字が入った、リリースノートには破壊的変更が入っているので、ソースコードの修正が必要になります。しっかり目を通しておきましょう。

ApolloClient

before

let apollo = ApolloClient(networkTransport: HTTPNetworkTransport(url: url, configuration: configuration))

after

// configuration -> urlSession になっています。特に使っていなければdefaultが使われるので指定する必要はありません。
let apollo = ApolloClient.init(networkTransport: HTTPNetworkTransport.init(url: url))

BuildPhase codegen shell script

$APOLLO_FRAMEWORK_PATH/check-and-run-apollo-cli.sh codegen:generate --queries="$(find . -name '*.graphql')" --schema=schema.json API.swift
$APOLLO_FRAMEWORK_PATH/check-and-run-apollo-cli.sh codegen:generate --target=swift --includes=./*.graphql --localSchemaFile="schema.json" API.swift

fetch

before

apollo.fetch(query: ABC.init(), resultHandler: { (result, error) in
}

after

let cancellable = apollo.fetch(query: ABC.init()) { result in
    switch result {
    case .failure(let error):
        if let resultError = error as? GraphQLResultError {
            // TODO:
        }
    case .success(let response):

    }
}

参考資料

Docs
https://www.apollographql.com/docs/ios/installation/

PullReq

https://github.com/apollographql/apollo-ios/pull/644/files