Apollo iOS をセットアップする
Apollo iOS の入門セクションを参照して、Apollo iOS をプロジェクトに追加する方法を確認してください。
依存関係を追加する
Xcode で必要なパッケージを追加するには、以下の手順に従います:
ステップ 1: Apollo iOS パッケージを追加する
- Xcode で、File → Add Package Dependencies... に移動します
- 表示されたダイアログで、右上の検索フィールドに以下の URL をペーストします:
https://github.com/apollographql/apollo-ios.git- Xcode がパッケージメタデータを取得するまで待機します(10~30 秒かかる場合があります)。
- バージョン制約を設定する: バージョンドロップダウンを選択し、「Up to Next Major Version」 を選択します。範囲を
1.0.0から開始し、上限を2.0.0に設定します。これにより、AWS AppSync Apollo Extensions ライブラリで必要な Apollo iOS 1.x が取得されることを確認します。Apollo iOS 2.x は使用しないでください。 - 「Add Package」 を選択します。
- プロダクト選択ダイアログで、「Apollo」 チェックボックスにチェックを入れます。アプリターゲットが選択されていることを確認します。「Add Package」 を選択します。
ステップ 2: AWS AppSync Apollo Extensions パッケージを追加する
- File → Add Package Dependencies... に移動します
- 以下の URL をペーストします:
https://github.com/aws-amplify/aws-appsync-apollo-extensions-swift.git- バージョンを
1.0.0から 「Up to Next Major Version」 に設定します。 - 「Add Package」 を選択し、「AWSAppSyncApolloExtensions」 を選択してターゲットに追加します。
ステップ 3: Amplify Auth を保持する(必要な場合)
認証に Amplify を使用する場合、既存の amplify-swift パッケージはプロジェクトに既に含まれているはずです。AWSPluginsCore がターゲットの Frameworks, Libraries, and Embedded Content に追加されていることを確認します。Apollo クライアントを Cognito 認証で設定する場合に AuthCognitoTokensProvider に必要です。確認するには:
- ナビゲータで 青いプロジェクトアイコン を選択し、TARGETS の下のアプリを選択し、General タブを選択します。
- Frameworks, Libraries, and Embedded Content までスクロールします。
AWSPluginsCoreがリストされていない場合、+ (プラス) ボタンを選択し、リストから選択します。
パッケージの概要
| パッケージ | URL | バージョン | 追加するプロダクト |
|---|---|---|---|
| Apollo iOS | https://github.com/apollographql/apollo-ios.git | 1.0.0..<2.0.0 | Apollo |
| AWS AppSync Apollo Extensions | https://github.com/aws-amplify/aws-appsync-apollo-extensions-swift.git | 1.0.0..<2.0.0 | AWSAppSyncApolloExtensions |
| Amplify Swift (Amplify Auth を使用する場合) | https://github.com/aws-amplify/amplify-swift.git | 既存を保持 | AWSPluginsCore |
Apollo iOS CLI をインストールする
Apollo iOS CLI (apollo-ios-cli) はコード生成に使用されます。Homebrew では利用できません。以下の方法のいずれかで取得できます:
- GitHub Releases からダウンロード(推奨):Apollo iOS Releases に移動し、Apollo iOS ライブラリバージョンと一致するリリースを見つけ、リリースアセットから
apollo-ios-cli.tar.gzアセットをダウンロードします。
ダウンロード後:
# アーカイブからバイナリを抽出tar -xzf apollo-ios-cli.tar.gz
# バイナリを実行可能にする(macOS では必要な場合があります)chmod +x apollo-ios-cli
# プロジェクトディレクトリに移動します(apollo-codegen-config.json と同じレベル)mv apollo-ios-cli /path/to/your/project/- ソースからビルドする:一致するタグで
apollo-iosリポジトリをクローンし、CLI をビルドします。
コード生成
schema.json と .graphql オペレーションファイルをプロジェクトの graphql/ サブディレクトリに配置します(スキーマと GraphQL オペレーションページで行っているはずです)。プロジェクトディレクトリは以下のようになります:
YourProject/├── YourProject.xcodeproj├── schema.json├── apollo-ios-cli├── apollo-codegen-config.json├── graphql/│ ├── fragments.graphql│ ├── mutations.graphql│ ├── queries.graphql│ └── subscriptions.graphql└── YourProject/ └── (your Swift source files)設定を初期化して変更することも、apollo-codegen-config.json を直接作成することもできます。以下が必要な設定です:
{ "schemaNamespace": "ApolloCodeGen", "input": { "operationSearchPaths": [ "./graphql/fragments.graphql", "./graphql/mutations.graphql", "./graphql/queries.graphql", "./graphql/subscriptions.graphql" ], "schemaSearchPaths": [ "./schema.json" ] }, "output": { "testMocks": { "none": {} }, "schemaTypes": { "path": "./ApolloCodeGen", "moduleType": { "swiftPackageManager": {} } }, "operations": { "inSchemaModule": {} } }}Swift ファイルを生成します:
./apollo-ios-cli generateこれにより、生成されたすべてのタイプを含む Swift パッケージを含む ApolloCodeGen ディレクトリが作成されます。
生成されたコードを Xcode プロジェクトに追加する
コード生成の後、生成された Swift パッケージをプロジェクトに追加します:
- Xcode で、File → Add Package Dependencies... に移動します
- ダイアログの 左下 で、「Add Local...」 ボタンを選択します(これは上部の URL 検索フィールドではありません)。
- ファイルピッカーで、プロジェクト内の生成された
ApolloCodeGenディレクトリに移動して選択します。 - Xcode はこれをローカル Swift パッケージとして認識します。「Add Package」 を選択します。
- ApolloCodeGen ライブラリプロダクトがアプリターゲットに追加されていることを確認します。自動的に表示されない場合、ターゲットの General タブ → Frameworks, Libraries, and Embedded Content → + (プラス) を選択 → リストから ApolloCodeGen を選択します。
Apollo クライアントを設定する
Apollo のランタイムコンポーネントは、認可モードとサブスクリプションプロトコルの処理を含む AWS AppSync に接続するように設定する必要があります。AWS AppSync Apollo Extensions ライブラリは必要なロジックを実装しています。
Amplify Gen 2 設定(amplify_outputs.json)を使用する
プロジェクトが Amplify Gen 2 を使用している場合(または Gen 1 設定を変換している場合—下記を参照)、AWSAppSyncConfiguration を使用してエンドポイントを読み取り、認可を自動的に設定できます。
API キー認証の場合:
let store = ApolloStore(cache: InMemoryNormalizedCache())// 1. amplify_outputs.json から AWS AppSync API 設定を読み取るlet configuration = try AWSAppSyncConfiguration(with: .amplifyOutputs)
// 2. APIKeyAuthorizer で configuration.apiKey を使用let authorizer = APIKeyAuthorizer(apiKey: configuration.apiKey ?? "")let interceptor = AppSyncInterceptor(authorizer)let interceptorProvider = DefaultPrependInterceptorProvider( interceptor: interceptor, store: store)
// 3. RequestChainNetworkTransport で configuration.endpoint を使用let transport = RequestChainNetworkTransport( interceptorProvider: interceptorProvider, endpointURL: configuration.endpoint)let apolloClient = ApolloClient( networkTransport: transport, store: store)Cognito ユーザープール認証の場合(所有者ベースの認可):
import AWSPluginsCore
let store = ApolloStore(cache: InMemoryNormalizedCache())let configuration = try AWSAppSyncConfiguration(with: .amplifyOutputs)
let authorizer = AuthTokenAuthorizer { let session = try await Amplify.Auth.fetchAuthSession() if let tokenProvider = session as? AuthCognitoTokensProvider { let tokens = try tokenProvider.getCognitoTokens().get() return tokens.accessToken } throw AuthError.unknown("Unable to get Cognito tokens")}
let interceptor = AppSyncInterceptor(authorizer)let interceptorProvider = DefaultPrependInterceptorProvider( interceptor: interceptor, store: store)let transport = RequestChainNetworkTransport( interceptorProvider: interceptorProvider, endpointURL: configuration.endpoint)let apolloClient = ApolloClient( networkTransport: transport, store: store)Amplify なし(または Gen 1 設定を保持)
設定形式を変換しない場合(例えば、Amplify Auth に既存の Gen 1 amplifyconfiguration.json を引き続き使用したい場合)、Apollo クライアントを手動で設定できます:
API キー認証の場合:
let store = ApolloStore(cache: InMemoryNormalizedCache())let authorizer = APIKeyAuthorizer(apiKey: "<your-api-key>")
let interceptor = AppSyncInterceptor(authorizer)let interceptorProvider = DefaultPrependInterceptorProvider( interceptor: interceptor, store: store)let transport = RequestChainNetworkTransport( interceptorProvider: interceptorProvider, endpointURL: URL(string: "<your-appsync-endpoint>")!)let apolloClient = ApolloClient( networkTransport: transport, store: store)Cognito ユーザープール認証の場合(トークン取得に Amplify Auth を使用):
Cognito 認証に Amplify を使用するが Apollo を手動で設定する場合、AppSync 設定からエンドポイント URL を指定し、AuthCognitoTokensProvider を使用して認証トークンを取得する必要があります:
import AWSPluginsCore
let store = ApolloStore(cache: InMemoryNormalizedCache())
// amplifyconfiguration.json または AppSync コンソールからエンドポイント URL を取得let endpointURL = URL(string: "<your-appsync-endpoint>")!
let authorizer = AuthTokenAuthorizer { let session = try await Amplify.Auth.fetchAuthSession() if let tokenProvider = session as? AuthCognitoTokensProvider { let tokens = try tokenProvider.getCognitoTokens().get() return tokens.accessToken } throw AuthError.unknown("Unable to get Cognito tokens")}
let interceptor = AppSyncInterceptor(authorizer)let interceptorProvider = DefaultPrependInterceptorProvider( interceptor: interceptor, store: store)let transport = RequestChainNetworkTransport( interceptorProvider: interceptorProvider, endpointURL: endpointURL)let apolloClient = ApolloClient( networkTransport: transport, store: store)