クライアントコード生成
Codegenは、iOSおよびAndroid用のネイティブコードを生成し、FlowおよびTypeScript用の型生成をサポートしています。また、GraphQLステートメント(クエリ、ミューテーション、サブスクリプション)を生成できるため、手動でコーディングする必要がありません。
Codegen addワークフローは、AppSync APIがクラウドにプッシュされるときに自動的にトリガーされます。AppSync APIが作成されるときにコード生成を設定するかどうかが尋ねられ、コード生成をオプトインした場合、その後のプッシュでは、変更がクラウドにプッシュされた後に生成されたコードを更新するかどうかが尋ねられます。
プロジェクトがコード生成を使用するように構成されている場合、すべての設定は.graphqlconfig.ymlファイルにプロジェクトのルートフォルダに保存されます。型を生成するとき、codegenはGraphQLステートメントを入力として使用します。GraphQLステートメントで使用されている型のみが生成されます。
ステートメントの深さ
以下のスキーマでは、Comment -> Post -> Blog -> Post -> Comments間の接続があります。ステートメントを生成するとき、codegenは深さトラバーサルのデフォルト制限が2です。ただし、2レベルより深く進む必要がある場合は、codegenをセットアップするときにmaxDepthパラメータを変更するか、codegenに--maxDepthパラメータを渡すことができます。
type Blog @model { id: ID! name: String! posts: [Post] @connection(name: "BlogPosts")}type Post @model { id: ID! title: String! blog: Blog @connection(name: "BlogPosts") comments: [Comment] @connection(name: "PostComments")}type Comment @model { id: ID! content: String post: Post @connection(name: "PostComments")}query GetComment($id: ID!) { getComment(id: $id) { # depth level 1 id content post { # depth level 2 id title blog { # depth level 3 id name posts { # depth level 4 items { # depth level 5 id title } nextToken } } comments { # depth level 3 items { # depth level 4 id content post { # depth level 5 id title } } nextToken } } }}一般的な使用方法
amplify add codegen
amplify add codegenamplify add codegenにより、AWSコンソールを使用して作成されたAppSync APIを追加できます。APIが現在のリージョンとは異なるリージョンにある場合、コマンドはリージョンを選択するよう求めます。初期化されたamplifyプロジェクトの外でcodegenを追加する場合は、codegenの追加呼び出しと同じディレクトリにschema.jsonという名前のイントロスペクションスキーマを提供してください。注意: --apiIdフラグを使用して、AWSコンソールで作成されたような外部で作成されたAppSync APIを追加する場合、スキーマ更新を実行するときにamplify api updateなどのコマンドを使用してAmplify CLIからこのAPIを管理することはできません。初期化されたプロジェクトの外で外部AppSync APIを追加することはできません。
amplify configure codegen
amplify configure codegenamplify configure codegenコマンドにより、プロジェクトに追加された後、コード生成設定を更新できます。初期化されたプロジェクトの外では、このコマンドを使用して、プロジェクト設定およびコード生成設定を更新できます。
amplify codegen statements
amplify codegen statements [--nodownload] [--maxDepth <int>]amplify codegen statementsコマンドは、GraphQLスキーマに基づいてGraphQLステートメント(クエリ、ミューテーション、サブスクリプション)を生成します。このコマンドは実行するたびにイントロスペクションスキーマをダウンロードしますが、--nodownloadフラグを渡すことで、以前にダウンロードされたイントロスペクションスキーマを使用するように強制できます。
amplify codegen types
amplify codegen typesamplify codegen types [--nodownload]コマンドは、Flowおよびtypescript用のGraphQLtypesとiOSプロジェクトのSwiftクラスを生成します。このコマンドは実行するたびにイントロスペクションスキーマをダウンロードしますが、--nodownloadフラグを渡すことで、以前にダウンロードされたイントロスペクションスキーマを使用するように強制できます。
amplify codegen
amplify codegen [--maxDepth <int>]amplify codegen [--nodownload]は、GraphQLstatementsとtypesを生成します。このコマンドは実行するたびにイントロスペクションスキーマをダウンロードしますが、--nodownloadフラグを渡すことで、以前にダウンロードされたイントロスペクションスキーマを使用するように強制できます。初期化されたamplifyプロジェクトの外でcodegenを実行している場合、schema.jsonという名前のイントロスペクションスキーマは、amplify codegenを実行するのと同じディレクトリにある必要があります。このコマンドは、amplifyプロジェクトの外にいるときはイントロスペクションスキーマをダウンロードしません。提供されたイントロスペクションスキーマのみを使用します。
ワークフロー
codegenの機能の設計は、APIを作成または更新するときなど、アプリ開発ライフサイクルのさまざまなポイントで実行するメカニズムを提供します。また、APIはそのままにして、アプリのデータ取得要件を更新する場合にも独立して実行できます。さらに、スキーマが別の人によって更新または管理されるチームで作業することも可能です。最後に、codegenをビルドプロセスに含めて、自動的に実行することもできます(Xcodeなど)。
フロー1: APIを作成してからコードを自動的に生成
amplify initamplify add api (select GraphQL)amplify push以前と同じ質問が表示されますが、GraphQLステートメントを生成してcodegenを実行するかどうかが自動的に尋ねられるようになります。また、Androidプロジェクトの./app/src/mainディレクトリも尊重します。AppSync展開の完了後、Swiftファイルは自動的に生成され(Androidの場合はGradle Build手順をキックオフする必要があります)、アプリですぐに使用を開始できます。
フロー2: GraphQLスキーマを変更し、プッシュしてからコードを自動的に生成
開発中に、イテレーティブな開発/テストサイクルの一部として、GraphQLスキーマと生成されたコードを更新することもできます。amplify/backend/api/<apiname>/schema.graphqlでスキーマを変更して保存してから、次を実行します:
amplify push毎回、APIのコードを更新するかどうかが尋ねられ、また新しいスキーマからのGraphQLステートメントの再生成を含めて、codegenを再度実行するかどうかが尋ねられます。
フロー3: APIの変更なし、GraphQLステートメントとコードを更新するのみ
GraphQLの利点の1つは、クライアントがAPIとは独立してデータ取得要件を定義できることです。Amplify codegenは、GraphQLステートメントの選択セット(例えば、波括弧の内側のフィールドを追加/削除)を変更して、型生成を再度実行することでこれをサポートしています。これにより、アプリケーションが行うネットワークリクエストを細かく制御できます。GraphQLステートメント(変更していない場合はデフォルトで./graphqlフォルダ内)を変更して、ファイルを保存してから、次を実行します:
amplify codegen types新しい更新されたSwiftファイルが作成されます(または、Androidで同じことをするためにGradle Buildを実行します)。その後、アプリケーションコードで更新を使用できます。
フロー4: 共有スキーマ、他の場所で変更(例:コンソールまたはチームワークフロー)
チームで作業していて、スキーマがAWS AppSyncコンソールから、または別のシステムで更新されているとします。GraphQLステートメントが古いスキーマから生成されたため、型は現在古くなっています。これを解決する最も簡単な方法は、GraphQLステートメントを再生成し、必要に応じて更新してから、型を再度生成することです。コンソールまたは別のシステムでスキーマを変更してから、次を実行します:
amplify codegen statementsamplify codegen types新しく生成されたGraphQLステートメントと、スキーマの更新に一致するSwiftコードが必要です。2番目のコマンドを実行した場合、型も更新されます。または、amplify codegenを単独で実行すれば、これらの両方のアクションを実行します。
フロー5: 初期化されたプロジェクトの外のイントロスペクションスキーマ
amplifyプロジェクトを初期化せずにステートメントと型を生成する場合は、プロジェクトディレクトリにschema.jsonという名前のイントロスペクションスキーマを提供し、同じディレクトリからcodegenを追加することで実行できます。AppSync apiからイントロスペクションスキーマをダウンロードするには、AppSyncコンソールのスキーマエディタに移動し、「Export schema」の下でschema.jsonを選択します。
amplify add codegencodegenが追加された後、イントロスペクションスキーマを更新してから、プロジェクト情報を再度入力せずにステートメントと型を再度生成できます。
amplify codegen必要に応じてプロジェクトとコード生成設定を更新できます。
amplify configure codegenamplify codegeniOSの使用方法
このセクションでは、Swiftで書かれたiOSプロジェクトを使用し、Amplifyとともに、AWS AppSyncを使用したGraphQL APIを追加するために必要な手順について説明します。初めてユーザーの場合は、新しいXcodeプロジェクトと単一のViewController から始めることをお勧めします。
セットアップ
Amplify Getting Startedを完了した後、ターミナルでXcodeプロジェクトディレクトリに移動し、以下を実行します:
amplify init ## Select iOS as your platformamplify add api ## Select GraphQL, API key, "Single object with fields Todo application"amplify push ## Sets up backend and prompts you for codegen, accept the defaults上記のadd apiフロー中に、注釈付きGraphQLスキーマがすでに存在するかどうかなどの質問が表示されます。CLIを初めて使用する場合は、いいえを選択し、以下で使用されるデフォルトプロジェクト**「Single object with fields (e.g., "Todo" with ID, name, description)」**を通じてガイドされます。後で常に変更できます。
APIを追加したので、amplify pushプロセスはcodegenプロセスに自動的にプロンプトを表示し、設定オプションをガイドします。デフォルトを受け入れると、ルートディレクトリにAPI.swiftという名前のファイル(別の名前を選択しない限り)と、ドキュメント付きのgraphqlディレクトリが作成されます。AppSyncクライアントが初期化に使用するawsconfiguration.jsonファイルも含まれます。
次に、PodfileをAWS AppSync SDKの依存関係で変更します:
target 'PostsApp' do use_frameworks! pod 'AWSAppSync'endターミナルからpod installを実行し、*.xcworkspaceXcodeプロジェクトを開きます。API.swiftとawsconfiguration.jsonファイルをプロジェクトに追加し(File->Add Files to ..->Add)、プロジェクトをビルドして問題がないことを確認します。
AppSyncクライアントの初期化
アプリケーションデリゲート内は、AppSyncクライアントを初期化するのに最適な場所です。AWSAppSyncServiceConfigはawsconfiguration.jsonファイルに存在する設定情報を表しています。デフォルトでは、Defaultセクションの情報が使用されます。以下のようなAWSAppSyncClientConfigurationとAWSAppSyncClientを作成する必要があります:
import AWSAppSync
@UIApplicationMainclass AppDelegate: UIResponder, UIApplicationDelegate {
var appSyncClient: AWSAppSyncClient?
func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool {
do { // You can choose your database location if you wish, or use the default let cacheConfiguration = try AWSAppSyncCacheConfiguration()
// AppSync configuration & client initialization let appSyncConfig = try AWSAppSyncClientConfiguration( appSyncServiceConfig: AWSAppSyncServiceConfig(), cacheConfiguration: cacheConfiguration ) appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncConfig) } catch { print("Error initializing appsync client. \(error)") } // other methods return true }次に、AppSyncクライアントを使用したいアプリケーションコード(例えば、ViewControllerにバインドされたTodosクラス)で、viewDidLoad()ライフサイクルメソッドでこれを参照する必要があります:
import AWSAppSync
class Todos: UIViewController{ //Reference AppSync client var appSyncClient: AWSAppSyncClient?
override func viewDidLoad() { super.viewDidLoad() //Reference AppSync client from App Delegate let appDelegate = UIApplication.shared.delegate as! AppDelegate appSyncClient = appDelegate.appSyncClient }}クエリ
バックエンドが設定されたので、GraphQLクエリを実行できます。構文はappSyncClient?.fetch(query: <NAME>Query() {(result, error)})です。ここで、<NAME>はamplify codegen typesが作成したGraphQLステートメントから取得されます。たとえば、ListTodosクエリがある場合、コードは以下のようになります:
//Run a queryappSyncClient?.fetch(query: ListTodosQuery()) { (result, error) in if error != nil { print(error?.localizedDescription ?? "") return } result?.data?.listTodos?.items!.forEach { print(($0?.name)! + " " + ($0?.description)!) }}オプションで、クエリにキャッシュポリシーを設定できます:
appSyncClient?.fetch(query: ListTodosQuery(), cachePolicy: .returnCacheDataAndFetch) { (result, error) inreturnCacheDataAndFetchは、ネットワーク経由でデータを取得する前に、ローカルキャッシュから結果を最初にプルします。これにより、UXが快適になり、オフラインサポートが提供されます。
ミューテーション
データを追加する場合は、GraphQLミューテーションを実行する必要があります。構文はappSyncClient?.perform(mutation: <NAME>Mutation() {(result, error)})です。ここで、<NAME>はamplify codegen typesが作成したGraphQLステートメントから取得されます。ただし、ほとんどのGraphQLスキーマは保守性のためにミューテーションをinput型で整理しており、これはAmplify CLIでも行われます。したがって、以下の例のようにinputと呼ばれるパラメータとしてこれを渡します:
let mutationInput = CreateTodoInput(name: "Use AppSync", description:"Realtime and Offline")
appSyncClient?.perform( mutation: CreateTodoMutation(input: mutationInput)) { (result, error) in if let error = error as? AWSAppSyncClientError { print("Error occurred: \(error.localizedDescription )") } if let resultError = result?.errors { print("Error saving the item on server: \(resultError)") return }}サブスクリプション
最後に、リアルタイムデータへのサブスクリプションをセットアップします。構文はappSyncClient?.subscribe(subscription: <NAME>Subscription() {(result, transaction, error)})です。ここで、<NAME>はamplify codegen typesが作成したGraphQLステートメントから取得されます。
// Subscription notifications will only be delivered as long as this is retainedvar subscriptionWatcher: Cancellable?
//In your app codedo { subscriptionWatcher = try appSyncClient?.subscribe( subscription: OnCreateTodoSubscription(), resultHandler: { (result, transaction, error) in if let result = result { print(result.data!.onCreateTodo!.name + " " + result.data!.onCreateTodo!.description!) } else if let error = error { print(error.localizedDescription) } } )} catch { print("Error starting subscription.")}サブスクリプションはミューテーションと同じようにinput型を取ることもできます。その場合、入力に基づいて特定のイベントにサブスクライブします。AppSyncのサブスクリプション引数の詳細については、こちらを参照してください。
完全なサンプル
AppDelegate.swift
import UIKitimport AWSAppSync
@UIApplicationMainclass AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow? var appSyncClient: AWSAppSyncClient?
func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { do { // You can choose your database location if you wish, or use the default let cacheConfiguration = try AWSAppSyncCacheConfiguration()
// AppSync configuration & client initialization let appSyncConfig = try AWSAppSyncClientConfiguration(appSyncServiceConfig: AWSAppSyncServiceConfig(), cacheConfiguration: cacheConfiguration) appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncConfig) } catch { print("Error initializing appsync client. \(error)") } return true }}ViewController.swift
import UIKitimport AWSAppSync
class ViewController: UIViewController {
var appSyncClient: AWSAppSyncClient?
// Subscription notifications will only be delivered as long as this is retained var subscriptionWatcher: Cancellable?
override func viewDidLoad() { super.viewDidLoad() let appDelegate = UIApplication.shared.delegate as! AppDelegate appSyncClient = appDelegate.appSyncClient
// Note: each of these are asynchronous calls. Attempting to query the results of `runMutation` immediately // after calling it probably won't work--instead, invoke the query in the mutation's result handler runMutation() runQuery() subscribe() }
func subscribe() { do { subscriptionWatcher = try appSyncClient?.subscribe(subscription: OnCreateTodoSubscription()) { // The subscription watcher's result block retains a strong reference to the result handler block. // Make sure to capture `self` weakly if you use it // [weak self] (result, transaction, error) in if let result = result { print(result.data!.onCreateTodo!.name + " " + result.data!.onCreateTodo!.description!) // Update the UI, as in: // self?.doSomethingInTheUIWithSubscriptionResults(result) // By default, `subscribe` will invoke its subscription callbacks on the main queue, so there // is no need to dispatch to the main queue. } else if let error = error { print(error.localizedDescription) } } } catch { print("Error starting subscription.") } }
func runMutation(){ let mutationInput = CreateTodoInput(name: "Use AppSync", description:"Realtime and Offline") appSyncClient?.perform(mutation: CreateTodoMutation(input: mutationInput)) { (result, error) in if let error = error as? AWSAppSyncClientError { print("Error occurred: \(error.localizedDescription )") } if let resultError = result?.errors { print("Error saving the item on server: \(resultError)") return } // The server and the local cache are now updated with the results of the mutation } }
func runQuery(){ appSyncClient?.fetch(query: ListTodosQuery()) {(result, error) in if error != nil { print(error?.localizedDescription ?? "") return } result?.data?.listTodos?.items!.forEach { print(($0?.name)! + " " + ($0?.description)!) } } }}Androidの使用方法
このセクションでは、Javaで書かれたAndroid Studioプロジェクトを使用し、Amplifyとともに、AWS AppSyncを使用したGraphQL APIを追加するために必要な手順について説明します。初めてユーザーの場合は、新しいAndroid Studioプロジェクトと単一のActivityクラスから始めることをお勧めします。
セットアップ
Amplify Getting Startedを完了した後、ターミナルでAndroid Studioプロジェクトディレクトリに移動し、以下を実行します:
amplify init ## Select iOS as your platformamplify add api ## Select GraphQL, API key, "Single object with fields Todo application"amplify push ## Sets up backend and prompts you for codegen, accept the defaults上記のadd apiフロー中に、注釈付きGraphQLスキーマがすでに存在するかどうかなどの質問が表示されます。CLIを初めて使用する場合は、いいえを選択し、以下で使用されるデフォルトプロジェクト**「Single object with fields (e.g., "Todo" with ID, name, description)」**を通じてガイドされます。後で常に変更できます。
APIを追加したので、amplify pushプロセスはコード生成プロセスに自動的に入り、設定の確認を求めます。デフォルトを受け入れると、./app/src/main/res/rawディレクトリにawsconfiguration.jsonファイルが作成されます。これはAppSyncクライアントが初期化に使用します。ビルドプロセスを完了するには、Gradleとパーミッション更新が必要です。
まず、プロジェクトのbuild.gradleで、ビルドスクリプトに次の依存関係を追加します:
classpath 'com.amazonaws:aws-android-sdk-appsync-gradle-plugin:2.6.+'次に、アプリのbuild.gradleで、apply plugin: 'com.amazonaws.appsync'のプラグインとimplementation 'com.amazonaws:aws-android-sdk-appsync:2.6.+'の依存関係を追加します。以下の例を参照してください:
apply plugin: 'com.android.application'apply plugin: 'com.amazonaws.appsync'android { // Typical items}dependencies { // Typical dependencies implementation 'com.amazonaws:aws-android-sdk-appsync:2.6.+' implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0' implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'}最後に、AndroidManifest.xmlをネットワークコールとオフライン状態の<uses-permissions>更新で更新します。また、サブスクリプション用に<application>の下にMqttServiceの<service>エントリを追加します:
<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--other code-->
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
<service android:name="org.eclipse.paho.android.service.MqttService" />
<!--other code--> </application>プロジェクトをビルドして問題がないことを確認します。
AppSyncクライアントの初期化
アプリケーションコード内(例えば、activityクラスのonCreate()ライフサイクルメソッド)で、AWSConfiguration()インスタンスをAWSAppSyncClientビルダーで使用してAppSyncクライアントを初期化できます。これはawsconfiguration.jsonファイルに存在する設定情報を読み取ります。デフォルトでは、Defaultセクションの情報が使用されます。
private AWSAppSyncClient mAWSAppSyncClient;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAWSAppSyncClient = AWSAppSyncClient.builder() .context(getApplicationContext()) .awsConfiguration(new AWSConfiguration(getApplicationContext())) .build(); }クエリ
バックエンドが設定されたので、GraphQLクエリを実行できます。コールバックの構文はGraphQLCall.Callback<{NAME>Query.Data>です。ここで、{NAME}はamplify codegen typesが作成したGraphQLステートメントから取得されます。AppSyncクライアントのインスタンスから.query(<NAME>Query.builder().build())と同様の構文で呼び出します。たとえば、ListTodosクエリがある場合、コードは以下のようになります:
public void query(){ mAWSAppSyncClient.query(ListTodosQuery.builder().build()) .responseFetcher(AppSyncResponseFetchers.CACHE_AND_NETWORK) .enqueue(todosCallback); }
private GraphQLCall.Callback<ListTodosQuery.Data> todosCallback = new GraphQLCall.Callback<ListTodosQuery.Data>() { @Override public void onResponse(@Nonnull Response<ListTodosQuery.Data> response) { Log.i("Results", response.data().listTodos().items().toString()); }
@Override public void onFailure(@Nonnull ApolloException e) { Log.e("ERROR", e.toString()); } };AppSyncResponseFetchersのキャッシュポリシーをオプションで変更できますが、CACHE_AND_NETWORKのままにすることをお勧めします。これはネットワーク経由でデータを取得する前に、ローカルキャッシュから結果を最初にプルします。これにより、UXが快適になり、オフラインサポートが提供されます。
ミューテーション
データを追加する場合は、GraphQLミューテーションを実行する必要があります。コールバックの構文はGraphQLCall.Callback<{NAME}Mutation.Data>です。ここで、{NAME}はamplify codegen typesが作成したGraphQLステートメントから取得されます。ただし、ほとんどのGraphQLスキーマは保守性のためにミューテーションをinput型で整理しており、これはAmplify CLIでも行われます。したがって、2番目のビルダーで作成されたinputと呼ばれるパラメータとしてこれを渡します。AppSyncクライアントのインスタンスから.mutate({NAME}Mutation.builder().input({Name}Input).build())と同様の構文で呼び出します:
public void mutation(){ CreateTodoInput createTodoInput = CreateTodoInput.builder(). name("Use AppSync"). description("Realtime and Offline"). build();
mAWSAppSyncClient.mutate(CreateTodoMutation.builder().input(createTodoInput).build()) .enqueue(mutationCallback);}
private GraphQLCall.Callback<CreateTodoMutation.Data> mutationCallback = new GraphQLCall.Callback<CreateTodoMutation.Data>() { @Override public void onResponse(@Nonnull Response<CreateTodoMutation.Data> response) { Log.i("Results", "Added Todo"); }
@Override public void onFailure(@Nonnull ApolloException e) { Log.e("Error", e.toString()); }};サブスクリプション
最後に、リアルタイムデータへのサブスクリプションをセットアップします。コールバックはAppSyncSubscriptionCall.Callbackで、クライアントの.subscribe()呼び出しで呼び出し、{NAME}Subscription.builder()の構文のビルダーを渡します。ここで、{NAME}はamplify codegen typesが作成したGraphQLステートメントから取得されます。Amplify GraphQLトランスフォーマーには、以下の例のようにサブスクリプションの前に「On」という単語を付ける共通の命名法があります:
private AppSyncSubscriptionCall subscriptionWatcher;
private void subscribe(){ OnCreateTodoSubscription subscription = OnCreateTodoSubscription.builder().build(); subscriptionWatcher = mAWSAppSyncClient.subscribe(subscription); subscriptionWatcher.execute(subCallback); }
private AppSyncSubscriptionCall.Callback subCallback = new AppSyncSubscriptionCall.Callback() { @Override public void onResponse(@Nonnull Response response) { Log.i("Response", response.data().toString()); }
@Override public void onFailure(@Nonnull ApolloException e) { Log.e("Error", e.toString()); }
@Override public void onCompleted() { Log.i("Completed", "Subscription completed"); } };サブスクリプションはミューテーションと同じようにinput型を取ることもできます。その場合、入力に基づいて特定のイベントにサブスクライブします。AppSyncのサブスクリプション引数の詳細については、こちらを参照してください。
サンプル
MainActivity.java
import android.util.Log;import com.amazonaws.mobile.config.AWSConfiguration;import com.amazonaws.mobileconnectors.appsync.AWSAppSyncClient;import com.amazonaws.mobileconnectors.appsync.AppSyncSubscriptionCall;import com.amazonaws.mobileconnectors.appsync.fetcher.AppSyncResponseFetchers;import com.apollographql.apollo.GraphQLCall;import com.apollographql.apollo.api.Response;import com.apollographql.apollo.exception.ApolloException;import javax.annotation.Nonnull;import amazonaws.demo.todo.CreateTodoMutation;import amazonaws.demo.todo.ListTodosQuery;import amazonaws.demo.todo.OnCreateTodoSubscription;import amazonaws.demo.todo.type.CreateTodoInput;
public class MainActivity extends AppCompatActivity {
private AWSAppSyncClient mAWSAppSyncClient; private AppSyncSubscriptionCall subscriptionWatcher;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAWSAppSyncClient = AWSAppSyncClient.builder() .context(getApplicationContext()) .awsConfiguration(new AWSConfiguration(getApplicationContext())) .build(); query(); mutation(); subscribe(); }
private void subscribe(){ OnCreateTodoSubscription subscription = OnCreateTodoSubscription.builder().build(); subscriptionWatcher = mAWSAppSyncClient.subscribe(subscription); subscriptionWatcher.execute(subCallback); }
private AppSyncSubscriptionCall.Callback subCallback = new AppSyncSubscriptionCall.Callback() { @Override public void onResponse(@Nonnull Response response) { Log.i("Response", response.data().toString()); }
@Override public void onFailure(@Nonnull ApolloException e) { Log.e("Error", e.toString()); }
@Override public void onCompleted() { Log.i("Completed", "Subscription completed"); } };
public void query(){ mAWSAppSyncClient.query(ListTodosQuery.builder().build()) .responseFetcher(AppSyncResponseFetchers.CACHE_AND_NETWORK) .enqueue(todosCallback); }
private GraphQLCall.Callback<ListTodosQuery.Data> todosCallback = new GraphQLCall.Callback<ListTodosQuery.Data>() { @Override public void onResponse(@Nonnull Response<ListTodosQuery.Data> response) { Log.i("Results", response.data().listTodos().items().toString()); }
@Override public void onFailure(@Nonnull ApolloException e) { Log.e("ERROR", e.toString()); } };
public void mutation(){
CreateTodoInput createTodoInput = CreateTodoInput.builder(). name("Use AppSync"). description("Realtime and Offline"). build();
mAWSAppSyncClient.mutate(CreateTodoMutation.builder().input(createTodoInput).build()) .enqueue(mutationCallback);
}
private GraphQLCall.Callback<CreateTodoMutation.Data> mutationCallback = new GraphQLCall.Callback<CreateTodoMutation.Data>() { @Override public void onResponse(@Nonnull Response<CreateTodoMutation.Data> response) { Log.i("Results", "Added Todo"); }
@Override public void onFailure(@Nonnull ApolloException e) { Log.e("Error", e.toString()); } };}