[fluf/ラッパ]-Firebaseを使用して目覚まし時計をプッシュ(アンドロイド)


この投稿では、目覚まし時計のプッシュを実現します.現在開発で使用されているfirebaseに簡単にプッシュ目覚ましを実現できるように設置されているので試してみましょう.
主に「火龍」というサイトを参考にしました.インフラとインフラの組み合わせが多いので、別途サイトを用意しているようです.
https://firebase.flutter.dev/docs/overview
0.基礎作業-ヒートシンクと基礎を起動する
この過程はまず先行しなければならない.でもこれはもともと良い資料がたくさんあるとかYouTubeでそれを見てついていけばいいんです特に最近flutterfire cliが出てきて本当に新しい世界です面倒なことに、ファイルを置いたりグラデーションを変更したりする必要はありません.YouTubeでflutterfire cliを検索すると開発した男のYouTubeにもあります.それと公式文書を参考にしました.
正式なタスク--実施メッセージ
連動が完了したと仮定してから説明します.アラートのプッシュを実現するには、まずfirebase messagingとfluf local notificationsというライブラリが必要です.
(最新バージョン、2022.02.26)

2つのライブラリをyamlに追加しpub getを行います.
  • Firebase messagingはFirebaseが提供する公式サービス
  • です.
  • fluf local notificationsは、他の操作を行うために必要なライブラリです.名前の通り、ローカル通知を発行できるライブラリです.必要な理由は次のとおりです.
    **Androidシステムは、アプリケーションが開いているとき(画面を見ているとき)、自動的にプロンプトを表示しないように設定されます.したがって、通知がFirebaseサービスを介して到着すると、ローカル通知が手動で追加されます.
  • Firebase messagingはStreamを通って入ります.私も完全に理解しているわけではありませんが、データパイプラインのようです.Streamを作成すると、いつでもStreamにコンテンツを追加したときにコールバックを実行できます.
    最初に正式な文書報告の実施で混同されたのは,Firebase messagingのコアStreamをコードのどの部分に書き込むべきかである.他の人が作成したコードを参考にすると、最上位のアプリケーションの大部分がステータスで管理されているか、ステータスで管理されているか、最初に実行されたgetXControllerをonInit上に置いていることがわかります.
    後者の方法をgetXControllerのonInitで実現する方法を選びました.
    次は簡単なディレクトリです.
  • 通知コントローラの作成-通知に関連するタスクを処理するためのコントローラ
  • GetMaterialAppはInitialBindingsに通知コントローラを加え、アプリケーションの実行時にコントローラ
  • にほぼ同時に注入する.
  • 通知コントローラにコード
  • を記述する.
  • FirebaseConsoleテストメッセージ
  • 1.通知コントローラの作成-通知に関連するタスクを処理するコントローラ
    notification_controller.dartファイルとコントローラフレームワークをそれぞれ作成します.
    import getX 임포트해놓으셈 
    
    class NotificationController extends GetXController {
    	// 아직 비어있다.
    }
    2.GetMaterialAppのInitialBindingsにNotificationControlを追加し、アプリケーションの実行中に実行するコントローラを注入します.

    このようにGetMaterialApp内部パラメータに入れます.では、アプリケーションの実行時に最初に実行されるコントローラになります.永久パラメータはtrueに設定され、念のためコントローラがオフになります.そうすると、どんなことがあってもコントローラは自動的に完成しません.
    3.NotificationControlでコードを記述する
    これからは本当です.
    まずコード全体をアップロードします
    完全なコード
    import 'package:get/get.dart';
    import 'package:firebase_messaging/firebase_messaging.dart';
    import 'package:flutter_local_notifications/flutter_local_notifications.dart';
    class NotificationController extends GetxController {
      // 메시징 서비스 기본 객체 생성
      FirebaseMessaging messaging = FirebaseMessaging.instance;
    
      
      void onInit() async{
        // TODO: implement onInit
        /// 첫 빌드시, 권한 확인하기
        /// 아이폰은 무조건 받아야 하고, 안드로이드는 상관 없음. 따로 유저가 설정하지 않는 한,
        /// 자동 권한 확보 상태
        NotificationSettings settings = await messaging.requestPermission(
          alert: true,
          announcement: false,
          badge: true,
          carPlay: false,
          criticalAlert: false,
          provisional: false,
          sound: true,
        );
        // 한번 이걸 프린트해서 콘솔에서 확인해봐도 된다.
        print(settings.authorizationStatus);
        _getToken();
        _onMessage();
        super.onInit();
      }
      /// 디바이스 고유 토큰을 얻기 위한 메소드, 처음 한번만 사용해서 토큰을 확보하자.
      /// 이는 파이어베이스 콘솔에서 손쉽게 디바이스에 테스팅을 할 때 쓰인다.
      void _getToken() async{
        String? token= await messaging.getToken();
        try{
          print(token);
        } catch(e) {}
      }
      /// ----------------------------------------------------------------------------
    
      /// * 안드로이드에서 foreground 알림 위한 flutter_local_notification 라이브러리 *
      ///
      /// 1. channel 생성 (우리의 알림을 따로 전달해줄 채널을 직접 만든다)
      /// 2. 그 채널을 우리 메인 채널로 정해줄 플러그인을 만들어준다.
      /// - 준비 끝!!
      // 1.
      final AndroidNotificationChannel channel = const AndroidNotificationChannel(
        'high_importance_channel', // id
        'High Importance Notifications', // title
        description: 'This channel is used for important notifications.', // description
        importance: Importance.max,
      );
      // 2.
      final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();
    
      void _onMessage() async{
        /// * local_notification 관련한 플러그인 활용 *
        ///
        /// 1. 위에서 생성한 channel 을 플러그인 통해 메인 채널로 설정한다.
        /// 2. 플러그인을 초기화하여 추가 설정을 해준다.
    
        // 1.
        await flutterLocalNotificationsPlugin
            .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
            ?.createNotificationChannel(channel);
        // 2.
        await flutterLocalNotificationsPlugin.initialize(
            const InitializationSettings(
                android: AndroidInitializationSettings('@mipmap/ic_launcher'), iOS: IOSInitializationSettings()),
            onSelectNotification: (String? payload) async {});
    
        /// * onMessage 설정 - 이것만 설정해줘도 알림을 받아낼 수 있다. *
    
        // 1. 콘솔에서 발송하는 메시지를 message 파라미터로 받아온다.
        /// 메시지가 올 때마다 listen 내부 콜백이 실행된다.
        FirebaseMessaging.onMessage.listen((RemoteMessage message) {
          RemoteNotification? notification = message.notification;
          AndroidNotification? android = message.notification?.android;
    
          // android 일 때만 flutterLocalNotification 을 대신 보여주는 거임. 그래서 아래와 같은 조건문 설정.
          if (notification != null && android != null) {
            flutterLocalNotificationsPlugin.show(
                notification.hashCode,
                notification.title,
                notification.body,
                NotificationDetails(
                  android: AndroidNotificationDetails(
                      channel.id,
                      channel.name,
                      channelDescription: channel.description
                  ),
                ),
    
                // 넘겨줄 데이터가 있으면 아래 코드를 써주면 됨.
                // payload: message.data['argument']
            );
          }
          // 개발 확인 용으로 print 구문 추가
          print('foreground 상황에서 메시지를 받았다.');
          // 데이터 유무 확인
          print('Message data: ${message.data}');
          // notification 유무 확인
          if (message.notification != null) {
            print('Message also contained a notification: ${message.notification!.body}');
          }
        });
      }
    
    }
    今から順番に上から取り外しましょう
    サービス・オブジェクトのメッセージングの作成
    // 메시징 서비스 기본 객체 생성
      FirebaseMessaging messaging = FirebaseMessaging.instance;
    まずはサービス入口ポイント(サービス中心の…!)このようにして.
    onInit内部コードの作成(最初、2、3ステップ-最初、2ステップ、3ステップ)
    
      void onInit() async{
        // TODO: implement onInit
        /// 첫 빌드시, 권한 확인하기
        /// 아이폰은 무조건 받아야 하고, 안드로이드는 상관 없음. 따로 유저가 설정하지 않는 한,
        /// 자동 권한 확보 상태
        NotificationSettings settings = await messaging.requestPermission(
          alert: true,
          announcement: false,
          badge: true,
          carPlay: false,
          criticalAlert: false,
          provisional: false,
          sound: true,
        );
        // 한번 이걸 프린트해서 콘솔에서 확인해봐도 된다.
        print(settings.authorizationStatus);
        _getToken();
        _onMessage();
        super.onInit();
      }
    onInit内部には大体3つの分野がある.
  • 権限確認
  • getToken()メソッド
  • onMessage()メソッド
  • 1番権限確認から開始します.
    これは、コード内のコメントに書かれた権限を確保する方法です.Androidシステムは基本的にライセンス状態ですが、IOSは一度ライセンスする必要があります.私はAndroidシミュレータを使ってコード作業をしているので、プロンプトウィンドウは表示されず、印刷結果だけが表示され、権限を確認する権利があることが表示されます.
    2番getToken
    _getToken();
      /// 디바이스 고유 토큰을 얻기 위한 메소드, 처음 한번만 사용해서 토큰을 확보하자.
      /// 이는 파이어베이스 콘솔에서 손쉽게 디바이스에 테스팅을 할 때 쓰인다.
      void _getToken() async{
        String? token= await messaging.getToken();
        try{
          print(token);
        } catch(e) {}
      }
    この方法は、Firebaseコンソール上で実際のメッセージをテストするために、デバイス自体のトークンを確保することができる.どのマシンにも独自のトークンがあり、このトークンがあれば私に入力したトークンだけにメッセージを送信するように設定できるそうです.
    ここまでにしようonMessage()は書かないで…!
    このようにすると、実行コンソールには次のように2つの印刷結果が表示されます.

    1.権限表示
    2.デバイスのユニークトークン
    コインをコピーして、単独で手帳に記入します.
    3番目のonMessageを見てみましょうが、その前に次のコードを見てみましょう.onMessageは最も核心的な方法であるため,最後に議論する.
    onInit外部変数割当て-local fluf notificationsの使用
    アンドロイド通知設定
    まずlocal fluf notificationsを利用次のコードに従ってコピーして書きましょう.ちなみにonInitは外にいます!
    /// ----------------------------------------------------------------------------
    
      /// * 안드로이드에서 foreground 알림 위한 flutter_local_notification 라이브러리 *
      ///
      /// 1. channel 생성 (우리의 알림을 따로 전달해줄 채널을 직접 만든다)
      /// 2. 그 채널을 우리 메인 채널로 정해줄 플러그인을 만들어준다.
      /// - 준비 끝!!
      // 1.
      final AndroidNotificationChannel channel = const AndroidNotificationChannel(
        'high_importance_channel', // id
        'High Importance Notifications', // title
        description: 'This channel is used for important notifications.', // description
        importance: Importance.max,
      );
      // 2.
      final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();
    このコードは完全にアンドロイドシステムのために作成されたコードです.前述したように、アンドロイドシステムのアプリケーションは開いており、使用中は基本的にアラームをブロックします.そのため、強制的に起動する方法が必要です.
    1.チャンネルの作成-私たちはそれを通知の行き交う抜け穴に考えればいいだけです.
    2.そのチャンネルを私たちのメインチャンネルにできるプラグインを作成します.
    3.以降のonMessageでは、上記で指定した変数オブジェクトを使用してエコー通知を作成します.
    また、androidのオリジナル設定が必要です.
    プロジェクト上部フォルダのnoodroid->app->src->main->Android Menifest.xmlファイルを変更する必要があります.
    <meta-data
               android:name="com.google.firebase.messaging.default_notification_channel_id"
               android:value="high_importance_channel" />
    難しくないです.上のコードをコピーするだけです.
    このように差し込めばいいです
    high importion channelという名前は私たちのチャンネルとされていますか?このような設定のようです
    上に設置されているチャンネルのIDをそのまま書きます.
    onMessage()メソッドの作成
    コード全体は以下のように、上から1つずつ取り外します.
    void _onMessage() async{
        /// * local_notification 관련한 플러그인 활용 *
        ///
        /// 1. 위에서 생성한 channel 을 플러그인 통해 메인 채널로 설정한다.
        /// 2. 플러그인을 초기화하여 추가 설정을 해준다.
    
        // 1.
        await flutterLocalNotificationsPlugin
            .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
            ?.createNotificationChannel(channel);
        // 2.
        await flutterLocalNotificationsPlugin.initialize(
            const InitializationSettings(
                android: AndroidInitializationSettings('@mipmap/ic_launcher'), iOS: IOSInitializationSettings()),
            onSelectNotification: (String? payload) async {});
    
        /// * onMessage 설정 - 이것만 설정해줘도 알림을 받아낼 수 있다. *
    
        // 1. 콘솔에서 발송하는 메시지를 message 파라미터로 받아온다.
        /// 메시지가 올 때마다 listen 내부 콜백이 실행된다.
        FirebaseMessaging.onMessage.listen((RemoteMessage message) {
          RemoteNotification? notification = message.notification;
          AndroidNotification? android = message.notification?.android;
    
          // android 일 때만 flutterLocalNotification 을 대신 보여주는 거임. 그래서 아래와 같은 조건문 설정.
          if (notification != null && android != null) {
            flutterLocalNotificationsPlugin.show(
                notification.hashCode,
                notification.title,
                notification.body,
                NotificationDetails(
                  android: AndroidNotificationDetails(
                      channel.id,
                      channel.name,
                      channelDescription: channel.description
                  ),
                ),
    
                // 넘겨줄 데이터가 있으면 아래 코드를 써주면 됨.
                // payload: message.data['argument']
            );
          }
          // 개발 확인 용으로 print 구문 추가
          print('foreground 상황에서 메시지를 받았다.');
          // 데이터 유무 확인
          print('Message data: ${message.data}');
          // notification 유무 확인
          if (message.notification != null) {
            print('Message also contained a notification: ${message.notification!.body}');
          }
        });
      }
    fluf local notificationsメソッドの実行-以前に作成したチャンネルを登録
    /// * local_notification 관련한 플러그인 활용 *
        ///
        /// 1. 위에서 생성한 channel 을 플러그인 통해 메인 채널로 설정한다.
        /// 2. 플러그인을 초기화하여 추가 설정을 해준다.
    
        // 1.
        await flutterLocalNotificationsPlugin
            .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
            ?.createNotificationChannel(channel);
        // 2.
        await flutterLocalNotificationsPlugin.initialize(
            const InitializationSettings(
                android: AndroidInitializationSettings('@mipmap/ic_launcher'), iOS: IOSInitializationSettings()),
            onSelectNotification: (String? payload) async {});
    1つ目の方法は、プラグインで作成したchannel変数のオブジェクトを正式なチャネルに登録することです.
    2つ目のタスクは、対応するプラグインを初期化することです.第2の方法では、onSelectedNotificationは、通知をクリックしたときに開始されるコールバックです.クリックすると特定のアクションが表示されるように設定できます.
    AndroidパラメータではAndroid InitializationSettings内部がアイコン設定値ですが、具体的にはわかりません.他人のコードを参考に書いただけです.
    ついにonMessage Stream-肝心な部分を設定
    // 1. 콘솔에서 발송하는 메시지를 message 파라미터로 받아온다.
        /// 메시지가 올 때마다 listen 내부 콜백이 실행된다.
        FirebaseMessaging.onMessage.listen((RemoteMessage message) {
          RemoteNotification? notification = message.notification;
          AndroidNotification? android = message.notification?.android;
    
          // android 일 때만 flutterLocalNotification 을 대신 보여주는 거임. 그래서 아래와 같은 조건문 설정.
          if (notification != null && android != null) {
            flutterLocalNotificationsPlugin.show(
                notification.hashCode,
                notification.title,
                notification.body,
                NotificationDetails(
                  android: AndroidNotificationDetails(
                      channel.id,
                      channel.name,
                      channelDescription: channel.description
                  ),
                ),
    
                // 넘겨줄 데이터가 있으면 아래 코드를 써주면 됨.
                // payload: message.data['argument']
            );
          }
          // 개발 확인 용으로 print 구문 추가
          print('foreground 상황에서 메시지를 받았다.');
          // 데이터 유무 확인
          print('Message data: ${message.data}');
          // notification 유무 확인
          if (message.notification != null) {
            print('Message also contained a notification: ${message.notification!.body}');
          }
        });
    FirebaseMessaging.onMessageはstreamです.データのパイプラインを入力します.Listenは、メッセージが送信されるたびに実行されるコールバックとみなすことができる.
    コールバック内部パラメータのRemoteMessageメッセージは、メッセージを含むオブジェクトです.
    この対象は大体2つの部分がある.notificationとdataは、メッセージを通知し、内部のデータ値を隠す.
     	  RemoteNotification? notification = message.notification;
          AndroidNotification? android = message.notification?.android;
    
          // android 일 때만 flutterLocalNotification 을 대신 보여주는 거임. 그래서 아래와 같은 조건문 설정.
          if (notification != null && android != null) {
            flutterLocalNotificationsPlugin.show(
                notification.hashCode,
                notification.title,
                notification.body,
                NotificationDetails(
                  android: AndroidNotificationDetails(
                      channel.id,
                      channel.name,
                      channelDescription: channel.description
                  ),
                ),
    
                // 넘겨줄 데이터가 있으면 아래 코드를 써주면 됨.
                // payload: message.data['argument']
            );
    この部分はandroidで、アプリケーションを開くときに手動で送信されるコードです.
    // 개발 확인 용으로 print 구문 추가
          print('foreground 상황에서 메시지를 받았다.');
          // 데이터 유무 확인
          print('Message data: ${message.data}');
          // notification 유무 확인
          if (message.notification != null) {
            print('Message also contained a notification: ${message.notification!.body}');
          }
    この部分は開発を確認するために印刷文法を加えただけです.ここまでやったら終わりだ!
    実際のメッセージのテスト

    そこから入って、上の最初のメッセージをクリックすると、このようなウィンドウが表示されます.
    今、私たちは勝手に何かを書いて、テスト情報の送信をクリックします.

    タグを追加する部分に、先ほどメモ帳にコピーしたタグを入力して追加し、選択テストをクリックするとメッセージが表示されます.
    テストメッセージ機能を使用せずに、上記の通知を直接送信する手順はすべて行われましたが、通知は少し遅いです.テスト情報の使用をお勧めします.
    ただし、テスト情報にはデータが含まれていないようです.
    今终わります!ついてきてお疲れ様でした.
    cf)私が見たいので、説明が少し不親切です.英語の正式な書類を見てからやったほうがいいです.この過程で適切な参考資料になることを願っています.