Skip to content

Commit de516a4

Browse files
Drop support for iOS < 11 (#1461)
* Update package metadata * Remove all @available checks for iOS 11 and earlier * Compilation fix * Formatting fix * Restore unhandled case flow * Remove deprecated state path * Remove duplicate completionHandler call
1 parent c618e9b commit de516a4

11 files changed

+99
-194
lines changed

permission_handler_apple/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 9.4.7
2+
3+
* Increases minimum supported Flutter version to 3.3.0, and removes code only
4+
required for iOS versions prior to iOS 11.
5+
16
## 9.4.6
27

38
* Adds the ability to handle `CNAuthorizationStatusLimited` introduced in ios18

permission_handler_apple/ios/Classes/PermissionManager.m

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,21 +80,11 @@ - (void)requestPermissions:(NSArray *)permissions completion:(PermissionRequestC
8080
}
8181

8282
+ (void)openAppSettings:(FlutterResult)result {
83-
if (@available(iOS 10, *)) {
84-
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]
85-
options:[[NSDictionary alloc] init]
86-
completionHandler:^(BOOL success) {
87-
result([[NSNumber alloc] initWithBool:success]);
88-
}];
89-
} else if (@available(iOS 8.0, *)) {
90-
#pragma clang diagnostic push
91-
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
92-
BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
93-
result([[NSNumber alloc] initWithBool:success]);
94-
#pragma clang diagnostic pop
95-
} else {
96-
result(@false);
97-
}
83+
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]
84+
options:[[NSDictionary alloc] init]
85+
completionHandler:^(BOOL success) {
86+
result([[NSNumber alloc] initWithBool:success]);
87+
}];
9888
}
9989

10090
+ (id)createPermissionStrategy:(PermissionGroup)permission {

permission_handler_apple/ios/Classes/strategies/AssistantPermissionStrategy.m

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,8 @@
1212
@implementation AssistantPermissionStrategy
1313

1414
- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
15-
if (@available(iOS 10, *)) {
16-
INSiriAuthorizationStatus assistantPermission = [INPreferences siriAuthorizationStatus];
17-
return [AssistantPermissionStrategy parsePermission:assistantPermission];
18-
}
19-
20-
return PermissionStatusGranted;
15+
INSiriAuthorizationStatus assistantPermission = [INPreferences siriAuthorizationStatus];
16+
return [AssistantPermissionStrategy parsePermission:assistantPermission];
2117
}
2218

2319
- (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler {
@@ -31,14 +27,10 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss
3127
return;
3228
}
3329

34-
if (@available(iOS 10, *)){
35-
[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
36-
PermissionStatus permissionStatus = [AssistantPermissionStrategy parsePermission:status];
37-
completionHandler(permissionStatus);
38-
}];
39-
} else {
40-
completionHandler(PermissionStatusGranted);
41-
}
30+
[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
31+
PermissionStatus permissionStatus = [AssistantPermissionStrategy parsePermission:status];
32+
completionHandler(permissionStatus);
33+
}];
4234
}
4335

4436
+ (PermissionStatus)parsePermission:(INSiriAuthorizationStatus)assistantPermission API_AVAILABLE(ios(10)){

permission_handler_apple/ios/Classes/strategies/BluetoothPermissionStrategy.m

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,7 @@ - (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(Servic
6161
}
6262

6363
- (void)handleCheckServiceStatusCallback:(CBCentralManager *)centralManager {
64-
if (@available(iOS 10, *)) {
65-
ServiceStatus serviceStatus = [centralManager state] == CBManagerStatePoweredOn ? ServiceStatusEnabled : ServiceStatusDisabled;
66-
_serviceStatusHandler(serviceStatus);
67-
}
68-
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
69-
ServiceStatus serviceStatus = [centralManager state] == CBCentralManagerStatePoweredOn ? ServiceStatusEnabled : ServiceStatusDisabled;
64+
ServiceStatus serviceStatus = [centralManager state] == CBManagerStatePoweredOn ? ServiceStatusEnabled : ServiceStatusDisabled;
7065
_serviceStatusHandler(serviceStatus);
7166
}
7267

permission_handler_apple/ios/Classes/strategies/ContactPermissionStrategy.m

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss
2525
return;
2626
}
2727

28-
if (@available(iOS 9.0, *)) {
29-
[ContactPermissionStrategy requestPermissionsFromContactStore:completionHandler];
30-
} else {
31-
[ContactPermissionStrategy requestPermissionsFromAddressBook:completionHandler];
32-
}
28+
[ContactPermissionStrategy requestPermissionsFromContactStore:completionHandler];
3329
}
3430

3531
+ (PermissionStatus)permissionStatus {
@@ -48,7 +44,7 @@ + (PermissionStatus)permissionStatus {
4844
case CNAuthorizationStatusLimited:
4945
return PermissionStatusLimited;
5046
}
51-
} else if (@available(iOS 9.0, *)) {
47+
} else {
5248
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
5349

5450
switch (status) {
@@ -63,22 +59,6 @@ + (PermissionStatus)permissionStatus {
6359
default:
6460
return PermissionStatusGranted;
6561
}
66-
} else {
67-
#pragma clang diagnostic push
68-
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
69-
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
70-
71-
switch (status) {
72-
case kABAuthorizationStatusNotDetermined:
73-
return PermissionStatusDenied;
74-
case kABAuthorizationStatusRestricted:
75-
return PermissionStatusRestricted;
76-
case kABAuthorizationStatusDenied:
77-
return PermissionStatusPermanentlyDenied;
78-
case kABAuthorizationStatusAuthorized:
79-
return PermissionStatusGranted;
80-
#pragma clang diagnostic pop
81-
}
8262
}
8363

8464
return PermissionStatusDenied;

permission_handler_apple/ios/Classes/strategies/LocationPermissionStrategy.m

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -174,44 +174,36 @@ + (PermissionStatus)permissionStatus:(PermissionGroup)permission {
174174

175175

176176
+ (PermissionStatus)determinePermissionStatus:(PermissionGroup)permission authorizationStatus:(CLAuthorizationStatus)authorizationStatus {
177-
if (@available(iOS 8.0, *)) {
178-
if (permission == PermissionGroupLocationAlways) {
179-
switch (authorizationStatus) {
180-
case kCLAuthorizationStatusNotDetermined:
181-
return PermissionStatusDenied;
182-
case kCLAuthorizationStatusRestricted:
183-
return PermissionStatusRestricted;
184-
case kCLAuthorizationStatusAuthorizedWhenInUse:
185-
case kCLAuthorizationStatusDenied:
186-
return PermissionStatusPermanentlyDenied;
187-
case kCLAuthorizationStatusAuthorizedAlways:
188-
return PermissionStatusGranted;
189-
}
190-
}
191-
177+
if (permission == PermissionGroupLocationAlways) {
192178
switch (authorizationStatus) {
193179
case kCLAuthorizationStatusNotDetermined:
194180
return PermissionStatusDenied;
195181
case kCLAuthorizationStatusRestricted:
196182
return PermissionStatusRestricted;
183+
case kCLAuthorizationStatusAuthorizedWhenInUse:
197184
case kCLAuthorizationStatusDenied:
198185
return PermissionStatusPermanentlyDenied;
199-
case kCLAuthorizationStatusAuthorizedWhenInUse:
200186
case kCLAuthorizationStatusAuthorizedAlways:
201187
return PermissionStatusGranted;
202188
}
203189
}
204190

205-
#pragma clang diagnostic push
206-
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
207-
208191
switch (authorizationStatus) {
209192
case kCLAuthorizationStatusNotDetermined:
210193
return PermissionStatusDenied;
211194
case kCLAuthorizationStatusRestricted:
212195
return PermissionStatusRestricted;
213196
case kCLAuthorizationStatusDenied:
214197
return PermissionStatusPermanentlyDenied;
198+
case kCLAuthorizationStatusAuthorizedWhenInUse:
199+
case kCLAuthorizationStatusAuthorizedAlways:
200+
return PermissionStatusGranted;
201+
}
202+
203+
#pragma clang diagnostic push
204+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
205+
206+
switch (authorizationStatus) {
215207
case kCLAuthorizationStatusAuthorized:
216208
return PermissionStatusGranted;
217209
default:

permission_handler_apple/ios/Classes/strategies/MediaLibraryPermissionStrategy.m

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,15 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss
2424
return;
2525
}
2626

27-
if (@available(iOS 9.3, *)) {
28-
[MPMediaLibrary requestAuthorization:^(MPMediaLibraryAuthorizationStatus status) {
29-
completionHandler([MediaLibraryPermissionStrategy determinePermissionStatus:status]);
30-
}];
31-
} else {
32-
completionHandler(PermissionStatusPermanentlyDenied);
33-
return;
34-
}
27+
[MPMediaLibrary requestAuthorization:^(MPMediaLibraryAuthorizationStatus status) {
28+
completionHandler([MediaLibraryPermissionStrategy determinePermissionStatus:status]);
29+
}];
3530
}
3631

3732
+ (PermissionStatus)permissionStatus {
38-
if (@available(iOS 9.3, *)) {
39-
MPMediaLibraryAuthorizationStatus status = [MPMediaLibrary authorizationStatus];
33+
MPMediaLibraryAuthorizationStatus status = [MPMediaLibrary authorizationStatus];
4034

41-
return [MediaLibraryPermissionStrategy determinePermissionStatus:status];
42-
}
43-
44-
return PermissionStatusDenied;
35+
return [MediaLibraryPermissionStrategy determinePermissionStatus:status];
4536
}
4637

4738
+ (PermissionStatus)determinePermissionStatus:(MPMediaLibraryAuthorizationStatus)authorizationStatus API_AVAILABLE(ios(9.3)){

permission_handler_apple/ios/Classes/strategies/NotificationPermissionStrategy.m

Lines changed: 26 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -31,59 +31,39 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss
3131
return;
3232
}
3333
dispatch_async(dispatch_get_main_queue(), ^{
34-
if(@available(iOS 10.0, *)) {
35-
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
36-
UNAuthorizationOptions authorizationOptions = 0;
37-
authorizationOptions += UNAuthorizationOptionSound;
38-
authorizationOptions += UNAuthorizationOptionAlert;
39-
authorizationOptions += UNAuthorizationOptionBadge;
40-
[center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) {
41-
if (error != nil || !granted) {
42-
completionHandler(PermissionStatusPermanentlyDenied);
43-
return;
44-
}
45-
46-
dispatch_async(dispatch_get_main_queue(), ^{
47-
[[UIApplication sharedApplication] registerForRemoteNotifications];
48-
completionHandler(PermissionStatusGranted);
49-
});
50-
}];
51-
52-
} else {
53-
UIUserNotificationType notificationTypes = 0;
54-
notificationTypes |= UIUserNotificationTypeSound;
55-
notificationTypes |= UIUserNotificationTypeAlert;
56-
notificationTypes |= UIUserNotificationTypeBadge;
57-
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil];
58-
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
34+
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
35+
UNAuthorizationOptions authorizationOptions = 0;
36+
authorizationOptions += UNAuthorizationOptionSound;
37+
authorizationOptions += UNAuthorizationOptionAlert;
38+
authorizationOptions += UNAuthorizationOptionBadge;
39+
[center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) {
40+
if (error != nil || !granted) {
41+
completionHandler(PermissionStatusPermanentlyDenied);
42+
return;
43+
}
5944

60-
[[UIApplication sharedApplication] registerForRemoteNotifications];
61-
completionHandler(PermissionStatusGranted);
62-
}
45+
dispatch_async(dispatch_get_main_queue(), ^{
46+
[[UIApplication sharedApplication] registerForRemoteNotifications];
47+
completionHandler(PermissionStatusGranted);
48+
});
49+
}];
6350
});
6451
}
6552

6653
+ (PermissionStatus)permissionStatus {
6754
__block PermissionStatus permissionStatus = PermissionStatusGranted;
68-
if (@available(iOS 10 , *)) {
69-
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
70-
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
71-
if (@available(iOS 12 , *) && settings.authorizationStatus == UNAuthorizationStatusProvisional) {
72-
permissionStatus = PermissionStatusProvisional;
73-
} else if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
74-
permissionStatus = PermissionStatusPermanentlyDenied;
75-
} else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
76-
permissionStatus = PermissionStatusDenied;
77-
}
78-
dispatch_semaphore_signal(sem);
79-
}];
80-
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
81-
} else if (@available(iOS 8 , *)) {
82-
UIUserNotificationSettings * setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
83-
if (setting.types == UIUserNotificationTypeNone) permissionStatus = PermissionStatusDenied;
84-
} else {
55+
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
56+
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
57+
if (@available(iOS 12 , *) && settings.authorizationStatus == UNAuthorizationStatusProvisional) {
58+
permissionStatus = PermissionStatusProvisional;
59+
} else if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
8560
permissionStatus = PermissionStatusPermanentlyDenied;
86-
}
61+
} else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
62+
permissionStatus = PermissionStatusDenied;
63+
}
64+
dispatch_semaphore_signal(sem);
65+
}];
66+
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
8767
return permissionStatus;
8868
}
8969

permission_handler_apple/ios/Classes/strategies/SensorPermissionStrategy.m

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,10 @@ - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
1313
}
1414

1515
- (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler {
16-
if (@available(iOS 11.0, *)) {
17-
completionHandler([CMMotionActivityManager isActivityAvailable]
18-
? ServiceStatusEnabled
19-
: ServiceStatusDisabled
20-
);
21-
}
22-
23-
completionHandler(ServiceStatusDisabled);
16+
completionHandler([CMMotionActivityManager isActivityAvailable]
17+
? ServiceStatusEnabled
18+
: ServiceStatusDisabled
19+
);
2420
}
2521

2622
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler errorHandler:(PermissionErrorHandler)errorHandler {
@@ -31,46 +27,38 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss
3127
return;
3228
}
3329

34-
if (@available(iOS 11.0, *)) {
35-
CMMotionActivityManager *motionManager = [[CMMotionActivityManager alloc] init];
36-
37-
NSDate *today = [NSDate new];
38-
[motionManager queryActivityStartingFromDate:today toDate:today toQueue:[NSOperationQueue mainQueue] withHandler:^(NSArray<CMMotionActivity *> *__nullable activities, NSError *__nullable error) {
39-
PermissionStatus status = [SensorPermissionStrategy permissionStatus];
40-
completionHandler(status);
41-
}];
42-
} else {
43-
completionHandler(PermissionStatusDenied);
44-
}
30+
CMMotionActivityManager *motionManager = [[CMMotionActivityManager alloc] init];
4531

32+
NSDate *today = [NSDate new];
33+
[motionManager queryActivityStartingFromDate:today toDate:today toQueue:[NSOperationQueue mainQueue] withHandler:^(NSArray<CMMotionActivity *> *__nullable activities, NSError *__nullable error) {
34+
PermissionStatus status = [SensorPermissionStrategy permissionStatus];
35+
completionHandler(status);
36+
}];
37+
4638
}
4739

4840
+ (PermissionStatus)permissionStatus {
49-
if (@available(iOS 11.0, *)) {
50-
CMAuthorizationStatus status = [CMMotionActivityManager authorizationStatus];
51-
PermissionStatus permissionStatus;
52-
53-
switch (status) {
54-
case CMAuthorizationStatusNotDetermined:
55-
permissionStatus = PermissionStatusDenied;
56-
break;
57-
case CMAuthorizationStatusRestricted:
58-
permissionStatus = PermissionStatusRestricted;
59-
break;
60-
case CMAuthorizationStatusDenied:
61-
permissionStatus = PermissionStatusPermanentlyDenied;
62-
break;
63-
case CMAuthorizationStatusAuthorized:
64-
permissionStatus = PermissionStatusGranted;
65-
break;
66-
default:
67-
permissionStatus = PermissionStatusGranted;
68-
}
69-
70-
return permissionStatus;
41+
CMAuthorizationStatus status = [CMMotionActivityManager authorizationStatus];
42+
PermissionStatus permissionStatus;
43+
44+
switch (status) {
45+
case CMAuthorizationStatusNotDetermined:
46+
permissionStatus = PermissionStatusDenied;
47+
break;
48+
case CMAuthorizationStatusRestricted:
49+
permissionStatus = PermissionStatusRestricted;
50+
break;
51+
case CMAuthorizationStatusDenied:
52+
permissionStatus = PermissionStatusPermanentlyDenied;
53+
break;
54+
case CMAuthorizationStatusAuthorized:
55+
permissionStatus = PermissionStatusGranted;
56+
break;
57+
default:
58+
permissionStatus = PermissionStatusGranted;
7159
}
7260

73-
return PermissionStatusDenied;
61+
return permissionStatus;
7462
}
7563

7664
@end

0 commit comments

Comments
 (0)