NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

注目のタグ

    AWS AmplifyとFlutterでクロスプラットフォームなアプリを作る

    本記事は  モバイルアプリWeek  4日目の記事です。
    📳  3日目  ▶▶ 本記事 ▶▶  5日目  📳

    こんにちは、古田です。

    今回は、AWS Amplifyを使って、Flutterのクロスプラットフォームアプリを試してみたいと思います。

    Flutterってなんだ?という時は、岡さんの記事が詳しいです。 tech.nri-net.com

    Amplifyってなんだ?という方は、拙記事で概要を紹介しています。 tech.nri-net.com

    はじめに、Firebaseとの比較

    ネイティブアプリのmBaaSとして見た場合、Amplifyの比較対象はGoogleのFirebaseになりますよね。主な機能を表にしました。機能の中身の差は置いておいたとして、ラインナップはAmplifyとFirebaseの間に差はないように見えます。

    AWS Amplify Firebase
    ホスティング Hosting / Amplify Console Firebase Hosting
    認証 Authentication ( Amazon Cognito ) Firebase Authentication
    データベース Database ( Amazon DynamoDB ) Firestore / Realtime Database
    ストレージ Storage ( Amazon S3 ) Cloud Storage for Firebase
    アナリティクス Analytics ( Amazon Pinpoint ) Google Analytics for Firebase
    API API ( AWS AppSync / Amazon API Gateway ) Cloud Functions for Firebase
    通知 Notifications ( Amazon Pinpoint ) FCM

    しかし、今回はクロスプラットフォームを目標に掲げているため、プラットフォーム別の対応状況を確認する必要があります。こちらも簡単な一覧表にまとめてみました。

    プラットフォーム別のmBaaS機能対応状況(2022年5月時点)*1*2*3*4

    Amplify for Flutterは基本的にiOS/Androidアプリのみに対応しており、Webやデスクトップには対応していません。特にAmplify ConsoleでFlutter Webアプリのホスティングができないのは痛いですね…。

    Webやデスクトップもいける点がFlutterの大きな特徴だと思っていたので、やや出鼻を挫かれてしまいましたが、iOS/Androidのオーソドックス(?)なクロスプラットフォームアプリを試していくことにします。

    (その理想とは裏腹に、プラットフォームごとの対応可否や固有動作に苦しむのがクロスプラットフォームの常であり、醍醐味でもあり……)

    やってみよう

    公式のチュートリアルを参考に、AuthenticationAnalyticsを実装していきたいと思います。

    プロジェクトの準備

    環境は以下

    $ flutter --version
    Flutter 2.10.5 • channel stable • https://github.com/flutter/flutter.git 
    Framework • revision 5464c5bac7 (4 weeks ago) • 2022-04-18 09:55:37 -0700
    Engine • revision 57d3bac3dd
    Tools • Dart 2.16.2 • DevTools 2.9.2
    $ amplify --version
    8.1.0
    

    新規のFlutterプロジェクトを作り、Amplifyをセットアップします

    $ flutter create amplutter
    
    $ amplify configure
    $ amplify init
    

    AWSコンソールで確認すると、Amplifyアプリができて、バックエンド環境が構築されています。

    認証機能を作る

    Amplify StudioでバックエンドにAuthenticationを作ります。

    pullしてamplifyconfiguration.dartが更新されることを確認します。

    $ amplify pull

    次はフロントエンド側

    Flutterプロジェクトにpub.devからAmplifyライブラリを入れます。

    dependencies:
      flutter:
        sdk: flutter
      amplify_flutter: ^0.4.0
      amplify_auth_cognito: ^0.4.0
      amplify_authenticator: ^0.1.0
    

    main.dart はこう。

    import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
    import 'package:amplify_authenticator/amplify_authenticator.dart';
    import 'package:amplify_flutter/amplify_flutter.dart';
    import 'package:flutter/material.dart';
    
    import 'amplifyconfiguration.dart';
    
    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatefulWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      State<MyApp> createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      @override
      void initState() {
        super.initState();
        _configureAmplify();
      }
    
      void _configureAmplify() async {
        try {
          await Amplify.addPlugin(AmplifyAuthCognito());
          await Amplify.configure(amplifyconfig);
          print('Successfully configured');
        } on Exception catch (e) {
          print('Error configuring Amplify: $e');
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Authenticator(
          child: MaterialApp(
            builder: Authenticator.builder(),
            home: const Scaffold(
              body: Center(
                child: Text('You are logged in!'),
              ),
            ),
          ),
        );
      }
    }
    

    iPhoneとAndroidで動かしてみましょう。できてますね🎉

    ロギングしてみる

    Amplify CLIでバックエンドにanalyticsを追加します。

    $ amplify add analytics
    

    pushして、Amplify Studioでバックエンドが構築されたことを確認します。手元のamplifyconfiguration.dartにもanalyticsが反映されていると思います。

    $ amplify push

    フロント側は、まずライブラリを追加し、

    dependencies:
      flutter:
        sdk: flutter
      amplify_flutter: ^0.4.0
      amplify_auth_cognito: ^0.4.0
      amplify_authenticator: ^0.1.0
      amplify_analytics_pinpoint: ^0.4.0 #ADD
    

    main.dart に出力処理を追記し、アプリを動かしてみましょう。

    AnalyticsEvent myEvent = AnalyticsEvent('my_event_name');
    myEvent.properties.addStringProperty('property_name', 'property_value');
    Amplify.Analytics.recordEvent(event: myEvent );
    

    Pinpointのコンソールを見ると、イベントが上がってきました。(すぐに反映されなかったので、小一時間ほど待ちました)

    フィルタからカスタムイベントを指定して見ることもできます。プラットフォームなどの属性情報は自動的に取得されるようです。ロギングというよりは、送信タイミングだけ考えて実装すればファネル分析ができる、デジタルマーケティング的なサービスなんですね。(Pinpoint初めて触りました)

    さいごに

    チュートリアルに沿って、特に詰まることなく、iOS/Android共に各バックエンド機能を実現することができました。

    この記事を書いてる途中に、Google I/O会議でFlutter3が発表され*5、FlutterとFirebaseの統合が強化されています。FlutterFireの勢いは眩しいのですが、Amplifyもアップデートの勢いでは負けてないと思うので、今後のFlutterサポートにも期待したいところです。

    執筆者古田 拓也

    たぶんシステムアーキテクト。
    デスクトップアプリが専門でしたが最近は何でも屋