알림 (Notification)
설치
flutter_local_notifications: ^9.1.5
notifiaction.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: 함수명추가
);
}
var androidSetting = AndroidInitializationSettings('app_icon');
여기서 가져가는 이미지 파일 android/app/src/main/res/drawable/app_icon.png 이 경로로 넣어주면 예쁘게 나온다.
회색 검은색만 된대..
//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)
);
}
알림 누르면 원하는 페이지 띄우고 싶을 때
onSelectNotification: (payload){
Navigator.push(context,
MaterialPageRoute(builder: (context) => Text('새로운 페이지'),
)
);
}
payload를 알림에 넣어놓고, 페이지에 나오게 할 수 있는데 이렇게 하지 말래 그냥 SharedPreferences에 넣어서 사용하래
주기적인 알림.
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
notification.dart에 import 시키기.
// 3. 주기적인 알림
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,
);
// show가 아니라 zonedSchedule (시간을 입력할 수 있음)
notifications.zonedSchedule(
2,
'제목2',
'내용2',
tz.TZDateTime.now(tz.local).add(Duration(seconds: 5)), // 현재 시간 +5 초후에 알림 띄우기
NotificationDetails(android: androidDetails, iOS: iosDetails),
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime
);
}
위와 같이 작성하면 5초후에 알림 띄우기 가능.
tz.TZDateTime.now(tz.local).add(Duration(seconds: 5)), // 현재 시간 +5 초후에 알
위에서 second, miniute 등등 사용 가능함.
만약 매일 반복해서 띄우고 싶다?
zoned 가 아니라 periodicallyShow로 바꿀것.
근데 매일 같은 시간에 주고 싶다면 zonedSchedule 로 돌아와서
맨 아래에
matchDateTimeComponents: DateTimeComponents.dayOfWeekAndTime
를 추가해준다.
만약 07:00 에 울리고 싶다.
tz.TZDateTime.now(tz.local).add(Duration(seconds: 5)), // 현재 시간 +5 초후에 알림 띄우기
이 부분에 7:00 로 설정하면 됨.
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;
}
}
makeDate(8,30,0)
이렇게 사용하면 오늘 8:30 이 됨.
localnotification 말고 push를 쓰고 싶다? (서버에서 보내는 경우임)
서버에서 직접 보낼 수는 없음 앱이 켜져있어야 통신되므로
push notification 서버 Firebase Cloud Messaging 폰(goolge play)
백그라운드에서 돌아가는 google play
push 알림을 구현하고 싶으면 서버가 있어야 하고
FireBase 에서 flutter 앱을 수신하는 법을 알아야 함.