반응형

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

+ Recent posts