From 5d8de532cc3c5594fe93ee9bb9e215ab8677381e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:35:48 +0000 Subject: [PATCH] Implement correct notification permissions for iOS and macOS - Add timezone as direct dependency (per lint rules) - Update initialization to set all permissions to false - Add separate macOS initialization settings - Implement platform-specific permission requests for iOS and macOS - Follow recommended pattern from flutter_local_notifications docs Co-authored-by: dz0ny <239513+dz0ny@users.noreply.github.com> --- lib/services/notification_service.dart | 52 ++++++++++++++++++++++---- pubspec.yaml | 1 + 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/lib/services/notification_service.dart b/lib/services/notification_service.dart index d526330..f2b5b1d 100644 --- a/lib/services/notification_service.dart +++ b/lib/services/notification_service.dart @@ -33,6 +33,9 @@ class NotificationService { 'Notifications for incoming messages from contacts and channels'; /// Initialize notification service + /// Following best practices: set all permission requests to false during init, + /// then request permissions explicitly via requestPermissions() method. + /// This approach is recommended for iOS (all supported versions) and macOS 10.14+. Future initialize() async { if (_isInitialized) return; @@ -47,18 +50,27 @@ class NotificationService { '@mipmap/ic_launcher', ); - // iOS initialization settings - final darwinSettings = DarwinInitializationSettings( - requestAlertPermission: true, - requestBadgePermission: true, - requestSoundPermission: true, - requestCriticalPermission: true, // For urgent SAR notifications + // iOS initialization settings - set all permissions to false + // Permissions will be requested later via requestPermissions() + const darwinSettings = DarwinInitializationSettings( + requestAlertPermission: false, + requestBadgePermission: false, + requestSoundPermission: false, + ); + + // macOS initialization settings - set all permissions to false + // Permissions will be requested later via requestPermissions() + const macOSSettings = MacOSInitializationSettings( + requestAlertPermission: false, + requestBadgePermission: false, + requestSoundPermission: false, ); // Combined initialization settings final initSettings = InitializationSettings( android: androidSettings, iOS: darwinSettings, + macOS: macOSSettings, ); // Initialize plugin @@ -67,7 +79,7 @@ class NotificationService { onDidReceiveNotificationResponse: _onNotificationResponse, ); - // Request permissions + // Request permissions at the appropriate point (after initialization) await _requestPermissions(); // Create notification channels (Android) @@ -82,9 +94,13 @@ class NotificationService { } /// Request notification permissions + /// Uses platform-specific implementations for iOS and macOS as recommended. + /// For iOS: Uses IOSFlutterLocalNotificationsPlugin.requestPermissions() + /// For macOS: Uses MacOSFlutterLocalNotificationsPlugin.requestPermissions() + /// For Android: Uses AndroidFlutterLocalNotificationsPlugin.requestNotificationsPermission() Future _requestPermissions() async { try { - // iOS permissions + // iOS permissions - request at appropriate point after initialization final iosPlugin = _notificationsPlugin .resolvePlatformSpecificImplementation< IOSFlutterLocalNotificationsPlugin @@ -104,6 +120,26 @@ class NotificationService { return; // Exit early if on iOS } + // macOS permissions - request at appropriate point after initialization + final macOSPlugin = _notificationsPlugin + .resolvePlatformSpecificImplementation< + MacOSFlutterLocalNotificationsPlugin + >(); + if (macOSPlugin != null) { + final granted = await macOSPlugin.requestPermissions( + alert: true, + badge: true, + sound: true, + critical: + true, // Request critical alert permission for urgent SAR notifications + ); + _permissionGranted = granted ?? false; + debugPrint( + '💻 [NotificationService] macOS permissions granted: $_permissionGranted', + ); + return; // Exit early if on macOS + } + // Android 13+ permissions final androidPlugin = _notificationsPlugin .resolvePlatformSpecificImplementation< diff --git a/pubspec.yaml b/pubspec.yaml index 418cab9..492d1ca 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -89,6 +89,7 @@ dependencies: # Notifications flutter_local_notifications: ^19.5.0 + timezone: ^0.9.0 # Required for scheduled notifications (direct dependency per lint rules) # Vibration vibration: ^3.1.4