반응형
Flutter에서 로컬 알림(Local Notifications)을 사용하면 앱이 백그라운드에 있거나 사용자가 앱을 사용하고 있지 않은 경우에도 사용자에게 알림을 보낼 수 있습니다. 이를 위해 flutter_local_notifications 패키지를 사용할 수 있습니다. 이 패키지는 Android와 iOS 모두에서 로컬 알림을 지원합니다.
1. 패키지 설치
먼저 pubspec.yaml 파일에 flutter_local_notifications 패키지를 추가합니다:
dependencies:
flutter:
sdk: flutter
flutter_local_notifications: ^12.0.3
그런 다음 flutter pub get 명령을 실행하여 패키지를 설치합니다.
2. Android 설정
Android에서 로컬 알림을 사용하려면 AndroidManifest.xml 파일에 필요한 권한과 리시버(receiver)를 추가해야 합니다.
android/app/src/main/AndroidManifest.xml 파일을 다음과 같이 수정합니다:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.your_app">
<!-- 알림 관련 권한 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:label="flutter_lecture"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<!-- 알림 관련 서비스 -->
<receiver
android:name="com.dexterous.flutterlocalnotifications.receivers.NotificationBroadcastReceiver"
android:exported="true"/>
<receiver
android:name="com.dexterous.flutterlocalnotifications.receivers.ActionReceiver"
android:exported="true"/>
<receiver
android:name="com.dexterous.flutterlocalnotifications.receivers.DismissedReceiver"
android:exported="true"/>
<receiver
android:name="com.dexterous.flutterlocalnotifications.receivers.ScheduledNotificationBootReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
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>
<!-- 기타 설정들 -->
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
android:showWhenLocked="true"
android:turnScreenOn="true">
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2"/>
</application>
<!-- 패키지 가시성 설정 -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>
3. iOS 설정
iOS에서 로컬 알림을 사용하려면 추가적인 설정이 필요합니다.
ios/Runner/Info.plist 파일을 다음과 같이 수정합니다:
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
</array>
4. FlutterLocalNotification 클래스
Flutter에서 로컬 알림을 관리할 클래스를 정의합니다. 이 클래스는 알림을 초기화하고, 알림 권한을 요청하며, 알림을 보내는 기능을 포함합니다.
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
class FlutterLocalNotification {
FlutterLocalNotification._();
static final FlutterLocalNotificationsPlugin flutterLocalNotificationPlugin = FlutterLocalNotificationsPlugin();
static Future<void> init() async {
const AndroidInitializationSettings androidInitializationSettings =
AndroidInitializationSettings('@mipmap/ic_launcher');
const DarwinInitializationSettings iosInitializationSettings =
DarwinInitializationSettings(
requestAlertPermission: false,
requestBadgePermission: false,
requestSoundPermission: false
);
final InitializationSettings initializationSettings = InitializationSettings(
android: androidInitializationSettings,
iOS: iosInitializationSettings,
);
await flutterLocalNotificationPlugin.initialize(
initializationSettings,
onSelectNotification: (String? payload) async {
// 알림을 클릭했을 때의 동작 정의
},
);
}
static void requestNotificationPermission() {
flutterLocalNotificationPlugin
.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()
?.requestPermissions(alert: true, badge: true, sound: true);
}
static Future<void> showNotification() async {
const AndroidNotificationDetails androidNotificationDetails =
AndroidNotificationDetails(
'channel id',
'channel name',
channelDescription: 'channel description',
importance: Importance.max,
priority: Priority.high,
showWhen: false
);
const NotificationDetails notificationDetails = NotificationDetails(
android: androidNotificationDetails,
iOS: DarwinNotificationDetails(badgeNumber: 1),
);
await flutterLocalNotificationPlugin.show(
0,
'test title',
'test body',
notificationDetails,
);
}
}
5. main.dart 파일
앱을 초기화하고 로컬 알림을 설정하는 코드를 추가합니다.
import 'package:flutter/material.dart';
import 'package:flutter_lecture/notification.dart'; // 경로를 실제 경로로 변경하세요.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await FlutterLocalNotification.init(); // 플러그인 초기화
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
initializeNotifications();
}
Future<void> initializeNotifications() async {
await FlutterLocalNotification.init();
Future.delayed(
const Duration(seconds: 3),
() => FlutterLocalNotification.requestNotificationPermission()
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("알림 목록"),
),
body: Center(
child: TextButton(
onPressed: () => FlutterLocalNotification.showNotification(),
child: const Text("알림보내기")
)
),
);
}
}
6. 프로젝트 정리 및 빌드
마지막으로, 프로젝트를 정리하고 다시 빌드합니다.
flutter clean
flutter pub get
flutter run
반응형
'프론트엔드 > Flutter' 카테고리의 다른 글
flutter form 제출 및 라우터 이동 (0) | 2024.07.22 |
---|---|
flutter webview 사용방법 (0) | 2024.07.22 |
flutter get_it 패턴 (1) | 2024.07.22 |
flutter provider 패턴 (1) | 2024.07.22 |
flutter bloc 패턴 적용 (0) | 2024.07.22 |