Universal API for requesting permissions and reading their status — .authorized, .denied & .notDetermined. Each permission ships as a separate product, so the app compiles only the ones it actually uses.
In Xcode: File → Add Package Dependencies → paste URL:
https://github.com/sparrowcode/PermissionsKit
Then pick the products you need. Add only those — every permission API you link is visible to App Review, and unused ones invite questions about why the app needs them.
| Permission | Product | Key for Info.plist |
|---|---|---|
| Bluetooth | BluetoothPermission |
NSBluetoothAlwaysUsageDescription, NSBluetoothPeripheralUsageDescription |
| Calendar | CalendarPermission |
NSCalendarsUsageDescription, NSCalendarsFullAccessUsageDescription, NSCalendarsWriteOnlyAccessUsageDescription |
| Camera | CameraPermission |
NSCameraUsageDescription |
| Contacts | ContactsPermission |
NSContactsUsageDescription |
| FaceID | FaceIDPermission |
NSFaceIDUsageDescription |
| Health | HealthPermission |
NSHealthUpdateUsageDescription, NSHealthShareUsageDescription |
| Location | LocationPermission |
NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription |
| Media Library | MediaLibraryPermission |
NSAppleMusicUsageDescription |
| Microphone | MicrophonePermission |
NSMicrophoneUsageDescription |
| Motion | MotionPermission |
NSMotionUsageDescription |
| Notification | NotificationPermission |
— |
| Photo Library | PhotoLibraryPermission |
NSPhotoLibraryUsageDescription, NSPhotoLibraryAddUsageDescription |
| Reminders | RemindersPermission |
NSRemindersUsageDescription, NSRemindersFullAccessUsageDescription |
| Siri | SiriPermission |
NSSiriUsageDescription |
| Speech Recognizer | SpeechRecognizerPermission |
NSSpeechRecognitionUsageDescription |
| Tracking | TrackingPermission |
NSUserTrackingUsageDescription |
Request a permission:
import PermissionsKit import NotificationPermission Permission.notification([.alert, .badge, .sound]).request { // Called once the user answers the system dialog. }
Read its status:
import PermissionsKit import CameraPermission let authorized = Permission.camera.authorized
Warning
FaceID can't tell .authorized from .notDetermined — both come back as .notDetermined. Only .denied is reliable.
Apple requires a usage description for most permissions. Get the key for a permission:
let key = Permission.bluetooth.usageDescriptionKey
Note
Use the key itself, not the description text — Xcode won't build otherwise.
An xliff export creates the keys for you. Doing it by hand means adding an InfoPlist.strings file, selecting the languages in the inspector, and writing the keys there:
"NSCameraUsageDescription" = "Here description of usage camera";