Skip to content

Commit 6d8d961

Browse files
JeroenWeenermilosKarakasMilosKarakasTimHoogstrate
authored
Support iOS 17 calendar permissions (iOS) (#1220)
* - Split iOS calendar permission into write only and full access * - Fixes + adjust readme and bump versions * - Adjust Changelog.md * - Support iOS 17+ calendar permissions * - Update README.md to reflect iOS 17+ calendar permissions * - Fix PermissionManager.m issue * - Fix dependencies * #1108 Adjusted for calendarReadOnly and calendarFullAccess * #1108 Remove breaking change annotation from changelog * Switch calendarReadOnly to calendarWriteOnly * Update permission_handler/CHANGELOG.md Co-authored-by: TimHoogstrate <tim566@hotmail.com> * - Adjusted iOS EventPermissionStrategy.m after review * Added NSCalendarsFullAccessUsageDescription to apple example .plist and podfile * Fix deprecated calendar permission logic * Update EventPermissionStrategy.m * Separate iOS changes * Group calendar keys in `Info.plist` --------- Co-authored-by: milosKarakas <milos.karakas@codebluestudio.com> Co-authored-by: Miloš Karakaš <34490121+MilosKarakas@users.noreply.github.com> Co-authored-by: TimHoogstrate <tim566@hotmail.com>
1 parent 4e0d95f commit 6d8d961

File tree

10 files changed

+130
-52
lines changed

10 files changed

+130
-52
lines changed

permission_handler_apple/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 9.2.0
2+
* Adds the support for `Permission.calendarWriteOnly` and `Permission.calendarFullAccess` permissions which are introduced in iOS 17+.
3+
14
## 9.1.4
25

36
* Adds checking whether Bluetooth service is enabled through `Permission.bluetooth.serviceStatus`.

permission_handler_apple/example/ios/Podfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ post_install do |installer|
4747

4848
## dart: PermissionGroup.calendar
4949
'PERMISSION_EVENTS=1',
50+
51+
## dart: PermissionGroup.calendarFullAccess
52+
'PERMISSION_EVENTS_FULL_ACCESS=1',
5053

5154
## dart: PermissionGroup.reminders
5255
'PERMISSION_REMINDERS=1',

permission_handler_apple/example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@
155155
97C146E61CF9000F007C117D /* Project object */ = {
156156
isa = PBXProject;
157157
attributes = {
158-
LastUpgradeCheck = 1300;
158+
LastUpgradeCheck = 1430;
159159
ORGANIZATIONNAME = "";
160160
TargetAttributes = {
161161
97C146ED1CF9000F007C117D = {

permission_handler_apple/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1300"
3+
LastUpgradeVersion = "1430"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

permission_handler_apple/example/ios/Runner/Info.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
<!-- Permission options for the `calendar` group -->
6262
<key>NSCalendarsUsageDescription</key>
6363
<string>Calendars</string>
64+
<key>NSCalendarsFullAccessUsageDescription</key>
65+
<string>Calendar full access</string>
6466

6567
<!-- Permission options for the `camera` group -->
6668
<key>NSCameraUsageDescription</key>

permission_handler_apple/ios/Classes/PermissionHandlerEnums.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
// Created by Razvan Lung on 15/02/2019.
66
//
77

8-
// ios: PermissionGroupCalendar
9-
// Info.plist: NSCalendarsUsageDescription
8+
// ios: [PermissionGroupCalendar, PermissionGroupCalendarWriteOnly]
9+
// Info.plist: [NSCalendarsUsageDescription, NSCalendarWriteOnlyAccessUsageDescription]
1010
// dart: PermissionGroup.calendar
1111
#ifndef PERMISSION_EVENTS
1212
#define PERMISSION_EVENTS 0
1313
#endif
1414

1515
// ios: PermissionGroupReminders
16-
// Info.plist: NSRemindersUsageDescription
16+
// Info.plist: NSRemindersFullAccessUsageDescription
1717
// dart: PermissionGroup.reminders
1818
#ifndef PERMISSION_REMINDERS
1919
#define PERMISSION_REMINDERS 0
@@ -110,6 +110,13 @@
110110
#define PERMISSION_CRITICAL_ALERTS 0
111111
#endif
112112

113+
// ios: PermissionGroupCalendarFullAccess
114+
// Info.plist: [NSCalendarFullAccessUsageDescription]
115+
// dart: PermissionGroup.calendarFullAccess
116+
#ifndef PERMISSION_EVENTS_FULL_ACCESS
117+
#define PERMISSION_EVENTS_FULL_ACCESS 0
118+
#endif
119+
113120
typedef NS_ENUM(int, PermissionGroup) {
114121
PermissionGroupCalendar = 0,
115122
PermissionGroupCamera,
@@ -146,7 +153,9 @@ typedef NS_ENUM(int, PermissionGroup) {
146153
PermissiongroupVideos,
147154
PermissionGroupAudio,
148155
PermissionGroupScheduleExactAlarm,
149-
PermissionGroupSensorsAlways
156+
PermissionGroupSensorsAlways,
157+
PermissionGroupCalendarWriteOnly,
158+
PermissionGroupCalendarFullAccess
150159
};
151160

152161
typedef NS_ENUM(int, PermissionStatus) {

permission_handler_apple/ios/Classes/PermissionManager.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ + (void)openAppSettings:(FlutterResult)result {
9898
+ (id)createPermissionStrategy:(PermissionGroup)permission {
9999
switch (permission) {
100100
case PermissionGroupCalendar:
101+
case PermissionGroupCalendarWriteOnly:
102+
case PermissionGroupCalendarFullAccess:
101103
return [EventPermissionStrategy new];
102104
case PermissionGroupCamera:
103105
return [AudioVideoPermissionStrategy new];

permission_handler_apple/ios/Classes/strategies/EventPermissionStrategy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#import <Foundation/Foundation.h>
77
#import "PermissionStrategy.h"
88

9-
#if PERMISSION_EVENTS | PERMISSION_REMINDERS
9+
#if PERMISSION_EVENTS | PERMISSION_EVENTS_FULL_ACCESS | PERMISSION_REMINDERS
1010

1111
#import <EventKit/EventKit.h>
1212

permission_handler_apple/ios/Classes/strategies/EventPermissionStrategy.m

Lines changed: 102 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,12 @@
55

66
#import "EventPermissionStrategy.h"
77

8-
#if PERMISSION_EVENTS | PERMISSION_REMINDERS
8+
#if PERMISSION_EVENTS | PERMISSION_EVENTS_FULL_ACCESS | PERMISSION_REMINDERS
99

1010
@implementation EventPermissionStrategy
1111

1212
- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
13-
if (permission == PermissionGroupCalendar) {
14-
#if PERMISSION_EVENTS
15-
return [EventPermissionStrategy permissionStatus:EKEntityTypeEvent];
16-
#endif
17-
} else if (permission == PermissionGroupReminders) {
18-
#if PERMISSION_REMINDERS
19-
return [EventPermissionStrategy permissionStatus:EKEntityTypeReminder];
20-
#endif
21-
}
22-
23-
return PermissionStatusDenied;
13+
return [EventPermissionStrategy permissionStatus:permission];
2414
}
2515

2616
- (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler {
@@ -34,55 +24,124 @@ - (void)requestPermission:(PermissionGroup)permission completionHandler:(Permiss
3424
completionHandler(permissionStatus);
3525
return;
3626
}
37-
38-
EKEntityType entityType;
39-
40-
if (permission == PermissionGroupCalendar) {
41-
#if PERMISSION_EVENTS
42-
entityType = EKEntityTypeEvent;
43-
#else
27+
28+
if (permission == PermissionGroupCalendar || permission == PermissionGroupCalendarFullAccess) {
29+
if (@available(iOS 17.0, *)) {
30+
#if !PERMISSION_EVENTS_FULL_ACCESS
31+
completionHandler(PermissionStatusDenied);
32+
return;
33+
#endif
34+
} else {
35+
#if !PERMISSION_EVENTS
36+
completionHandler(PermissionStatusDenied);
37+
return;
38+
#endif
39+
}
40+
} else if (permission == PermissionGroupCalendarWriteOnly) {
41+
#if !PERMISSION_EVENTS && !PERMISSION_EVENTS_FULL_ACCESS
4442
completionHandler(PermissionStatusDenied);
4543
return;
4644
#endif
4745
} else if (permission == PermissionGroupReminders) {
48-
#if PERMISSION_REMINDERS
49-
entityType = EKEntityTypeReminder;
50-
#else
46+
#if !PERMISSION_REMINDERS
5147
completionHandler(PermissionStatusDenied);
5248
return;
5349
#endif
54-
} else {
55-
completionHandler(PermissionStatusPermanentlyDenied);
56-
return;
5750
}
58-
51+
5952
EKEventStore *eventStore = [[EKEventStore alloc] init];
60-
[eventStore requestAccessToEntityType:entityType completion:^(BOOL granted, NSError *error) {
61-
if (granted) {
62-
completionHandler(PermissionStatusGranted);
63-
} else {
64-
completionHandler(PermissionStatusPermanentlyDenied);
53+
54+
if (@available(iOS 17.0, *)) {
55+
if (permission == PermissionGroupCalendar || permission == PermissionGroupCalendarFullAccess) {
56+
[eventStore requestFullAccessToEventsWithCompletion:^(BOOL granted, NSError *error) {
57+
if (granted) {
58+
completionHandler(PermissionStatusGranted);
59+
} else {
60+
completionHandler(PermissionStatusPermanentlyDenied);
61+
}
62+
}];
63+
} else if (permission == PermissionGroupCalendarWriteOnly) {
64+
[eventStore requestWriteOnlyAccessToEventsWithCompletion:^(BOOL granted, NSError *error) {
65+
if (granted) {
66+
completionHandler(PermissionStatusGranted);
67+
} else {
68+
completionHandler(PermissionStatusPermanentlyDenied);
69+
}
70+
}];
71+
} else if (permission == PermissionGroupReminders) {
72+
[eventStore requestFullAccessToRemindersWithCompletion:^(BOOL granted, NSError *error) {
73+
if (granted) {
74+
completionHandler(PermissionStatusGranted);
75+
} else {
76+
completionHandler(PermissionStatusPermanentlyDenied);
77+
}
78+
}];
6579
}
66-
}];
80+
} else {
81+
EKEntityType entityType = [EventPermissionStrategy getEntityType:permission];
82+
83+
[eventStore requestAccessToEntityType:entityType completion:^(BOOL granted, NSError *error) {
84+
if (granted) {
85+
completionHandler(PermissionStatusGranted);
86+
} else {
87+
completionHandler(PermissionStatusPermanentlyDenied);
88+
}
89+
}];
90+
}
91+
6792
}
6893

69-
+ (PermissionStatus)permissionStatus:(EKEntityType)entityType {
94+
+ (PermissionStatus)permissionStatus:(PermissionGroup)permission {
95+
EKEntityType entityType = [EventPermissionStrategy getEntityType:permission];
7096
EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:entityType];
71-
72-
switch (status) {
73-
case EKAuthorizationStatusNotDetermined:
74-
return PermissionStatusDenied;
75-
case EKAuthorizationStatusRestricted:
76-
return PermissionStatusRestricted;
77-
case EKAuthorizationStatusDenied:
78-
return PermissionStatusPermanentlyDenied;
79-
case EKAuthorizationStatusAuthorized:
80-
return PermissionStatusGranted;
97+
98+
if (@available(iOS 17.0, *)) {
99+
switch (status) {
100+
case EKAuthorizationStatusNotDetermined:
101+
return PermissionStatusDenied;
102+
case EKAuthorizationStatusRestricted:
103+
return PermissionStatusRestricted;
104+
case EKAuthorizationStatusDenied:
105+
return PermissionStatusPermanentlyDenied;
106+
case EKAuthorizationStatusFullAccess:
107+
return PermissionStatusGranted;
108+
case EKAuthorizationStatusWriteOnly:
109+
if (permission == PermissionGroupCalendarWriteOnly) {
110+
return PermissionStatusGranted;
111+
}
112+
return PermissionStatusDenied;
113+
}
114+
} else {
115+
switch (status) {
116+
case EKAuthorizationStatusNotDetermined:
117+
return PermissionStatusDenied;
118+
case EKAuthorizationStatusRestricted:
119+
return PermissionStatusRestricted;
120+
case EKAuthorizationStatusDenied:
121+
return PermissionStatusPermanentlyDenied;
122+
case EKAuthorizationStatusAuthorized:
123+
return PermissionStatusGranted;
124+
case EKAuthorizationStatusWriteOnly:
125+
//not available on iOS 16 and below
126+
break;
127+
}
81128
}
82129

130+
131+
83132
return PermissionStatusDenied;
84133
}
85134

135+
+ (EKEntityType)getEntityType:(PermissionGroup)permission {
136+
if (permission == PermissionGroupCalendar || permission == PermissionGroupCalendarFullAccess || permission == PermissionGroupCalendarWriteOnly) {
137+
return EKEntityTypeEvent;
138+
} else if (permission == PermissionGroupReminders) {
139+
return EKEntityTypeReminder;
140+
}
141+
142+
return nil;
143+
}
144+
86145
@end
87146

88147
#else

permission_handler_apple/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: permission_handler_apple
22
description: Permission plugin for Flutter. This plugin provides the iOS API to request and check permissions.
33
repository: https://github.com/baseflow/flutter-permission-handler
44
issue_tracker: https://github.com/Baseflow/flutter-permission-handler/issues
5-
version: 9.1.4
5+
version: 9.2.0
66

77
environment:
88
sdk: ">=2.15.0 <4.0.0"
@@ -18,7 +18,7 @@ flutter:
1818
dependencies:
1919
flutter:
2020
sdk: flutter
21-
permission_handler_platform_interface: ^3.11.2
21+
permission_handler_platform_interface: ^4.0.0
2222

2323
dev_dependencies:
2424
flutter_lints: ^1.0.4

0 commit comments

Comments
 (0)