로컬 알림(Local Notifications)은 사용자가 앱을 실행하고 있을 때 중요한 정보를 제공하거나 특정 이벤트를 공지하는 데 유용합니다. Flutter를 사용하면 flutter_local_notifications 패키지를 통해 간편하게 로컬 알림을 설정할 수 있습니다. 이번 글에서는 Flutter에서 로컬 알림을 설정하는 방법을 단계별로 설명하겠습니다.
1. flutter_local_notifications 패키지 설치
먼저, flutter_local_notifications 패키지를 설치해야 합니다. pubspec.yaml 파일에 다음 의존성을 추가합니다.
dependencies:
  flutter:
    sdk: flutter
  flutter_local_notifications: ^9.0.0
그리고 pub get 명령어를 실행하여 패키지를 설치합니다.
2. Android 및 iOS 설정
로컬 알림을 사용하기 위해 Android와 iOS에서 필요한 설정을 추가합니다.
2.1 Android 설정
android/app/src/main/AndroidManifest.xml 파일에 다음 코드를 추가합니다.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application>
    ...
    <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver"
              android:exported="true"/>
    <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"
              android:enabled="true"
              android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
        </intent-filter>
    </receiver>
</application>
2.2 iOS 설정
ios/Runner/Info.plist 파일에 다음 코드를 추가합니다.
<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>remote-notification</string>
</array>
3. 로컬 알림 초기화
이제 Flutter 코드에서 로컬 알림을 초기화합니다. main.dart 파일을 수정하여 초기화 코드를 추가합니다.
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
  late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
  @override
  void initState() {
    super.initState();
    flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    const AndroidInitializationSettings initializationSettingsAndroid =
        AndroidInitializationSettings('@mipmap/ic_launcher');
    const IOSInitializationSettings initializationSettingsIOS =
        IOSInitializationSettings();
    const InitializationSettings initializationSettings =
        InitializationSettings(
            android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
    flutterLocalNotificationsPlugin.initialize(initializationSettings);
  }
  Future<void> _showNotification() async {
    const AndroidNotificationDetails androidPlatformChannelSpecifics =
        AndroidNotificationDetails(
            'your_channel_id', 'your_channel_name',
            channelDescription: 'your_channel_description',
            importance: Importance.max,
            priority: Priority.high,
            showWhen: false);
    const NotificationDetails platformChannelSpecifics =
        NotificationDetails(android: androidPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.show(
      0,
      'Test Notification',
      'This is the notification body',
      platformChannelSpecifics,
      payload: 'item x',
    );
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Local Notifications'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _showNotification,
            child: Text('Show Notification'),
          ),
        ),
      ),
    );
  }
}
위 코드는 간단한 로컬 알림을 생성하고 표시하는 예제입니다. flutterLocalNotificationsPlugin.show 메서드를 사용하여 알림을 생성하고 표시합니다.
4. 고급 설정 및 커스터마이징
로컬 알림을 커스터마이징하고, 예약된 알림을 설정할 수 있습니다. 다음은 알림을 예약하는 예제입니다.
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
  late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
  @override
  void initState() {
    super.initState();
    flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    const AndroidInitializationSettings initializationSettingsAndroid =
        AndroidInitializationSettings('@mipmap/ic_launcher');
    const IOSInitializationSettings initializationSettingsIOS =
        IOSInitializationSettings();
    const InitializationSettings initializationSettings =
        InitializationSettings(
            android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
    flutterLocalNotificationsPlugin.initialize(initializationSettings);
  }
  Future<void> _scheduleNotification() async {
    const AndroidNotificationDetails androidPlatformChannelSpecifics =
        AndroidNotificationDetails(
            'your_channel_id', 'your_channel_name',
            channelDescription: 'your_channel_description',
            importance: Importance.max,
            priority: Priority.high,
            showWhen: false);
    const NotificationDetails platformChannelSpecifics =
        NotificationDetails(android: androidPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.zonedSchedule(
      0,
      'Scheduled Notification',
      'This is the notification body',
      tz.TZDateTime.now(tz.local).add(Duration(seconds: 5)),
      platformChannelSpecifics,
      androidAllowWhileIdle: true,
      uiLocalNotificationDateInterpretation:
          UILocalNotificationDateInterpretation.absoluteTime,
    );
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Local Notifications'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _scheduleNotification,
            child: Text('Schedule Notification'),
          ),
        ),
      ),
    );
  }
}
위 코드는 5초 후에 예약된 알림을 생성하고 표시하는 예제입니다. flutterLocalNotificationsPlugin.zonedSchedule 메서드를 사용하여 예약된 알림을 설정합니다.
5. 알림 클릭 이벤트 처리
알림을 클릭했을 때 특정 작업을 수행하도록 이벤트를 처리할 수 있습니다. 다음은 알림 클릭 이벤트를 처리하는 예제입니다.
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
  late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
  @override
  void initState() {
    super.initState();
    flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    const AndroidInitializationSettings initializationSettingsAndroid =
        AndroidInitializationSettings('@mipmap/ic_launcher');
    const IOSInitializationSettings initializationSettingsIOS =
        IOSInitializationSettings();
    const InitializationSettings initializationSettings =
        InitializationSettings(
            android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: _onSelectNotification);
  }
  Future<void> _showNotification() async {
    const AndroidNotificationDetails androidPlatformChannelSpecifics =
        AndroidNotificationDetails(
            'your_channel_id', 'your_channel_name',
            channelDescription: 'your_channel_description',
            importance: Importance.max,
            priority: Priority.high,
            showWhen: false);
    const NotificationDetails platformChannelSpecifics =
        NotificationDetails(android: androidPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.show(
      0,
      'Test Notification',
      'This is the notification body',
      platformChannelSpecifics,
      payload: 'item x',
    );
  }
  Future<void> _onSelectNotification(String? payload) async {
    if (payload != null) {
      debugPrint('notification payload: $payload');
    }
    await Navigator.push(
      context,
      MaterialPageRoute<void>(builder: (context) => SecondScreen(payload: payload)),
    );
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Local Notifications'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _showNotification,
            child: Text('Show Notification'),
          ),
        ),
      ),
    );
  }
}
class SecondScreen extends StatelessWidget {
  final String? payload;
  const SecondScreen({Key? key, this.payload}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Screen'),
      ),
      body: Center(
        child: Text('Payload: $payload'),
      ),
    );
  }
}
위 코드는 알림을 클릭했을 때 SecondScreen으로 이동하여 알림의 payload를 표시하는 예제입니다. onSelectNotification 콜백을 사용하여 알림 클릭 이벤트를 처리합니다.
결론
Flutter에서 flutter_local_notifications 패키지를 사용하면 로컬 알림을 쉽게 구현할 수 있습니다. Android와 iOS 설정을 추가하고, 초기화 및 알림 생성, 예약된 알림, 알림 클릭 이벤트 처리 등의 기능을 구현할 수 있습니다. 이번 글에서 소개한 방법들을 활용하여 Flutter 애플리케이션에서 로컬 알림 기능을 구현해보세요. 로컬 알림을 통해 사용자에게 중요한 정보를 효과적으로 전달할 수 있습니다.
'Flutter' 카테고리의 다른 글
| Flutter의 실시간 데이터베이스(Real-time Database) 사용법 (1) | 2025.01.21 | 
|---|---|
| Flutter의 채팅 애니메이션(Chat Animation) 구현하기 (0) | 2025.01.21 | 
| Flutter의 푸시 알림(Push Notifications) 설정 (0) | 2025.01.20 | 
| Flutter의 알림(Notification) 구현하기 (0) | 2025.01.19 | 
| Flutter의 채팅 애플리케이션(Chat Application) 만들기 (2) | 2025.01.18 |