inistState()
메서드에서 진행한다.initState()
메서드는 async는 동작하지 않으므로 각각의 메서드들을 명시할 때 async를 걸어주는 것이 좋다. Future<void> _initLocalNotification() async {
FlutterLocalNotificationsPlugin _localNotification = FlutterLocalNotificationsPlugin();
AndroidInitializationSettings initSettingsAndroid = const AndroidInitializationSettings('favicon');
DarwinInitializationSettings initSettingsIOS = const DarwinInitializationSettings(
requestSoundPermission: false,
requestBadgePermission: false,
requestAlertPermission: false,
);
InitializationSettings initSettings = InitializationSettings(android: initSettingsAndroid, iOS: initSettingsIOS);
await _localNotification.initialize(
initSettings,
onSelectedNotification:(String? payload){
// '여기에 알람 클릭 시 실행할 라우팅이라든지, 로직 추가 예를 들어'
final _controller = Get.put(RoutePageController());
_controller.tabIndex.value=1
Get.toNamed('/routePage);
}
);
}
initialize()
에서 onSelectedNotification
속성값은 (String? payload) 문자열을 리턴 하며,
해당 문자열 안에는 푸시를 전송할 때 설정하는 payload 값을 가지고 있어, 해당 payload 안에 넣어놓은 딥링크를 파싱해서 라우팅에 사용하면 된다.
참고로 저기 DarwinInitializationSettings
에서 Permission을 true로 주면 앱 실행하자마자 요청 권한을 묻는다. 그래서 통상 true로 설정한다.
이미지는 앞선 포스팅에 적혀있는데 drawable에 아이콘을 넣었다면 따로 경로, 확장자 없이 그냥 파일 이름만 명시해주면 된다.
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!);
}
}
}
}
앱 실행시 푸시를 클릭해서 들어오게 되면 NotificationAppLaunchDetails 객체에 payload 값이 들어가 있는데,
이 부분을 활용해서 사용하게 되면 앱 종료 상태에서도 푸시를 열 수 있다.
NotificationAppLaunchDetails 객체에 payload 값은 한 번 수신 후에 사라지지 않기에 초기 함수 한 번만 실행해야 한다.
final notifications = FlutterLocalNotificationsPlugin();
AndroidNotificationChannel channel = const AndroidNotificationChannel(
'high_importance_channel',
'High Importance Notifications',
description:
'This channel is used for important notifications.',
);
showNotification() async {
const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
'유니크한 알림 채널 ID',
'채널 이름',
channelDescripttion:'알림종류 설명',
priority: Priority.high,
importance: Importance.max,
color: Color.fromARGB(255, 255, 0, 0),
showWhen:false
);
const iosDetails = DarwinNotificationDetails(
presentAlert: true,
presentBadge: true,
presentSound: true,
badgeNumber: 1
);
const NotificationDetails platformChannelSpecifics = NotificationDetails(
android: adnroidDetails,
iOS: iosDetails
);
// 알림 id, 제목, 내용 맘대로 채우기
notifications.show(
1,
'제목1',
'내용1',
NotificationDetails(android: androidDetails, iOS: iosDetails)
);
}
.show()
메서드로 실제 사용자 눈에 표출할 수 있다. Future<void> showPushAlarm() async {
FlutterLocalNotificationsPlugin _localNotification = FlutterLocalNotificationsPlugin();
await _localNotification.show(
0,
'로컬 푸시 알림',
'로컬 푸시 알림 테스트',
NotificationDetails(android: androidDetails, iOS: iosDetails),
payload: 'deepLink');
}
void reqeustPermission(){
flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermission(alert:true, badge:true, sound:true);
}
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;
}
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,
FlutterLocalNotificationsPlugin _localNotification = FlutterLocalNotificationsPlugin();
await _localNotification.cancel(1);
FlutterLocalNotificationsPlugin _localNotification = FlutterLocalNotificationsPlugin();
_localNotification.cancelAll();