From e2bf80f76c817c7732d65bbfe672d90b42fd4091 Mon Sep 17 00:00:00 2001 From: Alexander Puchta Date: Tue, 26 Sep 2023 22:13:41 +0200 Subject: [PATCH 1/2] Add writeOnly type for calendar --- .../CalendarPermission.swift | 32 +++++++++++++++---- Sources/PermissionsKit/Data/Text.swift | 3 +- Sources/PermissionsKit/Permission.swift | 10 +++--- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/Sources/CalendarPermission/CalendarPermission.swift b/Sources/CalendarPermission/CalendarPermission.swift index b1ed34a..e6e7056 100644 --- a/Sources/CalendarPermission/CalendarPermission.swift +++ b/Sources/CalendarPermission/CalendarPermission.swift @@ -28,15 +28,27 @@ import Foundation import EventKit public extension Permission { - + static var calendar: CalendarPermission { - return CalendarPermission() + return CalendarPermission(kind: .calendar) + } + + static var calendarWriteOnly: CalendarPermission { + return CalendarPermission(kind: .calendarWriteOnly) } } public class CalendarPermission: Permission { - open override var kind: Permission.Kind { .calendar } + private var _kind: Permission.Kind + + // MARK: - Init + + init(kind: Permission.Kind) { + self._kind = kind + } + + open override var kind: Permission.Kind { self._kind } open var usageDescriptionKey: String? { "NSCalendarsUsageDescription" } open var usageFullAccessDescriptionKey: String? { "NSCalendarsFullAccessUsageDescription" } open var usageWriteOnlyAccessDescriptionKey: String? { "NSCalendarsWriteOnlyAccessUsageDescription" } @@ -58,9 +70,17 @@ public class CalendarPermission: Permission { let eventStore = EKEventStore() if #available(iOS 17.0, *) { - eventStore.requestFullAccessToEvents { (accessGranted: Bool, error: Error?) in - DispatchQueue.main.async { - completion() + if self._kind == .calendarWriteOnly { + eventStore.requestWriteOnlyAccessToEvents { (accessGranted: Bool, error: Error?) in + DispatchQueue.main.async { + completion() + } + } + } else { + eventStore.requestFullAccessToEvents { (accessGranted: Bool, error: Error?) in + DispatchQueue.main.async { + completion() + } } } } else { diff --git a/Sources/PermissionsKit/Data/Text.swift b/Sources/PermissionsKit/Data/Text.swift index 9175c2e..7f960d3 100644 --- a/Sources/PermissionsKit/Data/Text.swift +++ b/Sources/PermissionsKit/Data/Text.swift @@ -31,7 +31,8 @@ enum Texts { return NSLocalizedString("permission photoLibrary name", bundle: bundle, comment: "") case .microphone: return NSLocalizedString("permission microphone name", bundle: bundle, comment: "") - case .calendar: + case .calendar, + .calendarWriteOnly: return NSLocalizedString("permission calendar name", bundle: bundle, comment: "") case .contacts: return NSLocalizedString("permission contacts name", bundle: bundle, comment: "") diff --git a/Sources/PermissionsKit/Permission.swift b/Sources/PermissionsKit/Permission.swift index 0a5dd8b..8f2f5c0 100644 --- a/Sources/PermissionsKit/Permission.swift +++ b/Sources/PermissionsKit/Permission.swift @@ -110,9 +110,10 @@ open class Permission: Equatable { case photoLibrary = 1 case microphone = 3 case calendar = 4 - case contacts = 5 - case reminders = 6 - case speech = 7 + case calendarWriteOnly = 5 + case contacts = 6 + case reminders = 7 + case speech = 8 case locationWhenInUse = 9 case locationAlways = 10 case motion = 11 @@ -131,7 +132,8 @@ open class Permission: Equatable { return "Photo Library" case .microphone: return "Microphone" - case .calendar: + case .calendar, + .calendarWriteOnly: return "Calendar" case .contacts: return "Contacts" From 1d52e607ab3b17dd39e5e7caf900f13df4b0ac24 Mon Sep 17 00:00:00 2001 From: Alexander Puchta Date: Wed, 27 Sep 2023 11:50:52 +0200 Subject: [PATCH 2/2] Update README.md and added available iOS 17 check for writeOnly permission --- README.md | 4 ++-- Sources/CalendarPermission/CalendarPermission.swift | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9f70d05..d8be282 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Universal API for request permission and get its statuses. Available `.authorize | Icon | Permission | Key for `Info.plist` | Get Status | Make Request | | :--: | :---------- | :------------------- | :--------: | :----------: | | | Bluetooth | NSBluetoothAlwaysUsageDescription, NSBluetoothPeripheralUsageDescription | ✅ | ✅ | -| | Calendar | NSCalendarsUsageDescription | ✅ | ✅ | +| | Calendar | NSCalendarsUsageDescription, NSCalendarsFullAccessUsageDescription, NSCalendarsWriteOnlyAccessUsageDescription | ✅ | ✅ | | | Camera | NSCameraUsageDescription | ✅ | ✅ | | | Contacts | NSContactsUsageDescription | ✅ | ✅ | | | FaceID | NSFaceIDUsageDescription | ✅ | ✅ | @@ -68,7 +68,7 @@ Universal API for request permission and get its statuses. Available `.authorize | | Motion | NSMotionUsageDescription | ✅ | ✅ | | | Notification | | ✅ | ✅ | | | Photo Library | NSPhotoLibraryUsageDescription, NSPhotoLibraryAddUsageDescription | ✅ | ✅ | -| | Reminders | NSRemindersUsageDescription | ✅ | ✅ | +| | Reminders | NSRemindersUsageDescription, NSRemindersFullAccessUsageDescription | ✅ | ✅ | | | Siri | NSSiriUsageDescription | ✅ | ✅ | | | Speech Recognizer | NSSpeechRecognitionUsageDescription | ✅ | ✅ | | | Tracking | NSUserTrackingUsageDescription | ✅ | ✅ | diff --git a/Sources/CalendarPermission/CalendarPermission.swift b/Sources/CalendarPermission/CalendarPermission.swift index e6e7056..0fe8705 100644 --- a/Sources/CalendarPermission/CalendarPermission.swift +++ b/Sources/CalendarPermission/CalendarPermission.swift @@ -32,6 +32,10 @@ public extension Permission { static var calendar: CalendarPermission { return CalendarPermission(kind: .calendar) } +} + +@available(iOS 17.0, *) +public extension Permission { static var calendarWriteOnly: CalendarPermission { return CalendarPermission(kind: .calendarWriteOnly)