
Notification
- push notification - 서버에서 보내는 알림
- local notification - 앱 자체에서 실행하는 알림
패키지 설치
- pubspec.yaml에 flutter_local_notifications: ^9.1.5 추가 후 pub get
Android 셋팅
- android/app/src/main/res/drawable 폴더에 알림에 띄울 아이콘 용 넣기
- 흰색 아웃라인만 있는 .png만 허용

iOS 셋팅
- 프로젝트 내의 ios/Runner/AppDelegate.swift 파일에 코드 추가
- GeneratedPluginRegistrant.register(with: self) 이런 코드 윗줄에 복붙
if #available(iOS 10.0, *) { UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate }
알림 띄우려면 실행할 코드
- notifications.initialize() 이런 코드를 한 번 실행해야 알림 서비스가 잘 작동
- notification.dart 파일 만들어서 이런 코드 복붙
import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; final notifications = FlutterLocalNotificationsPlugin(); //1. 앱로드시 실행할 기본설정 initNotification() async { //안드로이드용 아이콘파일 이름 var androidSetting = AndroidInitializationSettings('app_icon'); //ios에서 앱 로드시 유저에게 권한요청하려면 var iosSetting = IOSInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, ); var initializationSettings = InitializationSettings( android: androidSetting, iOS: iosSetting ); await notifications.initialize( initializationSettings, //알림 누를때 함수실행하고 싶으면 //onSelectNotification: 함수명추가 ); }
- local_notification 요즘버전은 IOSInitializationSettings() 부분을 DarwinInitializationSettings() 로 바꿔야 잘될 수 있음
⇒ main.dart 파일에 사용 → import 하기
- MyApp 위젯이 로드될 때 저 함수 안의 내용이 실행됨
import 'notification.dart'; @override void initState() { super.initState(); initNotification(); //추가함 getData(); }
알림 띄우는 코드
- notifications.show() 코드 쓰면 알림 듬
//2. 이 함수 원하는 곳에서 실행하면 알림 뜸 showNotification() async { var androidDetails = AndroidNotificationDetails( '유니크한 알림 채널 ID', '알림종류 설명', priority: Priority.high, importance: Importance.max, color: Color.fromARGB(255, 255, 0, 0), ); var iosDetails = IOSNotificationDetails( presentAlert: true, presentBadge: true, presentSound: true, ); // 알림 id, 제목, 내용 맘대로 채우기 notifications.show( 1, '제목1', '내용1', NotificationDetails(android: androidDetails, iOS: iosDetails) ); }
⇒ local_notification 요즘버전은 IOSNotificationDetails를 DarwinNotificationDetails로 바꿔야 잘될 수 있음
- 알림 ID는 알림 채널 ID 만드는 곳인데 비슷한 알림들을 모으는 그룹 같은 거라고 생각하면 되고 알아서 아무 글자나 넣으면 됨
- 알림 설명은 알림 채널 설명 적으면 됩니다. 안드로이드에서 알림 길게 누르면 나오는 문자임
- color : 파라미터 수정하면 안드로이드에서 알림 아이콘 색상이 변경
- priority, importance를 수정하면 안드로이드에서 알림 소리, 팝업 띄울지 말지를 결정 가능
- iosDetails 부분에 presentSound : false로 바꿔주면 iOS 알림 보여줄 때 소리 켤지말지 선택 가능
- 실제 알림 제목, 내용은 notifications.show() 안에서 수정하면 됩니다. 안에 있는 숫자는 개별 알림마다 넣을 유니크한 번호임
전체 코드
import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; final notifications = FlutterLocalNotificationsPlugin(); //1. 앱로드시 실행할 기본설정 initNotification(context) async { //안드로이드용 아이콘파일 이름 var androidSetting = AndroidInitializationSettings('app_icon'); //ios에서 앱 로드시 유저에게 권한요청하려면 var iosSetting = IOSInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, ); var initializationSettings = InitializationSettings( android: androidSetting, iOS: iosSetting ); await notifications.initialize( initializationSettings, //알림 누를때 함수실행하고 싶으면 onSelectNotification: (payload) { Navigator.push( context, MaterialPageRoute( builder: (context) => Text('새로운페이지'), ), ); } ); } //2. 이 함수 원하는 곳에서 실행하면 알림 뜸 showNotification() async { // 안드로이드 var androidDetails = AndroidNotificationDetails( '유니크한 알림 채널 ID', '알림종류 설명', priority: Priority.high, // 중요도 importance: Importance.max, // 중요도 color: Color.fromARGB(255, 255, 0, 0), // 알림 색상 ); // ios var iosDetails = IOSNotificationDetails( presentAlert: true, // 알림 여부 presentBadge: true, // 뱃지 여부 presentSound: true, // 소리 여부 ); // 알림 id, 제목, 내용 맘대로 채우기 notifications.show( 1, '제목1', '내용1', NotificationDetails(android: androidDetails, iOS: iosDetails), payload: '부가정보' ); }
주기적인 알림
- notification.dart 상단에 추가
import 'package:timezone/data/latest_all.dart' as tz; import 'package:timezone/timezone.dart' as tz;
특정 시간에 알림 띄우기
- notifications.zonedSchedule() 쓰면 알림 띄워주는데 입력한 시간에 알림 띄워주는 기능
- 타임존에 따른 현재 시간은 tz.TZDateTime.now(tz.local)
- uiLocalNotificationDateInterpretation: 은 iOS 10 미만 기기들 호환을 위한 기능
showNotification2() async { tz.initializeTimeZones(); var androidDetails = const AndroidNotificationDetails( '유니크한 알림 ID', '알림종류 설명', priority: Priority.high, importance: Importance.max, color: Color.fromARGB(255, 255, 0, 0), ); var iosDetails = const IOSNotificationDetails( presentAlert: true, presentBadge: true, presentSound: true, ); // 특정 시간 알림 notifications.zonedSchedule( 2, '제목2', '내용2', tz.TZDateTime.now(tz.local).add(Duration(seconds: 5)), NotificationDetails(android: androidDetails, iOS: iosDetails), androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime ); }
주기적 알림
- notifications.periodicallyShow
- RepeatInterval.daily 부분을 맘대로 바꾸면 됨 → weekly, hourly 이런 거 있음
- daily로 설정해놓으면 코드가 실행되는 시점으로부터 정확히 24시간 후 알림 뜸
notifications.periodicallyShow( 3, '제목3', '내용3', RepeatInterval.daily, NotificationDetails(android: androidDetails, iOS: iosDetails), androidAllowWhileIdle: true );
예정된 알림 취소하는 법
- 0은 알림 번호
- 0 자리에 알림 번호 적으면 해당 알림이 취소됨
await notifications.cancel(0);
모든 예정된 알림 삭제
await notifications.cancelAll();
매일 7시 알림
- matchDateTimeComponents: DateTimeComponents.time 있어야 함
- .time 대신 .dayOfWeekAndTime 이런 파라미터가 있으면 같은 요일, 시간 매주 알림을 띄워줌
- .time 대신 .dayOfMonthAndTime 이런 파라미터가 있으면 같은 날짜, 시간 매달 알림을 띄워줌
- .time 대신 .dateAndTime 이런 파라미터가 있으면 같은 날짜, 시간 매년 알림을 띄워줌
- 함수 생성
makeDate(hour, min, sec){ var now = tz.TZDateTime.now(tz.local); var when = tz.TZDateTime(tz.local, now.year, now.month, now.day, hour, min, sec); if (when.isBefore(now)) { return when.add(Duration(days: 1)); } else { return when; } } - zonedSchedule 안에 넣어서 사용하면 됨
notifications.zonedSchedule( 2, '제목2', '내용2', makeDate(8,30,0), NotificationDetails(android: androidDetails, iOS: iosDetails), androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, matchDateTimeComponents: DateTimeComponents.time );
서버가 보내는 Push 알림
- Firebase Cloud Message 로 메시지를 보내서 전송해야 함

전체 코드
'Web & Android > Flutter' 카테고리의 다른 글
[Flutter] 유용한 패키지들 (0) | 2023.09.23 |
---|---|
[Flutter] 반응형 스크린 사이즈 (0) | 2023.09.23 |
[Flutter] GridView, CustomScrollView 프로필 페이지 만들기 (0) | 2023.09.23 |
[Flutter] Provider : store 여러개 & GET 요청 (0) | 2023.09.23 |
[Flutter] 친구 팔로우 하기 (1) | 2023.09.23 |