From 892e6678a5a950cfc007572581d0ef5a92eca0ac Mon Sep 17 00:00:00 2001 From: derrik-fleming Date: Mon, 26 Jan 2026 11:15:10 -0500 Subject: [PATCH] feat(ios): add carplay notification permissions option --- .../strategies/NotificationPermissionStrategy.m | 13 +++++++++++++ .../lib/src/permissions.dart | 15 ++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/permission_handler_apple/ios/permission_handler_apple/Sources/permission_handler_apple/strategies/NotificationPermissionStrategy.m b/permission_handler_apple/ios/permission_handler_apple/Sources/permission_handler_apple/strategies/NotificationPermissionStrategy.m index 85ce12e4d..dea2b4fa8 100644 --- a/permission_handler_apple/ios/permission_handler_apple/Sources/permission_handler_apple/strategies/NotificationPermissionStrategy.m +++ b/permission_handler_apple/ios/permission_handler_apple/Sources/permission_handler_apple/strategies/NotificationPermissionStrategy.m @@ -36,6 +36,7 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss authorizationOptions += UNAuthorizationOptionSound; authorizationOptions += UNAuthorizationOptionAlert; authorizationOptions += UNAuthorizationOptionBadge; + authorizationOptions += UNAuthorizationOptionCarPlay; [center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (error != nil || !granted) { completionHandler(PermissionStatusPermanentlyDenied); @@ -60,6 +61,18 @@ + (PermissionStatus)permissionStatus { permissionStatus = PermissionStatusPermanentlyDenied; } else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) { permissionStatus = PermissionStatusDenied; + } else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) { + if (@available(iOS 10.0, *)) { + if (settings.carPlaySetting == UNNotificationSettingEnabled) { + permissionStatus = PermissionStatusGranted; + } else if (settings.carPlaySetting == UNNotificationSettingDisabled) { + permissionStatus = PermissionStatusGranted; + } else { + permissionStatus = PermissionStatusGranted; + } + } else { + permissionStatus = PermissionStatusGranted; + } } dispatch_semaphore_signal(sem); }]; diff --git a/permission_handler_platform_interface/lib/src/permissions.dart b/permission_handler_platform_interface/lib/src/permissions.dart index 8eb1f743f..bb34eb400 100644 --- a/permission_handler_platform_interface/lib/src/permissions.dart +++ b/permission_handler_platform_interface/lib/src/permissions.dart @@ -170,7 +170,20 @@ class Permission { /// Permission for accessing ignore battery optimizations (Android only). static const ignoreBatteryOptimizations = Permission._(16); - /// Permission for pushing notifications. + /// Permission for requesting notification permissions. + /// + /// **iOS**: Requests both general and CarPlay notification permissions on iOS 10.0+. + /// Status checking includes CarPlay settings when available, with graceful fallback + /// for older devices. + /// + /// **Android/Other platforms**: Standard notification permission behavior. + /// + /// Example: + /// ```dart + /// // Automatically includes CarPlay on supported iOS devices + /// final status = await Permission.notification.status; + /// final result = await Permission.notification.request(); + /// ``` static const notification = Permission._(17); /// Permission for accessing the device's media library.