Local Notification(리스너)

🔔 Local Notifications 사용해 보기

Local Notifications - 1(설정)
Local Notifications - 2(사용방법)

이번 글에서는 전송한 로컬 푸시를 클릭하여 앱을 오픈하였을 때 앱에서 수신받는 방법에 대하여 알아보도록 하겠다.

Flutter에서 로컬 푸시 기능을 사용하기 위해서 flutter_local_notifciations / awesome_notifications 라는 2개의 라이브러리가 가장 유명하다.

개인적으로는 awesome_notifications이 리스너 부분도 쉽게 사용할 수 있고 더 많은 기능을 가지고 있다고 생각하지만, 로컬 푸시를 메인으로 사용하지 않고 서버 푸시 라이브러리들을 메인으로 사용하게 되는 앱에서는 flutter_local_notifciations 해당 라이브러리도 충분하다.

하지만 flutter_local_notifciations 라이브러리의 앱 종료 상태 리스너 때문에 시간 낭비를 했던 경험이 있어서 글을 작성하게 되었다.

추가로 2개의 라이브러리는 충돌 이슈로 같이 사용할 수 없다.

앱의 라이프 사이클에서 푸시 기능을 사용할 때 고려해야할 상태가 크게 3가지로 나뉘게 된다.

Terminate - 앱 종료
Background - 시스템 백그라운드
Foreground - 실행 중

FCM 등을 활용한 서버 푸시인 경우에는 Foreground 환경에서는 푸시가 노출 되지 않는 것이 시스템의 기본 설정인데, 이러한 환경에서도 푸시를 노출 시키기 위해 사용하는 것이 바로 로컬 푸시 기능이다.

로컬 푸시도 서버 푸시와 마찬가지로 이 3가지의 상태에 따라 리스너의 설정이 달라지게 된다.

Flutter

Foground / Backgroud

먼저 앱 실행 중 또는 백그라운드 상태에서 알림을 수신받기 위해서는 앞선 글에서 설명한 방법대로 초기화 로직을 수행하는 부분에서 설정을 해주면 된다.

onSelectNotification() 함수가 바로 푸시를 클릭해서 들어올 때 작동되는 함수 이다.

해당 함수는 (String? payload) 문자열을 리턴 하며 해당 문자열 안에는 푸시를 전송할 때 설정하는 payload 값을 가지고 있어, 해당 payload 안에 넣어놓은 딥링크를 파싱해서 라우팅에 사용하면 된다.

  await _localNotifications.initialize(
      initSettings,
      onSelectNotification: (String? payload) {
        if (payload != null) {
           logger.e(payload);
           // router
        }
      },
    );

Terminate

Fore/Background 환경에서는 로컬 푸시 수신이 간단하게 가능하지만 문제는 앱 종료 상태인 Terminate 환경이다.

이 부분에서 예상보다 삽질을 하게되면서 Swift로 네이티브 Event Channel도 고려해보고, awesome_notifications 라이브러리도 사용해 봤다.

막상 구현을 하고보니 생각보다 간편하게 리스너를 설정할 수 있었다.

아래 코드를 보면 앱 실행시 푸시를 클릭해서 들어오게 되면 NotificationAppLaunchDetails 객체에 payload 값이 들어가 있는데, 이 부분을 활용해서 사용하게 되면 앱 종료 상태에서도 푸시를 열 수 있다.

NotificationAppLaunchDetails 객체에 payload 값은 한 번 수신 후에 사라지지 않기에 초기 함수 한 번만 실행해야 한다.

  Future<void> _listenerWithTerminated() async {
    FlutterLocalNotificationsPlugin _localNotification =
        FlutterLocalNotificationsPlugin();

    NotificationAppLaunchDetails? details =
        await _localNotification.getNotificationAppLaunchDetails();
    if (details != null) {
      if (details.didNotificationLaunchApp) {
        if (details.payload != null) {
          _localNotificationRouter(details.payload!);
        }
      }
    }
  }

다음 시간엔 서버 푸시를 네이티브 코드로 수신받는 방법에 대해서 알아보겠다.

profile
Flutter Developer

0개의 댓글