Apollo Kotlin のセットアップ
Apollo Kotlin には 2 つの主要コンポーネントが含まれています。スキーマとオペレーション ファイルを読み込んで型安全な Kotlin コードを生成する Gradle プラグインと、生成されたコードを使用してリクエストを実行するランタイム クライアントです。このページでは、依存関係の追加、Gradle プラグインの設定、Apollo クライアントのセットアップについて説明します。
依存関係を追加する
バージョン カタログ (gradle/libs.versions.toml) に以下を追加します。
[versions]apollo = "4.1.0"apolloAppsync = "1.0.0"
[libraries]apollo-runtime = { group = "com.apollographql.apollo", name = "apollo-runtime", version.ref = "apollo" }apollo-appsync = { group = "com.amplifyframework", name = "apollo-appsync", version.ref = "apolloAppsync" }apollo-appsync-amplify = { group = "com.amplifyframework", name = "apollo-appsync-amplify", version.ref = "apolloAppsync" }
[plugins]apollo = { id = "com.apollographql.apollo", version.ref = "apollo" }Apollo プラグインをルート build.gradle.kts に追加します。
plugins { // ... existing plugins alias(libs.plugins.apollo) apply false}プラグインと依存関係をアプリ build.gradle.kts に追加します。
plugins { // ... existing plugins alias(libs.plugins.apollo)}
dependencies { // Apollo Kotlin implementation(libs.apollo.runtime)
// AWS AppSync Apollo Extensions implementation(libs.apollo.appsync) implementation(libs.apollo.appsync.amplify)
// Keep your existing Amplify Auth dependencies (if using Amplify for auth) // implementation(libs.amplify.auth.cognito) // implementation(libs.amplify.api)}Apollo Gradle プラグインを設定する
詳細については Apollo Kotlin の入門セクションを参照し、すべての設定オプションについてはGradle プラグイン設定ドキュメントを参照してください。
Apollo 設定は以下のような形になります。
apollo { service("example") { packageName.set("com.example.appsync") schemaFile.set(file("src/main/graphql/schema.json"))
// Map AppSync custom scalars to Kotlin String. // Without this, fields like createdAt and updatedAt will be // generated as `Any` instead of `String`. // IMPORTANT: Only include scalars that are actually used in your schema. // Apollo will error on unknown scalars. Check your downloaded schema.json // to see which custom scalars your API uses. mapScalarToKotlinString("AWSDateTime") mapScalarToKotlinString("AWSTimestamp") // Add any of the following only if your schema uses them: // mapScalarToKotlinString("AWSDate") // mapScalarToKotlinString("AWSTime") // mapScalarToKotlinString("AWSEmail") // mapScalarToKotlinString("AWSJSON") // mapScalarToKotlinString("AWSURL") // mapScalarToKotlinString("AWSPhone") // mapScalarToKotlinString("AWSIPAddress") }}Apollo クライアントを設定する
Apollo のランタイム コンポーネントは、認可モードとサブスクリプション プロトコルの処理を含む AWS AppSync に接続するように設定する必要があります。AWS AppSync Apollo Extensions ライブラリは必要なロジックを実装します。
Amplify Gen 2 設定 (amplify_outputs.json) を使用する
プロジェクトが Amplify Gen 2 を使用している (または Gen 1 設定を変換している場合 — 以下の注記を参照) 場合、ApolloAmplifyConnector を使用してエンドポイントを読み込み、認可を自動的に設定できます。
API キー認証の場合:
val connector = ApolloAmplifyConnector(context, AmplifyOutputs(R.raw.amplify_outputs))val apolloClient = ApolloClient.Builder() .serverUrl(connector.endpoint.serverUrl.toString()) .addHttpInterceptor(AppSyncInterceptor(connector.apiKeyAuthorizer())) .build()Cognito ユーザー プール認証 (所有者ベースの認可) の場合:
val connector = ApolloAmplifyConnector(context, AmplifyOutputs(R.raw.amplify_outputs))val apolloClient = ApolloClient.Builder() .serverUrl(connector.endpoint.serverUrl.toString()) .addHttpInterceptor(AppSyncInterceptor(connector.cognitoUserPoolAuthorizer())) .build()Amplify Gen 1 設定 (amplifyconfiguration.json) を使用する — マニュアル エンドポイント
既存の Gen 1 amplifyconfiguration.json を Amplify 認証で使用し続け、設定形式を変換しない場合は、Apollo クライアントを手動で設定できます。仍然使用している Amplify (認証用) — Apollo エンドポイント設定のみを手動で行います。
API キー認証の場合:
val endpoint = AppSyncEndpoint("<your-appsync-endpoint>")val authorizer = ApiKeyAuthorizer("<your-api-key>")val apolloClient = ApolloClient.Builder() .serverUrl(endpoint.serverUrl.toString()) .addHttpInterceptor(AppSyncInterceptor(authorizer)) .build()Cognito ユーザー プール認証 (認証トークン取得に Amplify 認証を使用) の場合:
Cognito 認証にまだ Amplify を使用しているが Apollo を手動で設定している場合は、ApolloAmplifyConnector.fetchLatestCognitoAuthToken を使用して認証トークンを取得できます。このメソッドは Kotlin コルーチンではなく、コールバック ベースの Java Consumer パラメータを使用するため、suspendCoroutine でラップする必要があります。
import kotlin.coroutines.resumeimport kotlin.coroutines.resumeWithExceptionimport kotlin.coroutines.suspendCoroutine
val endpoint = AppSyncEndpoint("<your-appsync-endpoint>")val authorizer = AuthTokenAuthorizer { suspendCoroutine { cont -> ApolloAmplifyConnector.fetchLatestCognitoAuthToken( { token -> cont.resume(token) }, { error -> cont.resumeWithException(error) } ) }}
val apolloClient = ApolloClient.Builder() .serverUrl(endpoint.serverUrl.toString()) .addHttpInterceptor(AppSyncInterceptor(authorizer)) .build()