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.authorizedWarning
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.usageDescriptionKeyNote
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";