Native permissions framework facilitating collecting users access approval to Camera, Photo Library, Microphone, Contacts, Location, Notifications and Tracking.
- Get permissions status and be notified by changes
- Ask for permissions with built-in pre-prompts
- Re-engage with built-in re-optins prompts
- iOS 15.0+
- Xcode 12.0+
- Swift 5.5+
dependencies: [
.package(url: "https://github.com/macistador/PermissionsKit", from: "0.0.4")
]- Contacts
- Address book
- Location (always / in use / once)
- Microphone
- Photos Library
- Push Notifications
- Tracking (ATT)
let permissionsService = PermissionsService()
// Ask for the permission
permissionsService.askTrackingPermission()
// Get the permission status
let trackingPermissionStatus = permissionsService.trackingPermissionStatus
// Know if the permission has been granted previously
let hasGrantedTrackingPermission = permissionsService.hasGrantedTrackingPermissionWith SwiftUI as a subview
var permissionsService = PermissionsService()
var trackingPermissionStatus: TrackingPermissionStatus?
var body: some View {
VStack {
if trackingPermissionStatus == .notDetermined {
PermissionPromptView(.preprompt(reoptinFallback: true), for: permission, title: "Hey there we need this permission!") { hasGrantedPermission in
if hasGrantedPermission {
trackingPermissionStatus = .granted
}
}
} else if trackingPermissionStatus == .denied {
PermissionPromptView(.reoptin, for: permission, title: "Hey there please change your mind!") { hasGrantedPermission in
if hasGrantedPermission {
trackingPermissionStatus = .granted
}
}
} else {
[...]
}
}
.task {
trackingPermissionStatus = permissionsService.trackingPermissionStatus
}
}With SwiftUI as a modal
var permissionsService = PermissionsService()
@State var showPrepromptForPermission: PermissionsKit.Permission?
@State var showReoptinForPermission: PermissionsKit.Permission?
var body: some View {
[...]
.task {
let trackingPermissionStatus = permissionsService.trackingPermissionStatus
if trackingPermissionStatus == .notDetermined {
showPrepromptForPermission = true
} else if trackingPermissionStatus == .denied {
showReoptinForPermission = true
}
}
.sheet(item: $showPrepromptForPermission) { permission in
PermissionPromptView(.preprompt(reoptinFallback: true), for: permission, title: "Hey there we need this permission!") { hasGrantedPermission in
showPrepromptForPermission = nil
if hasGrantedPermission {
[...]
}
}
}
.sheet(item: $showReoptinForPermission) { permission in
PermissionPromptView(.reoptin, for: permission, title: "Hey there please change your mind!") { hasGrantedPermission in
showReoptinForPermission = nil
if hasGrantedPermission {
[...]
}
}
}
}With UIKit
[TBD...]For more details you may take a look at the sample project.
Meanwhile this library works well alone, it is meant to be complementary to the following app bootstrap packages suite:
- CoreKit: Foundation app requirements: Routing, State management, logging...
- BackendKit: Handling remote requests, authentication for Firebase / Supabase
- DesignKit: DesignSystem
- VisualKit: UI components (SwiftUI Views, ViewModifiers)
- MediasKit: Loading, caching & displaying Images, Videos, Audios
- CameraKit: Capturing photos, videos and audio with effects
- PermissionsKit: User permissions handling
- SocialKit: Share, invite friends
- CartoKit: Locate, display maps
- AnalyzeKit: Analytics
- IntelligenceKit: Integrate embedded AI models
- AdsKit: Displaying ads
- PayKit: Handling paywalls & inApps
PermissionsKit is developed and maintained by Michel-André Chirita. You can follow me on Twitter at @Macistador for updates.
PermissionsKit is released under the MIT license. See LICENSE for details.
