Local Notification(사용 방법)

🔔 Local Notifications 사용해 보기

Local Notifications - 1(설정)
Local Notifications - 3(리스너)

초기화

Local Notifications 라이브러리 사용 전 초기화 로직이 필요하다
초기화는 앱 사용 중 한 번만 해주면 되고 반드시 로컬 푸시 기능이 사용되기 전에 초기화를 해주어야 한다

보통 main.dart 파일의 initState()에서 초기화를 진행하지만 앱 진입시 가장 먼저 노출되는 스크린에서 해줘도 된다

Andorid에서 아이콘을 설정 해주어야 하는데 android > app > main > res에 있는 mipmap 폴더의 기본 아이콘으로 설정해 주었다

IOS는 Sound/Badge/Alert의 권한 설정을 해주어야 하는데 초기화시 퍼미션을 요청하려면 true 값을 주면 된다

여기서는 앱 실행시 따로 권한을 요청하기 위해 false로 주고 퍼미션 요청 로직은 다른 부분에서 처리하고 있다

 Future<void> _initLocalNotification() async {
    FlutterLocalNotificationsPlugin _localNotification =
        FlutterLocalNotificationsPlugin();
    AndroidInitializationSettings initSettingsAndroid =
        const AndroidInitializationSettings('@mipmap/ic_launcher');
    DarwinInitializationSettings initSettingsIOS =
        const DarwinInitializationSettings(
      requestSoundPermission: false,
      requestBadgePermission: false,
      requestAlertPermission: false,
    );
    InitializationSettings initSettings = InitializationSettings(
      android: initSettingsAndroid,
      iOS: initSettingsIOS,
    );
    await _localNotification.initialize(
      initSettings,
    );
  }

사용 방법

  • NotificationDetails

로컬 푸시 기능을 사용할 때 NotificationDetails 설정을 해주어야 한다
android / ios 뿐만 아니라 macOs / Linux에 대한 설정을 해줄 수 있다
android에서는 channel Id / channel Name 설정이 필수 값으로 해당 채널 이름이 시스템 설정의 앱 알림 카테고리로 등록된다
ios는 앞서 권한 요청을 받은 부분의 사용 여부만 넣어주면 된다

NotificationDetails _details = const NotificationDetails(
      android: AndroidNotificationDetails('alarm 1', '1번 푸시'),
      iOS: DarwinNotificationDetails(
        presentAlert: true,
        presentBadge: true,
        presentSound: true,
      ),
    );
  • TimeZone

특정 시간대 전송이 필요할 떄 타임존을 사용하여 날짜 또는 시간대 설정이 가능하다
여기서 설정할 때 Dration을 사용하여 매시/매일/주/월간 전송을 커스텀 할 수 있다

 tz.TZDateTime _timeZoneSetting({
    required int hour,
    required int minute,
  }) {
    tz.initializeTimeZones();
    tz.setLocalLocation(tz.getLocation('Asia/Seoul'));
    tz.TZDateTime _now = tz.TZDateTime.now(tz.local);
    tz.TZDateTime scheduledDate =
        tz.TZDateTime(tz.local, _now.year, _now.month, _now.day, hour, minute);

    return scheduledDate;
  }

즉시 전송(일회성)

푸시를 한 번만 즉시 받고 싶을 때 사용하는 방법으로 show() 함수를 호출하여 사용할 수 있다

여기서 id를 설정하게 되는데 id 값은 고유하여야 하며 전송을 취소하고 싶을 때 사용된다

타이틀 / 바디 값을 넣어주고 디테일에는 위에서 설정한 디테일 값을 넣어준다
payload는 푸시 알림을 클릭하여 앱에 진입시 전달 받게되는 이벤트 값으로 딥링크 형태로 넣어서 라우팅을 시도하면 된다

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

    await _localNotification.show(0, 
    '로컬 푸시 알림', 
    '로컬 푸시 알림 테스트',
    _details,
    payload: 'deepLink');
  }

특정 날짜/시간대 전송

zonedSchedule() 함수 기능으로 로컬 푸시를 예약할 수 있다
여기서 설정되는 timeZone은 앞서 설명한 타임존으로 넣어서 사용하면 된다

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

  await _localNotification.zonedSchedule(
      1,
      '로컬 푸시 알림 2',
      '특정 날짜 / 시간대 전송 알림',
      _timeZoneSetting(),
      _details,
      uiLocalNotificationDateInterpretation:
          UILocalNotificationDateInterpretation.absoluteTime,
      androidAllowWhileIdle: true,
    );
  }

매일 전송

옵션을 추가해주면 타임존에 세팅된 시간대로 매일 같은 시간에 로컬 푸시를 전송한다

 matchDateTimeComponents: DateTimeComponents.time,

주/월간 전송

주/월간 전송도 일 전송 방식과 같다

matchDateTimeComponents: DateTimeComponents.dayOfWeekAndTime,
matchDateTimeComponents: DateTimeComponents.dayOfMonthAndTime,

전송 취소

등록된 스케쥴 알림의 id로 구독 취소

  FlutterLocalNotificationsPlugin _localNotification =
        FlutterLocalNotificationsPlugin();
await  _localNotification.cancel(1);

등록된 모든 스케쥴 알림 한 번에 취소

  FlutterLocalNotificationsPlugin _localNotification =
        FlutterLocalNotificationsPlugin();
  _localNotification.cancelAll();
profile
Flutter Developer

0개의 댓글