👏

Apollo iOSをXCode / Swiftに設定する方法

に公開

Apollo iOSでGraphQLのデータをフェッチするまでに1日弱かかったので、備忘録として記録します。
(別途、時間ができた時に写真等も整理する予定です。)

以下2つの記事を参考に進めました。
https://zenn.dev/u_dai/articles/e344a130919281
https://zenn.dev/u_dai/articles/e344a130919281

1. packagesからapollo-iosをインストールする

https://github.com/apollographql/apollo-ios.git

  1. XCodeのプロジェクト名で右クリック > Add Package Dependencies...
  2. 右上の検索欄に上記のGitHubのURLを貼り付け検索を実行
    Macの任意のディレクトリで以下を実行
  3. apollo-iosをAddPackage
  4. 「Apollo」と「ApolloWebSocket」のAddtoTargetでプロジェクトを選択し右下のAddPackageをクリックする
  5. XCodeのPackageDependenciesにApolloがあることを確認する
  6. XCodeのプロジェクト名で右クリック>(Apollo)Install CLIをクリック
    (この作業でプロジェクトのルートディレクトリにapollo-ios-cliがシンボリックリンクで作成されます)

2. スキーマファイルのダウンロード

curl -X POST \
-H "Content-Type: application/json" \
-H "x-hasura-admin-secret: xxxxxxxx" \
-d '{
  "query": "query IntrospectionQuery { __schema { queryType { name } mutationType { name } subscriptionType { name } types { ...FullType } directives { name description locations args { ...InputValue } } } } fragment FullType on __Type { kind name description fields(includeDeprecated: true) { name description args { ...InputValue } type { ...TypeRef } isDeprecated deprecationReason } inputFields { ...InputValue } interfaces { ...TypeRef } enumValues(includeDeprecated: true) { name description isDeprecated deprecationReason } possibleTypes { ...TypeRef } } fragment InputValue on __InputValue { name description type { ...TypeRef } defaultValue } fragment TypeRef on __Type { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } } } }"
}' \
https://dev.graphql.theamplium.com/v1/graphql \
-o schema.json
# data階層を外して上書きするコマンド(jqを使用)
jq '.data' schema.json > schema_cleaned.json && mv schema_cleaned.json schema.json

3. GraphQLのクエリドキュメントを作成

  1. ターミナルでXCodeのプロジェクトフォルダに移動する
  2. プロジェクトのルートディレクトリに「GraphQL」フォルダを作成
  3. 「GraphQL」フォルダの中に「documents」フォルダを作成
  4. 「documents」フォルダの中にクエリを記述した.graphqlファイルを作成
    (例) users.graphql
query GetUsers {
  users {
    id
  }
}

4. スキーマファイルをXCodeのプロジェクトにコピー

  1. 前手順で作成した「GraphQL」フォルダの下にschema.jsonを

5. apollo-codegen-config.jsonを作成しパッケージをgenerate

  1. apollo-codegen-config.jsonを「GraphQL」フォルダで作成する
{
  "schemaNamespace" : "AmpliumSchema",
  "input" : {
    "operationSearchPaths" : ["**/*.graphql"],
    "schemaSearchPaths" : ["schema.json"]
  },
  "output" : {
    "testMocks" : { "none" : {} },
    "schemaTypes" : {
      "path" : "./AmpliumSchema",
      "moduleType" : { "swiftPackage" : {} }
    },
    "operations" : { "inSchemaModule" : {} }
  },
  "schemaDownloadConfiguration": {
    "downloadMethod": {
      "introspection": {
        "endpointURL": "https://dev.graphql.theamplium.com/v1/graphql",
        "httpMethod": { "POST": {} },
        "httpHeaderFields": [
          {
            "name": "x-hasura-admin-secret",
            "value": "<secret key>"
          }
        ],
        "includeDeprecatedInputValues": false,
        "outputFormat": "JSON"
      }
    },
    "outputPath": "./schema.json"
  }
}
  1. パッケージをgenerateする
{apollo-ios-cliのパス} generate

6. XCodeにパッケージとして取り込む

  1. XCodeのプロジェクト名で右クリック > Add Package Dependencies...をクリック
  2. 画面下部の「Add Local」をクリック
  3. 前手順で生成したパッケージフォルダを選択
  4. XCodeのプロジェクト名をクリック
  5. Build PhasesのLink Binary With Librariesから先ほど追加したパッケージを選択

以降は以下記事と同じです。
https://zenn.dev/u_dai/articles/e344a130919281

以下は古い手順。

1. packagesからapollo-iosをインストールする

https://github.com/apollographql/apollo-ios.git

  1. XCodeのプロジェクト名で右クリック > Add Package Dependencies...
  2. 右上の検索欄に上記のGitHubのURLを貼り付け検索を実行
    Macの任意のディレクトリで以下を実行
  3. apollo-iosをAddPackage
  4. 「Apollo」と「ApolloWebSocket」のAddtoTargetでプロジェクトを選択し右下のAddPackageをクリックする
  5. XCodeのPackageDependenciesにApolloがあることを確認する
  6. XCodeのプロジェクト名で右クリック>(Apollo)Install CLIをクリック
    (この作業でプロジェクトのルートディレクトリにapollo-ios-cliがシンボリックリンクで作成されます)

2. スキーマファイルのダウンロード

  1. Macの任意のディレクトリで以下を実行
npm install -g apollo
npm install -g graphql
  1. GraphQLサーバーからschemaをダウンロード
    今回はHasuraでGraphQLサーバーを構築したため以下のコマンドを実行しています
npx apollo schema:download --endpoint={https://...} schema.json --header="x-hasura-admin-secret: {YOUR_SECRET}"

3. GraphQLのクエリドキュメントを作成

  1. ターミナルでXCodeのプロジェクトフォルダに移動する
  2. プロジェクトのルートディレクトリに「GraphQL」フォルダを作成
  3. 「GraphQL」フォルダの中に「documents」フォルダを作成
  4. 「documents」フォルダの中にクエリを記述した.graphqlファイルを作成
    (例) users.graphql
query GetUsers {
  users {
    id
  }
}

4. スキーマファイルをXCodeのプロジェクトにコピー

  1. 前手順で作成した「GraphQL」フォルダの下にschema.jsonを

5. apollo-codegen-config.jsonを作成しパッケージをgenerate

  1. 「GraphQL」フォルダでapollo-codegen-config.jsonを作成する
{apollo-ios-cliのパス} init --schema-namespace {任意のネームスペース名} --module-type swiftPackageManager --target-name {XCodeのプロジェクトのTargetName}
  1. 生成されたapollo-codegen-config.jsonのschemaSearchPathsを./schema.jsonに修正する
{
  "schemaNamespace" : "{任意のネームスペース名}",
  "input" : {
    "operationSearchPaths" : [
      "**/*.graphql"
    ],
    "schemaSearchPaths" : [
      "./schema.json"
    ]
  },
  "output" : {
    "testMocks" : {
      "none" : {
      }
    },
    "schemaTypes" : {
      "path" : "./{任意のネームスペース名}",
      "moduleType" : {
        "swiftPackageManager" : {
          "name" : "{XCodeのプロジェクトのTargetName}"
        }
      }
    },
    "operations" : {
      "inSchemaModule" : {
      }
    }
  }
}
  1. パッケージをgenerateする
{apollo-ios-cliのパス} generate

6. XCodeにパッケージとして取り込む

  1. XCodeのプロジェクト名で右クリック > Add Package Dependencies...をクリック
  2. 画面下部の「Add Local」をクリック
  3. 前手順で生成したパッケージフォルダを選択
  4. XCodeのプロジェクト名をクリック
  5. Build PhasesのLink Binary With Librariesから先ほど追加したパッケージを選択

以降は以下記事と同じです。
https://zenn.dev/u_dai/articles/e344a130919281

Discussion