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 설정을 해주어야 한다
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,
),
);
특정 시간대 전송이 필요할 떄 타임존을 사용하여 날짜 또는 시간대 설정이 가능하다
여기서 설정할 때 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();