Amazon Web Services ブログ

Android および iOS 用の新しい AWS Amplify ライブラリ

モバイルアプリケーションを開発するときは、各プロジェクトについて、クラウドを利用した一連の機能を開発する必要があります。たとえば、ほとんどのアプリケーションでは、ユーザー認証または詳細なアプリ内分析が必要となります。アプリケーションはおそらく REST または GraphQL API を呼び出し、オフラインシナリオとデータ同期をサポートすることが求められます。AWS Amplify を使用すると、このような機能をモバイルアプリケーションやウェブアプリケーションに簡単に統合できます。

AWS Amplify は、安全でスケーラブルなモバイルおよびウェブアプリケーションを構築するためのツールとサービスのセットです。これは、クラウドを利用した機能を追加するためのライブラリと UI コンポーネントのオープンソースセット、クラウドバックエンドを作成および管理するためのコマンドラインインタラクティブツールチェーン、およびフルスタックのサーバーレスウェブアプリケーションをデプロイしてホストする AWS のサービスである AWS Amplify Console という 3 つのコンポーネントで構成されています。

本日、モバイルアプリケーション開発者が安全でスケーラブルなクラウドベースのアプリケーションを簡単に構築することをサポートするための Amplify iOS および Amplify Android ライブラリとツールが利用可能になったことをお知らせいたします。

今日まで、クラウドベースのモバイルアプリケーションを開発するときは、ツールと SDK の組み合わせを使用していました。すなわち、AmplifyCLI を使用してバックエンドを作成および管理し、1 つまたは複数の AWS Mobile SDK を使用してバックエンドにアクセスしていました。一般に、AWS Mobile SDK は、AWS のサービスの API の低レベルのラッパーです。API の詳細を理解し、ほとんどの場合、オブジェクトの (デ) シリアライゼーション、エラー処理など、多くの未分化コードを記述する必要があります。

Amplify iOS と Amplify Android はこれを簡素化します。まず、認証、データの保存とアクセス、機械学習の予測などのユースケース向けのネイティブライブラリを提供します。これらのライブラリは、抽象化を使用してプログラムでベストプラクティスを適用できる宣言型インターフェイスを提供します。AWS のサービスではなくユースケースの観点から考えると、抽象化のレベルが高くなり、開発サイクルが速くなり、コード行が少なくなります。次に、ネイティブ IDE ツールチェーンと統合するツールを提供します。すなわち、iOS 用の XCode と Android 用の Gradle です。

Amplify iOS または Amplify Android は、クラウドベースのバックエンドをモバイルアプリケーションに統合するための方法として推奨されています。

開始方法
開始方法を示すために、2 つのシンプルなモバイルアプリケーション (iOS 用と Android 用に 1 つずつ) を構築しました。これらのサンプルのソースは、私の GitHub で入手できます。お気づきのように、私はグラフィックデザイナーではありません。アプリケーションには、さまざまなフローをトリガーする UI ボタンのリストがあり、結果はコンソールにのみ表示されます。

Amplify のデモ (iOS および Android)

モバイル用の Amplify ライブラリは、Auth、API (REST および GraphQL)、Analytics、File Storage、DataStore、および Predictions のカテゴリを中心に編成されています。この例では、3 つのカテゴリを使用します。サインイン、サインアップ、および Facebook ログインフローを実装するために Auth を使用します。クエリ可能なデバイス上の永続ストレージエンジンを使用するために DataStore を使用します。これは、組み込みのバージョニング、競合検出、解決機能を使用して、アプリとクラウドの間でシームレスにデータを同期します。また、英語とフランス語間の自動翻訳を追加するために Predictions カテゴリを使用します。

各プラットフォームで開始するための 4 つの主なステップとコード行を確認してみましょう。ステップバイステップの詳細なチュートリアルについては、Amplify iOS または Amplify Android のドキュメントをご覧ください。

最初のステップでは、プロジェクトをセットアップして、必要な依存関係とビルドステップを追加します。

iOS では、Podfile に数行を追加し、AWS Amplify ビルドスクリプトをプロジェクトのビルドフェーズに追加します。
Android では、モジュールとアプリの Gradle ファイルで同じことを行います。

// iOS Podfile
target 'amplify-lib-ios-demo' do
  # 動的フレームワークを使用したくない場合は、次の行をコメント化します
  use_frameworks!

  # Pods for amplify-lib-ios-demo
    pod 'Amplify'
    pod 'Amplify/Tools'

    pod 'AmplifyPlugins/AWSAPIPlugin'
    pod 'AmplifyPlugins/AWSDataStorePlugin'
    pod 'AmplifyPlugins/AWSCognitoAuthPlugin'
    pod 'AWSPredictionsPlugin'
// Android build.gradle fragment (Module: app) 
...
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
dependencies {
    implementation 'com.amplifyframework:core:1.0.0'
    implementation 'com.amplifyframework:aws-datastore:1.0.0'
    implementation 'com.amplifyframework:aws-api:1.0.0'
    implementation 'com.amplifyframework:aws-predictions:1.0.0'
    implementation 'com.amplifyframework:aws-auth-cognito:1.0.0'
}
...
// Android build.gradle fragment (Project: My Application)
...
repositories {
    mavenCentral()
    google()
    jcenter()
}
dependencies {
        classpath 'com.amplifyframework:amplify-tools-gradle-plugin:1.0.0'
}
apply plugin: 'com.amplifyframework.amplifytools'
...

iOS では、ビルドステップに amplify-tools.sh を手動で追加する必要もあります。

これが完了したら、iOS で pod install と入力するか、プロジェクトを Gradle と同期します。

2 番目のステップでは、アプリケーションを初期化する際に、各カテゴリ用のプラグインを Amplify に追加します。iOS では、AppDelegatedidFinishLaunchingWithOptions を使用しています。Android では、MainActivityonCreate を使用しています。アプリのどの段階でも Amplify を初期化できます。アプリの起動時である必要はありません。

    // iOS AppDelegate class
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        do {
            try Amplify.add(plugin: AWSAPIPlugin())
            try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: AmplifyModels()))
            try Amplify.add(plugin: AWSCognitoAuthPlugin())
            try Amplify.add(plugin: AWSPredictionsPlugin())
            
            try Amplify.configure()
            print("Amplify initialized")
        } catch {
            print("Failed to configure Amplify \(error)")
        }
}
   // Android MainActivity class (Kotlin version)
   override fun onCreate(savedInstanceState: Bundle?) {
        // ...

        try {
            Amplify.addPlugin(AWSDataStorePlugin())
            Amplify.addPlugin(AWSApiPlugin())
            Amplify.addPlugin(AWSCognitoAuthPlugin())
            Amplify.addPlugin(AWSPredictionsPlugin())
            Amplify.configure(applicationContext)
            Log.i(TAG, "Initialized Amplify")
        } catch (error: AmplifyException) {
            Log.e(TAG, "Could not initialize Amplify", error)
        }
    }

3 番目のステップは、カテゴリごとに異なります。通常、AWS Amplify コマンドラインを使用してバックエンドをプロビジョニングおよび設定します。カテゴリを設定するには、amplify add authamplify add predictions などのコマンドを入力します。

たとえば、Amazon Cognito および Facebook ログインなどのソーシャル ID プロバイダーを使用してユーザー認証を設定するには、次のように入力します。クラウドバックエンドを作成および設定しているため、このステップは iOS と Android で同じです。

FacebookGoogleAmazon などのソーシャル ID プロバイダーを使用したシングルサインオンを設定する方法については、この Amplify iOS Workshop で書いたステップバイステップの手順を参照してください (これらの新しい AWS Amplify ライブラリのメリットを反映すべく、このワークショップを近い将来に更新します)。

DataStore の設定では、データの GraphQL スキーマを作成します。Amplify は、アプリ内のデータを表すネイティブ (Swift または Java) コードを生成します。オフラインデータストアを透過的に処理してデータを保存し、ネットワーク接続が利用可能な場合はバックエンドと同期します。

4 番目の最終ステップでは、実行時に実際に Amplify のライブラリコードを呼び出します。

たとえば、Amazon Cognito がホストするウェブユーザーインターフェイスを使用して認証をトリガーするには、次のコードを使用します。

// iOS (swift) in AppDelegate object
    func signIn() {
        _ = Amplify.Auth.signInWithWebUI(presentationAnchor: UIApplication.shared.windows.first!) { (result) in
            switch(result) {
                case .success(let result):
                    print(result)
                case .failure(let error):
                    print("Can not signin \(error)")
            }
        }
    }
// Android (Kotlin) in MainActivity 
    fun signIn(view: View?) {
        Amplify.Auth.signInWithWebUI(
            this,
            { result: AuthSignInResult -> Log.i(TAG, result.toString()) },
            { error: AuthException -> Log.e(TAG, error.toString()) }
        )
    }

上記は次のウェブビューをトリガーします。

Cognito のホストされた UI

同様に、DataStore にアイテムを作成するには (そして、それを GraphQL 経由で Amazon DynamoDB に永続化するには)、次のコードが必要です。

    // iOS 
    func create() {
        let note = Note(content: "Build iOS application")
        Amplify.DataStore.save(note) {
            switch $0 {
            case .success:
                print("Added note")
            case .failure(let error):
                print("Error adding note - \(error.localizedDescription)")
            }
        }
    }
   // Android 
    fun create(view: View?) {
        val note: Note = Note.builder()
            .content("Build Android application")
            .build()

        Amplify.DataStore.save(
            note,
            { success -> Log.i(TAG, "Saved item: " + success.item.content) },
            { error -> Log.e(TAG, "Could not save item to DataStore", error) }
        )

また、Predictions カテゴリでテキスト翻訳をトリガーするには、次のコードが必要です。

    // iOS 
    func translate(text: String) {
        _ = Amplify.Predictions.convert(textToTranslate: text, language: LanguageType.english, targetLanguage: LanguageType.french) {
            switch $0 {
            case .success(let result):
                // update UI on main thread 
                DispatchQueue.main.async() {
                    self.data.translatedText = result.text
                }
            case .failure(let error):
                print("Error adding note - \(error.localizedDescription)")
            }
        }
    }
   // Android
    fun translate(view: View?) {
        Log.i(TAG, "Translating")

        val et : EditText = findViewById(R.id.toBeTranslated)
        val tv : TextView = findViewById(R.id.translated)

        Amplify.Predictions.translateText(
            et.text.toString(),
            LanguageType.ENGLISH,
            LanguageType.FRENCH,
            { success -> tv.setText(success.translatedText) },
            { failure -> Log.e(TAG, failure.localizedMessage) }
        )
    }

短くて、洗練されたコードとなっています。

Amplify Mobile のデモ翻訳

料金と利用状況
AWS Amplify は無料で利用できます。アプリケーションが使用するバックエンドサービスに対してのみ、無料利用枠を超えた分を支払います。

Amplify iOS および Amplify Android は、CocoaPods および Maven Central コードリポジトリからすぐに入手できます。ソースコードは GitHub から入手可能です (iOS または Android)。お気軽にフィードバック (DociOS、および Android) をお寄せください。また、プルリクエストもお送りいただけます:-)

AWS Amplify を使用して構築している素晴らしいモバイルアプリについてもお知らせいただけますと幸いです。ぜひスクリーンショットや App Store のリンクを私と共有してください。

構築がうまくいきますように。

— seb