diff --git a/permission_handler_apple/CHANGELOG.md b/permission_handler_apple/CHANGELOG.md index 20a65108..fbd51929 100644 --- a/permission_handler_apple/CHANGELOG.md +++ b/permission_handler_apple/CHANGELOG.md @@ -1,3 +1,8 @@ +## 9.4.7 + +* Increases minimum supported Flutter version to 3.3.0, and removes code only + required for iOS versions prior to iOS 11. + ## 9.4.6 * Adds the ability to handle `CNAuthorizationStatusLimited` introduced in ios18 diff --git a/permission_handler_apple/ios/Classes/PermissionManager.m b/permission_handler_apple/ios/Classes/PermissionManager.m index a6d708a8..6bba48ca 100644 --- a/permission_handler_apple/ios/Classes/PermissionManager.m +++ b/permission_handler_apple/ios/Classes/PermissionManager.m @@ -80,21 +80,11 @@ - (void)requestPermissions:(NSArray *)permissions completion:(PermissionRequestC } + (void)openAppSettings:(FlutterResult)result { - if (@available(iOS 10, *)) { - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] - options:[[NSDictionary alloc] init] - completionHandler:^(BOOL success) { - result([[NSNumber alloc] initWithBool:success]); - }]; - } else if (@available(iOS 8.0, *)) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; - result([[NSNumber alloc] initWithBool:success]); -#pragma clang diagnostic pop - } else { - result(@false); - } + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] + options:[[NSDictionary alloc] init] + completionHandler:^(BOOL success) { + result([[NSNumber alloc] initWithBool:success]); + }]; } + (id)createPermissionStrategy:(PermissionGroup)permission { diff --git a/permission_handler_apple/ios/Classes/strategies/AssistantPermissionStrategy.m b/permission_handler_apple/ios/Classes/strategies/AssistantPermissionStrategy.m index 377cc49f..e143517e 100644 --- a/permission_handler_apple/ios/Classes/strategies/AssistantPermissionStrategy.m +++ b/permission_handler_apple/ios/Classes/strategies/AssistantPermissionStrategy.m @@ -12,12 +12,8 @@ @implementation AssistantPermissionStrategy - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { - if (@available(iOS 10, *)) { - INSiriAuthorizationStatus assistantPermission = [INPreferences siriAuthorizationStatus]; - return [AssistantPermissionStrategy parsePermission:assistantPermission]; - } - - return PermissionStatusGranted; + INSiriAuthorizationStatus assistantPermission = [INPreferences siriAuthorizationStatus]; + return [AssistantPermissionStrategy parsePermission:assistantPermission]; } - (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler { @@ -31,14 +27,10 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss return; } - if (@available(iOS 10, *)){ - [INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) { - PermissionStatus permissionStatus = [AssistantPermissionStrategy parsePermission:status]; - completionHandler(permissionStatus); - }]; - } else { - completionHandler(PermissionStatusGranted); - } + [INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) { + PermissionStatus permissionStatus = [AssistantPermissionStrategy parsePermission:status]; + completionHandler(permissionStatus); + }]; } + (PermissionStatus)parsePermission:(INSiriAuthorizationStatus)assistantPermission API_AVAILABLE(ios(10)){ diff --git a/permission_handler_apple/ios/Classes/strategies/BluetoothPermissionStrategy.m b/permission_handler_apple/ios/Classes/strategies/BluetoothPermissionStrategy.m index 6443fe43..ffd0a0d0 100644 --- a/permission_handler_apple/ios/Classes/strategies/BluetoothPermissionStrategy.m +++ b/permission_handler_apple/ios/Classes/strategies/BluetoothPermissionStrategy.m @@ -61,12 +61,7 @@ - (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(Servic } - (void)handleCheckServiceStatusCallback:(CBCentralManager *)centralManager { - if (@available(iOS 10, *)) { - ServiceStatus serviceStatus = [centralManager state] == CBManagerStatePoweredOn ? ServiceStatusEnabled : ServiceStatusDisabled; - _serviceStatusHandler(serviceStatus); - } - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - ServiceStatus serviceStatus = [centralManager state] == CBCentralManagerStatePoweredOn ? ServiceStatusEnabled : ServiceStatusDisabled; + ServiceStatus serviceStatus = [centralManager state] == CBManagerStatePoweredOn ? ServiceStatusEnabled : ServiceStatusDisabled; _serviceStatusHandler(serviceStatus); } diff --git a/permission_handler_apple/ios/Classes/strategies/ContactPermissionStrategy.m b/permission_handler_apple/ios/Classes/strategies/ContactPermissionStrategy.m index 49b6dd3f..abae99fa 100644 --- a/permission_handler_apple/ios/Classes/strategies/ContactPermissionStrategy.m +++ b/permission_handler_apple/ios/Classes/strategies/ContactPermissionStrategy.m @@ -25,11 +25,7 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss return; } - if (@available(iOS 9.0, *)) { - [ContactPermissionStrategy requestPermissionsFromContactStore:completionHandler]; - } else { - [ContactPermissionStrategy requestPermissionsFromAddressBook:completionHandler]; - } + [ContactPermissionStrategy requestPermissionsFromContactStore:completionHandler]; } + (PermissionStatus)permissionStatus { @@ -48,7 +44,7 @@ + (PermissionStatus)permissionStatus { case CNAuthorizationStatusLimited: return PermissionStatusLimited; } - } else if (@available(iOS 9.0, *)) { + } else { CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; switch (status) { @@ -63,22 +59,6 @@ + (PermissionStatus)permissionStatus { default: return PermissionStatusGranted; } - } else { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); - - switch (status) { - case kABAuthorizationStatusNotDetermined: - return PermissionStatusDenied; - case kABAuthorizationStatusRestricted: - return PermissionStatusRestricted; - case kABAuthorizationStatusDenied: - return PermissionStatusPermanentlyDenied; - case kABAuthorizationStatusAuthorized: - return PermissionStatusGranted; -#pragma clang diagnostic pop - } } return PermissionStatusDenied; diff --git a/permission_handler_apple/ios/Classes/strategies/LocationPermissionStrategy.m b/permission_handler_apple/ios/Classes/strategies/LocationPermissionStrategy.m index a4f6b21f..76fbf632 100644 --- a/permission_handler_apple/ios/Classes/strategies/LocationPermissionStrategy.m +++ b/permission_handler_apple/ios/Classes/strategies/LocationPermissionStrategy.m @@ -174,37 +174,20 @@ + (PermissionStatus)permissionStatus:(PermissionGroup)permission { + (PermissionStatus)determinePermissionStatus:(PermissionGroup)permission authorizationStatus:(CLAuthorizationStatus)authorizationStatus { - if (@available(iOS 8.0, *)) { - if (permission == PermissionGroupLocationAlways) { - switch (authorizationStatus) { - case kCLAuthorizationStatusNotDetermined: - return PermissionStatusDenied; - case kCLAuthorizationStatusRestricted: - return PermissionStatusRestricted; - case kCLAuthorizationStatusAuthorizedWhenInUse: - case kCLAuthorizationStatusDenied: - return PermissionStatusPermanentlyDenied; - case kCLAuthorizationStatusAuthorizedAlways: - return PermissionStatusGranted; - } - } - + if (permission == PermissionGroupLocationAlways) { switch (authorizationStatus) { case kCLAuthorizationStatusNotDetermined: return PermissionStatusDenied; case kCLAuthorizationStatusRestricted: return PermissionStatusRestricted; + case kCLAuthorizationStatusAuthorizedWhenInUse: case kCLAuthorizationStatusDenied: return PermissionStatusPermanentlyDenied; - case kCLAuthorizationStatusAuthorizedWhenInUse: case kCLAuthorizationStatusAuthorizedAlways: return PermissionStatusGranted; } } -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - switch (authorizationStatus) { case kCLAuthorizationStatusNotDetermined: return PermissionStatusDenied; @@ -212,6 +195,15 @@ + (PermissionStatus)determinePermissionStatus:(PermissionGroup)permission author return PermissionStatusRestricted; case kCLAuthorizationStatusDenied: return PermissionStatusPermanentlyDenied; + case kCLAuthorizationStatusAuthorizedWhenInUse: + case kCLAuthorizationStatusAuthorizedAlways: + return PermissionStatusGranted; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + + switch (authorizationStatus) { case kCLAuthorizationStatusAuthorized: return PermissionStatusGranted; default: diff --git a/permission_handler_apple/ios/Classes/strategies/MediaLibraryPermissionStrategy.m b/permission_handler_apple/ios/Classes/strategies/MediaLibraryPermissionStrategy.m index da8b24ef..76cf3997 100644 --- a/permission_handler_apple/ios/Classes/strategies/MediaLibraryPermissionStrategy.m +++ b/permission_handler_apple/ios/Classes/strategies/MediaLibraryPermissionStrategy.m @@ -24,24 +24,15 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss return; } - if (@available(iOS 9.3, *)) { - [MPMediaLibrary requestAuthorization:^(MPMediaLibraryAuthorizationStatus status) { - completionHandler([MediaLibraryPermissionStrategy determinePermissionStatus:status]); - }]; - } else { - completionHandler(PermissionStatusPermanentlyDenied); - return; - } + [MPMediaLibrary requestAuthorization:^(MPMediaLibraryAuthorizationStatus status) { + completionHandler([MediaLibraryPermissionStrategy determinePermissionStatus:status]); + }]; } + (PermissionStatus)permissionStatus { - if (@available(iOS 9.3, *)) { - MPMediaLibraryAuthorizationStatus status = [MPMediaLibrary authorizationStatus]; + MPMediaLibraryAuthorizationStatus status = [MPMediaLibrary authorizationStatus]; - return [MediaLibraryPermissionStrategy determinePermissionStatus:status]; - } - - return PermissionStatusDenied; + return [MediaLibraryPermissionStrategy determinePermissionStatus:status]; } + (PermissionStatus)determinePermissionStatus:(MPMediaLibraryAuthorizationStatus)authorizationStatus API_AVAILABLE(ios(9.3)){ diff --git a/permission_handler_apple/ios/Classes/strategies/NotificationPermissionStrategy.m b/permission_handler_apple/ios/Classes/strategies/NotificationPermissionStrategy.m index 41d4bcdd..85ce12e4 100644 --- a/permission_handler_apple/ios/Classes/strategies/NotificationPermissionStrategy.m +++ b/permission_handler_apple/ios/Classes/strategies/NotificationPermissionStrategy.m @@ -31,59 +31,39 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss return; } dispatch_async(dispatch_get_main_queue(), ^{ - if(@available(iOS 10.0, *)) { - UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; - UNAuthorizationOptions authorizationOptions = 0; - authorizationOptions += UNAuthorizationOptionSound; - authorizationOptions += UNAuthorizationOptionAlert; - authorizationOptions += UNAuthorizationOptionBadge; - [center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) { - if (error != nil || !granted) { - completionHandler(PermissionStatusPermanentlyDenied); - return; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [[UIApplication sharedApplication] registerForRemoteNotifications]; - completionHandler(PermissionStatusGranted); - }); - }]; - - } else { - UIUserNotificationType notificationTypes = 0; - notificationTypes |= UIUserNotificationTypeSound; - notificationTypes |= UIUserNotificationTypeAlert; - notificationTypes |= UIUserNotificationTypeBadge; - UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil]; - [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + UNAuthorizationOptions authorizationOptions = 0; + authorizationOptions += UNAuthorizationOptionSound; + authorizationOptions += UNAuthorizationOptionAlert; + authorizationOptions += UNAuthorizationOptionBadge; + [center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) { + if (error != nil || !granted) { + completionHandler(PermissionStatusPermanentlyDenied); + return; + } - [[UIApplication sharedApplication] registerForRemoteNotifications]; - completionHandler(PermissionStatusGranted); - } + dispatch_async(dispatch_get_main_queue(), ^{ + [[UIApplication sharedApplication] registerForRemoteNotifications]; + completionHandler(PermissionStatusGranted); + }); + }]; }); } + (PermissionStatus)permissionStatus { __block PermissionStatus permissionStatus = PermissionStatusGranted; - if (@available(iOS 10 , *)) { - dispatch_semaphore_t sem = dispatch_semaphore_create(0); - [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { - if (@available(iOS 12 , *) && settings.authorizationStatus == UNAuthorizationStatusProvisional) { - permissionStatus = PermissionStatusProvisional; - } else if (settings.authorizationStatus == UNAuthorizationStatusDenied) { - permissionStatus = PermissionStatusPermanentlyDenied; - } else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) { - permissionStatus = PermissionStatusDenied; - } - dispatch_semaphore_signal(sem); - }]; - dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); - } else if (@available(iOS 8 , *)) { - UIUserNotificationSettings * setting = [[UIApplication sharedApplication] currentUserNotificationSettings]; - if (setting.types == UIUserNotificationTypeNone) permissionStatus = PermissionStatusDenied; - } else { + dispatch_semaphore_t sem = dispatch_semaphore_create(0); + [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { + if (@available(iOS 12 , *) && settings.authorizationStatus == UNAuthorizationStatusProvisional) { + permissionStatus = PermissionStatusProvisional; + } else if (settings.authorizationStatus == UNAuthorizationStatusDenied) { permissionStatus = PermissionStatusPermanentlyDenied; - } + } else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) { + permissionStatus = PermissionStatusDenied; + } + dispatch_semaphore_signal(sem); + }]; + dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); return permissionStatus; } diff --git a/permission_handler_apple/ios/Classes/strategies/SensorPermissionStrategy.m b/permission_handler_apple/ios/Classes/strategies/SensorPermissionStrategy.m index 6cdf6c77..21764fd7 100644 --- a/permission_handler_apple/ios/Classes/strategies/SensorPermissionStrategy.m +++ b/permission_handler_apple/ios/Classes/strategies/SensorPermissionStrategy.m @@ -13,14 +13,10 @@ - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { } - (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler { - if (@available(iOS 11.0, *)) { - completionHandler([CMMotionActivityManager isActivityAvailable] - ? ServiceStatusEnabled - : ServiceStatusDisabled - ); - } - - completionHandler(ServiceStatusDisabled); + completionHandler([CMMotionActivityManager isActivityAvailable] + ? ServiceStatusEnabled + : ServiceStatusDisabled + ); } - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler errorHandler:(PermissionErrorHandler)errorHandler { @@ -31,46 +27,38 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss return; } - if (@available(iOS 11.0, *)) { - CMMotionActivityManager *motionManager = [[CMMotionActivityManager alloc] init]; - - NSDate *today = [NSDate new]; - [motionManager queryActivityStartingFromDate:today toDate:today toQueue:[NSOperationQueue mainQueue] withHandler:^(NSArray *__nullable activities, NSError *__nullable error) { - PermissionStatus status = [SensorPermissionStrategy permissionStatus]; - completionHandler(status); - }]; - } else { - completionHandler(PermissionStatusDenied); - } + CMMotionActivityManager *motionManager = [[CMMotionActivityManager alloc] init]; + NSDate *today = [NSDate new]; + [motionManager queryActivityStartingFromDate:today toDate:today toQueue:[NSOperationQueue mainQueue] withHandler:^(NSArray *__nullable activities, NSError *__nullable error) { + PermissionStatus status = [SensorPermissionStrategy permissionStatus]; + completionHandler(status); + }]; + } + (PermissionStatus)permissionStatus { - if (@available(iOS 11.0, *)) { - CMAuthorizationStatus status = [CMMotionActivityManager authorizationStatus]; - PermissionStatus permissionStatus; - - switch (status) { - case CMAuthorizationStatusNotDetermined: - permissionStatus = PermissionStatusDenied; - break; - case CMAuthorizationStatusRestricted: - permissionStatus = PermissionStatusRestricted; - break; - case CMAuthorizationStatusDenied: - permissionStatus = PermissionStatusPermanentlyDenied; - break; - case CMAuthorizationStatusAuthorized: - permissionStatus = PermissionStatusGranted; - break; - default: - permissionStatus = PermissionStatusGranted; - } - - return permissionStatus; + CMAuthorizationStatus status = [CMMotionActivityManager authorizationStatus]; + PermissionStatus permissionStatus; + + switch (status) { + case CMAuthorizationStatusNotDetermined: + permissionStatus = PermissionStatusDenied; + break; + case CMAuthorizationStatusRestricted: + permissionStatus = PermissionStatusRestricted; + break; + case CMAuthorizationStatusDenied: + permissionStatus = PermissionStatusPermanentlyDenied; + break; + case CMAuthorizationStatusAuthorized: + permissionStatus = PermissionStatusGranted; + break; + default: + permissionStatus = PermissionStatusGranted; } - return PermissionStatusDenied; + return permissionStatus; } @end diff --git a/permission_handler_apple/ios/Classes/strategies/SpeechPermissionStrategy.m b/permission_handler_apple/ios/Classes/strategies/SpeechPermissionStrategy.m index cd178325..e3476538 100644 --- a/permission_handler_apple/ios/Classes/strategies/SpeechPermissionStrategy.m +++ b/permission_handler_apple/ios/Classes/strategies/SpeechPermissionStrategy.m @@ -24,23 +24,15 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss return; } - if (@available(iOS 10.0, *)) { - [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus authorizationStatus) { - completionHandler([SpeechPermissionStrategy determinePermissionStatus:authorizationStatus]); - }]; - } else { - completionHandler(PermissionStatusDenied); - } + [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus authorizationStatus) { + completionHandler([SpeechPermissionStrategy determinePermissionStatus:authorizationStatus]); + }]; } + (PermissionStatus)permissionStatus { - if (@available(iOS 10.0, *)) { - SFSpeechRecognizerAuthorizationStatus status = [SFSpeechRecognizer authorizationStatus]; - - return [SpeechPermissionStrategy determinePermissionStatus:status]; - } + SFSpeechRecognizerAuthorizationStatus status = [SFSpeechRecognizer authorizationStatus]; - return PermissionStatusDenied; + return [SpeechPermissionStrategy determinePermissionStatus:status]; } + (PermissionStatus)determinePermissionStatus:(SFSpeechRecognizerAuthorizationStatus)authorizationStatus API_AVAILABLE(ios(10.0)){ diff --git a/permission_handler_apple/pubspec.yaml b/permission_handler_apple/pubspec.yaml index c0a3fb49..4abd13fb 100644 --- a/permission_handler_apple/pubspec.yaml +++ b/permission_handler_apple/pubspec.yaml @@ -2,11 +2,11 @@ name: permission_handler_apple description: Permission plugin for Flutter. This plugin provides the iOS API to request and check permissions. repository: https://github.com/baseflow/flutter-permission-handler issue_tracker: https://github.com/Baseflow/flutter-permission-handler/issues -version: 9.4.6 +version: 9.4.7 environment: - sdk: ">=2.15.0 <4.0.0" - flutter: ">=2.8.0" + sdk: ">=2.18.0 <4.0.0" + flutter: ">=3.3.0" flutter: plugin: