Flutter에서는 Local Notifications를 사용하여 앱 내에서 사용자에게 알림을 보낼 수 있습니다. 이 글에서는 플러터 푸시 알림을 Local Notifications를 통하여 구현하는 방법에 대해서 작성하겠습니다.

플러터 푸시 알림 사용법
pubspec.yaml 파일 수정
프로젝트에 Local Notifications을 사용하기 위해 패키지를 설치해야 합니다. pubspec.yaml파일을 열고 flutter_local_notifications를 추가합니다.
dependencies:
flutter:
sdk: flutter
flutter_local_notifications: ^15.1.1
rxdart: ^0.27.7Local Notifications 초기 설정
Local Notifications를 사용하기 위해 초기 설정이 필요합니다. Android 설정은 테스트해보지 않아서 작성하지 않았습니다.
iOS 설정
ios/Runner/AppDelegate.swift 파일에 초기화 코드를 추가합니다. 추가된 부분은 주석으로 설명이 되어 있으니 확인하세요.
import UIKit
import Flutter
// 패키지 추가
import flutter_local_notifications
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// 앱이 백그라운드에서 실행되면서 알림을 처리할 때 필요한 플러그인을 등록할 수 있도록 합니다.
FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
GeneratedPluginRegistrant.register(with: registry)
}
// iOS 10.0 이상에서 사용할 수 있는 기능을 조건부로 실행합니다. #available(iOS 10.0, *) 조건은 현재 iOS 버전이 10.0 이상인지 확인합니다.
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}
// 이 부분은 특정 조건에 따라 로컬 알림을 취소하고 초기화합니다.
if(!UserDefaults.standard.bool(forKey: "Notification")) {
UIApplication.shared.cancelAllLocalNotifications()
UserDefaults.standard.set(true, forKey: "Notification")
}
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
Local Notifications 예제코드
Local Notifications 간단한 예제입니다.
알림 설정 초기화
알림 초기화 및 설정을 처리할 클래스를 만듭니다.
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:rxdart/rxdart.dart';
// LocalNotifications 클래스는 Flutter 앱에서 로컬 알림을 처리합니다.
class LocalNotifications {
// FlutterLocalNotificationsPlugin 인스턴스를 초기화합니다.
static final FlutterLocalNotificationsPlugin
_flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
// 알림 클릭을 처리하기 위해 BehaviorSubject를 사용합니다.
static final onClickNotification = BehaviorSubject<String>();
// 알림이 클릭될 때 호출되는 메서드입니다.
static void onNotificationTap(NotificationResponse notificationResponse) {
onClickNotification.add(notificationResponse.payload!);
}
// 알림 초기화를 위한 메서드입니다.
static Future init() async {
// Android 초기화 설정을 정의합니다.
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('@mipmap/ic_launcher');
// iOS 초기화 설정을 정의합니다.
final DarwinInitializationSettings initializationSettingsDarwin =
DarwinInitializationSettings(
onDidReceiveLocalNotification: (id, title, body, payload) => null,
);
// Linux 초기화 설정을 정의합니다.
final LinuxInitializationSettings initializationSettingsLinux =
LinuxInitializationSettings(defaultActionName: 'Open notification');
// 모든 플랫폼의 초기화 설정을 통합합니다.
final InitializationSettings initializationSettings =
InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin,
linux: initializationSettingsLinux);
// Android 플랫폼에서 알림 권한을 요청합니다.
final androidImplementation =
_flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>();
if (androidImplementation != null) {
androidImplementation.requestPermission();
}
// 알림 초기화 및 알림 응답 처리 설정을 합니다.
_flutterLocalNotificationsPlugin.initialize(initializationSettings,
onDidReceiveNotificationResponse: onNotificationTap,
onDidReceiveBackgroundNotificationResponse: onNotificationTap);
}
// 간단한 알림을 표시하는 메서드입니다.
static Future showSimpleNotification({
required String title,
required String body,
required String payload,
}) async {
// Android 알림 세부 설정을 정의합니다.
const AndroidNotificationDetails androidNotificationDetails =
AndroidNotificationDetails('your channel id', 'your channel name',
channelDescription: 'your channel description',
importance: Importance.max,
priority: Priority.high,
ticker: 'ticker');
// 알림 세부 설정을 통합합니다.
const NotificationDetails notificationDetails =
NotificationDetails(android: androidNotificationDetails);
// 알림을 표시합니다.
await _flutterLocalNotificationsPlugin
.show(0, title, body, notificationDetails, payload: payload);
}
}
알람 표시
앱에서 간단한 알림을 표시하는 버튼입니다.
void main() async {
// Flutter 프레임워크의 비동기 작업을 위해 필요한 바인딩을 초기화합니다.
WidgetsFlutterBinding.ensureInitialized();
// LocalNotifications 클래스의 init 메서드를 호출하여 알림을 초기화합니다.
await LocalNotifications.init();
// Flutter 애플리케이션을 실행합니다.
runApp(const MyApp());
}
// MyApp 클래스는 Flutter 애플리케이션의 루트 위젯입니다.
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
// 애플리케이션의 제목을 설정합니다.
title: 'Flutter Demo',
// 애플리케이션의 테마를 설정합니다.
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
// 애플리케이션의 홈 화면을 설정합니다.
home: const Homepage(),
);
}
}
// Homepage 클래스는 애플리케이션의 홈 화면을 정의합니다.
class Homepage extends StatefulWidget {
const Homepage({super.key});
@override
State<Homepage> createState() => _HomepageState();
}
// _HomepageState 클래스는 Homepage의 상태를 관리합니다.
class _HomepageState extends State<Homepage> {
@override
Widget build(BuildContext context) {
return Scaffold(
// 앱바를 설정하여 제목을 표시합니다.
appBar: AppBar(title: Text("Flutter 로컬 알림")),
// 화면의 중심에 버튼을 배치합니다.
body: Center(
child: ElevatedButton.icon(
// 버튼에 아이콘을 설정합니다.
icon: Icon(Icons.notifications_outlined),
// 버튼을 눌렀을 때 실행될 함수를 정의합니다.
onPressed: () {
// LocalNotifications 클래스의 showSimpleNotification 메서드를 호출하여 알림을 표시합니다.
LocalNotifications.showSimpleNotification(
title: "심플 알림",
body: "심플 알림입니다",
payload: "심플 데이터입니다",
);
},
// 버튼에 표시될 텍스트를 설정합니다.
label: Text("심플 알림"),
),
),
);
}
}
결과 이미지
버튼을 클릭하면 알림이 나옵니다.

