Awesome Open Source
Awesome Open Source



SPPermissions is an API to ask for user permissions using Swift. The API provides for three UI options: list, dialog & native.

The UI/UX is in an Apple style. Support iPad, dark mode & tvOS.

Also you can check the state permissions using the API.

If you like the project, don't forget to put star ★ and follow me on GitHub:


New 6.x version

No any changes in UI, but big things here. If you got any bug, please, create issue. I will fix it super fast.

Support Swift Package Manager 🔥

Now it work, you can simple remove cocoapods dependec and move to SPM. More details about instalation process read in Instalation section. Cocoapods saved and continue support.

Added .notDetermined

You can check if permission request before.

New Struct

Changed delegate and data source. If you use delegates or datasources before, please, check again. Some methods renamed. Permissions now its not enum. It happen becouse no way support moduls and shared schemes.

Localisation & RTL

All defaults text ready to localiaztion. I going to add more in this week, you can support me and add your localisation. Check Sources/Recourses folder.


Ready for use on iOS 11+. Support iOS, tvOS and SwiftUI. Works with Swift 5+.

Swift Package Manager

The Swift Package Manager is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies.

To integrate SPPermissions into your Xcode project using Xcode 12, specify it in File > Swift Packages > Add Package Dependency...:

Next choose permissions, which you need. Don't add all permissions, becouse apple will reject you app.


CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate SPPermissions into your Xcode project using CocoaPods, specify it in your Podfile:

pod 'SPPermissions/Notification'

Due to Apple's new policy regarding permission access you need to specifically define what kind of permissions you want to access using subspecs. For example if you want to access Camera, Location & Microphone you define the following:

pod 'SPPermissions/Camera'
pod 'SPPermissions/LocationAlways'
pod 'SPPermissions/Microphone'
Available subspecs

pod 'SPPermissions/Camera'
pod 'SPPermissions/Contacts'
pod 'SPPermissions/Calendar'
pod 'SPPermissions/PhotoLibrary'
pod 'SPPermissions/Notification'
pod 'SPPermissions/Microphone'
pod 'SPPermissions/Reminders'
pod 'SPPermissions/SpeechRecognizer'
pod 'SPPermissions/LocationWhenInUse'
pod 'SPPermissions/LocationAlways'
pod 'SPPermissions/Motion'
pod 'SPPermissions/MediaLibrary'
pod 'SPPermissions/Bluetooth'
pod 'SPPermissions/Tracking'


If you prefer not to use any of dependency managers, you can integrate SPPermissions into your project manually. Copy code and add compile flags from file.


If you install via Swift Package Manager, you shoud import each module:

import SPPermissions
import SPPermissionsCamera
import SPPermissionsPhotoLibrary

If you install via CocoaPods, you shoud simple import one class:

import SPPermissions

Its required becouse library split to modules. After import you see available permission by typing for example.

Easy Start

// 1. Choose permissions, which you need:
let permissions: [SPPermissions.Permission] = [.camera, .notification]

// 2. Choose present style:
// 2a. List Style
let controller = SPPermissions.list(permissions)
controller.present(on: self)

// 2b. Dialog Style
let controller = SPPermissions.dialog(permissions)
controller.present(on: self)

// 2c. Dialog Style
let controller = SPPermissions.native(permissions)
controller.present(on: self)

For more details check usage section.


Now available 3 present styles: Dialog, List and Native. Each interface has delegates and a data source. If you want see an example app, open SPPermissions.xcodeproj.


This is a modal alert, which was used in the previous version (<5.x). I recommend to use of this alert style when your requested permissions are less than three. Usage example:

let controller = SPPermissions.dialog([.camera, .photoLibrary])

// Ovveride texts in controller
controller.titleText = "Title Text"
controller.headerText = "Header Text"
controller.footerText = "Footer Text"

// Set `DataSource` or `Delegate` if need. 
// By default using project texts and icons.
controller.dataSource = self
controller.delegate = self

// Always use this method for present
controller.present(on: self)


Native UITableViewController with support for the iPad. Use it with more than two permissions. An example of how it is used:

let controller = SPPermissions.list([.calendar, .camera, .contacts])

// Ovveride texts in controller
controller.titleText = "Title Text"
controller.headerText = "Header Text"
controller.footerText = "Footer Text"

// Set `DataSource` or `Delegate` if need. 
// By default using project texts and icons.
controller.dataSource = self
controller.delegate = self

// Always use this method for present
controller.present(on: self)


Request permissions with native alerts. You can request many permissions at once:

let controller = SPPermissions.native([.calendar, .camera, .contacts])

// Set `Delegate` if need. 
controller.delegate = self

// Always use this method for request. 
controller.present(on: self)


To check the state of any permission, call SPPermissions.Permission:

let state = SPPermissions.Permission.calendar.authorized

Also available denied & notDetermined.


For data source using protocol SPPermissionsDataSource. You can customise cell for permission or provide denied alert texts.

extension Controller: SPPermissionsDataSource {
    func configure(_ cell: SPPermissionsTableViewCell, for permission: SPPermissions.Permission) -> SPPermissionsTableViewCell {
        // Here you can customise cell, like texts or colors.
        return cell

Denied alert

If permission denied, you can provide alert to user for propose open settings. Here you can customise text of it alert:

let texts = SPPermissionDeniedAlertTexts()
texts.titleText = "Permission denied"
texts.descriptionText = "Please, go to Settings and allow permission."
texts.buttonText = "Settings"
texts.cancelText = "Cancel"

Next implement method and return:

func deniedAlertTexts(for permission: SPPermissions.Permission) -> SPPermissionDeniedAlertTexts? {
    // Custom texts:
    return texts
    // or default texts:
    // return .default


For get events about hide, allowed or denied, set delegate of protocol SPPermissionsDelegate:

extension Controller: SPPermissionsDelegate {
    func didHidePermissions(_ permissions: [SPPermissions.Permission]) {}
    func didAllowPermission(_ permission: SPPermissions.Permission) {}
    func didDeniedPermission(_ permission: SPPermissions.Permission) {}


App has ready-use localisation stirngs for en, ar & ru. If you want add more, please, create folder language-id.lproj and make pull request.

If you want use your custom strings, check DataSource section.

Keys in Info.plist

You need to add some keys to the Info.plist file with descriptions. List of keys:

  • NSCameraUsageDescription
  • NSContactsUsageDescription
  • NSCalendarsUsageDescription
  • NSMicrophoneUsageDescription
  • NSAppleMusicUsageDescription
  • NSSpeechRecognitionUsageDescription
  • NSMotionUsageDescription
  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysAndWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription (iOS 10 and earlier)
  • NSBluetoothAlwaysUsageDescription
  • NSBluetoothPeripheralUsageDescription (iOS 12 and earlier)
  • NSUserTrackingUsageDescription

Do not use the description as the name of the key.

If you use xliff localization export, keys will be create automatically. If you prefer do the localization file manually, you need to create InfoPlist.strings, select languages in the right side menu and add keys as keys in plist-file. See:

"NSCameraUsageDescription" = "Here description of usage camera";


Why library looks complex and have modules?

Apple reject app with you import all frameworks and not request it. SPPermissions imported only code, which you choose. Support moduls struct is hard and may looks complex. I tried to make using the library as simple as possible.

Why I not see permission?

Check imports if you install via Swift Package Manager. If you install via CocoaPods, you podfile shoud have second path with module name.

I want make PR

Thanks for contribution! Please, support code style and test iOS and tvOS versions before. For more details about codestyle see

Other Projects


You can find this alerts in AppStore after feedback or after added song to library in Apple Music. Contains popular Done, Heart presets and many other. Done preset present with draw path animation like original. Also available simple present message without icon. Usage in one line code.


Animation of widgets from iOS 14. 3D transform with dynamic shadow. Look video preview. Available deep customisation 3D and shadow. Also you can use static transform without animation.


Simplifies working with animated changes in table and collections. Apple's diffable API required models for each object type. If you want use it in many place, you pass time to implement it and get over duplicates codes. This project help do it elegant with shared models and special cell providers. Support side bar iOS14 and already has native cell providers and views.


Collection of native Swift extensions to boost your development. Support tvOS and watchOS.

Russian Community

В телеграм-канале Код Воробья пишу о iOS разработке. Помощь можно найти в нашем чате.

Видео-туториалы выклыдываю на YouTube:

Tutorials on YouTube

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
swift (7,706
ios (3,586
animation (1,050
ui (1,020
xcode (486
calendar (287
camera (282
dialog (198
location (89
notification (83
request (82
interface (81
permissions (78
permission (50
photo-gallery (30
reminder (16