Skip to content
Simple request permission with native UI and interactive animation
Branch: master
Clone or download
Latest commit aaaefd3 Apr 18, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Example/SPPermission
Resources Update Banner Jan 18, 2019
SPPermission.xcodeproj Update to 3.0.5 Apr 2, 2019
Source Update SPPermission.h Apr 2, 2019
.gitignore Update to 3.0.5 Apr 2, 2019
LICENSE Initial commit Feb 16, 2017
README.md Update README.md Apr 18, 2019
SPPermission.podspec Fix swift support Apr 17, 2019

README.md

This project is about managing permissions with customizable visual effects. Simple pod saves your hours of development. You can start using this project with just two lines of code and easy customization! You can watch how I design UI for this pod on YouTube.

Preview GIF is loading 4mb. Please wait.

I have a store where I sell applications and modules for Xcode projects. You can find source codes of applications or custom animations / UI. I regularly update the code. Visit my website to see all items for sale: xcode-shop.com. On the website you can find previews and, for some items, links to AppStore.

Requirements

Swift 4.2 & 5.0. Ready for use on iOS 10+

Installation

CocoaPods:

You can use CocoaPods to install SPPermission by adding it to your Podfile:

pod 'SPPermission'

Carthage

You can use Carthage to install SPPermission by adding it to your Cartfile:

github "IvanVorobei/SPPermission"

For now Carthage support may not work correctly. If you have any problems, create a new issue.

Manually

Put Source/SPPermission folder in your Xcode project. Make sure to enable Copy items if needed and Create groups.

Usage

Call SPPermission and use func request(). Also, pass the controller on which the dialog should present:

import UIKit
import SPPermission

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        SPPermission.Dialog.request(with: [.camera, .microphone, .notification], on: self)
    }
}

If you want to know if permission is allowed, you need to call the function:

let isAllowedCamera = SPPermission.isAllowed(.camera)

If you want to know if permission is denied, you need to call the function:

let isDeniedMicrophone = SPPermission.isDenied(.microphone)

To learn how to customize titles and images you can read section DataSource & Customization

Permissions

If you want to request notification (or other permissions) without dialog, use the function:

SPPermission.request(.notification, with: {
    // Callback
})

If you want new permission added, create new issue here.

Delegate

To track events of hiding & allowing permissions associated with SPPermission, implement protocol SPPermissionDialogDelegate:

@objc public protocol SPPermissionDialogDelegate: class {

    @objc optional func didHide()
    @objc optional func didAllow(permission: SPPermissionType)
    @objc optional func didDenied(permission: SPPermissionType)
}

And pass the delegate to the function:

SPPermission.Dialog.request(
    with: [.calendar, .microphone],
    on: self,
    delegate: self
)

DataSource & Customization

If you want to change the text, you need to implement SPPermissionDialogDataSource protocol. Override needed parameters to see the changes:

@objc public protocol SPPermissionDialogDataSource: class {

    @objc optional var dialogTitle: String { get }
    @objc optional var dialogSubtitle: String { get }
    @objc optional var dialogComment: String { get }
    @objc optional var allowTitle: String { get }
    @objc optional var allowedTitle: String { get }
    @objc optional var bottomComment: String { get }
    @objc optional var showCloseButton: Bool { get }
    @objc optional var dragEnabled: Bool { get }
    @objc optional func name(for permission: SPPermissionType) -> String?
    @objc optional func description(for permission: SPPermissionType) -> String?
    @objc optional func image(for permission: SPPermissionType) -> UIImage?
    @objc optional func deniedTitle(for permission: SPPermissionType) -> String?
    @objc optional func deniedSubtitle(for permission: SPPermissionType) -> String?
    @objc optional var cancelTitle: String { get }
    @objc optional var settingsTitle: String { get }
}

And pass the object to the function:

SPPermission.Dialog.request(
    with: [.photoLibrary, .contacts],
    on: self,
    delegate: self,
    dataSource: self
)

If you want to inhibite drag gesture to discard the dialog view you need to override dragEnabled parameter, and if you want to add or remove the close button (without the button you’ll have to swipe the dialog to close it), you need to override parameter showCloseButton. To see what it looks like, see the picture below:

In the project you can find an example of usage of SPPermissionDialogDataSource

Colors

If you want to change the color scheme, you need to implement the protocol SPPermissionDialogColorSource. It is not necessary to override all parameters, you can only change those that are necessary:

@objc public protocol SPPermissionDialogColorSource: class {
    
    @objc optional var whiteColor: UIColor { get }
    @objc optional var blackColor: UIColor { get }
    @objc optional var baseColor: UIColor { get }
    @objc optional var grayColor: UIColor { get }
    @objc optional var lightGrayColor: UIColor { get }
    
    @objc optional var iconWhiteColor: UIColor { get }
    @objc optional var iconLightColor: UIColor { get }
    @objc optional var iconMediumColor: UIColor { get }
    @objc optional var iconDarkColor: UIColor { get }
}

Will auto check SPPermissionDialogDataSource also implement SPPermissionDialogColorSource. You need pass for dataSource object, which implements two protocols.

Purpose String in Info.plist

SPPermission uses many permissions in one library; you need to add some strings to the Info.plist file with description. List of keys:

  • NSContactsUsageDescription
  • NSCalendarsUsageDescription
  • NSMicrophoneUsageDescription
  • NSAppleMusicUsageDescription
  • NSSpeechRecognitionUsageDescription
  • NSMotionUsageDescription
  • NSLocationAlwaysUsageDescription
  • NSLocationWhenInUseUsageDescription

Do not use the description as the name of the key - this causes errors in the latest version of the new Xcode. Specify For SPPermission in the description. If I forgot to mention some, please let me know and create issue or pull request.

YouTube Video

I have YouTube channel where I publish videos about Xcode and Design. You can see how I develop native design for SPPermission dialog view:

Timelaps on YouTube

My projects

Here I would like to offer you my other projects.

SPStorkController

I created SPStorkController. It is a modal controller like in Mail or Apple Music application. Similar animation and transition. You can see an example of using controller in app in AppStore.

You can buy source code of this app on xcode-shop.com. Price - $200. You can download app from AppStore or see detailed preview.

SPLarkController

Project SPLarkController will help you realize the management of your application settings. You can add both buttons and switches. The amount cells is not limited. You can start using project with just two lines of code and easy customization!

You can buy source code of this app on xcode-shop.com. Price for GitHub users - $300. With copyright - $4.900. Please, see detailed preview with all the features and screens of the application.

For Russian-speaking users

Вы можете глянуть туториал на youtube или почитать статью Обновление библиотеки SPPermission, чтобы больше узнать о проекте. Taк же вы можете прочитать статью Получил 1.2K звезд на GitHub с ужасной архитектурой. Как? о первой версии проекта и работе с архитектурой

License

SPPermission is released under the MIT license. Check LICENSE.md for details.

Contact

If you need any application or UI to be developed, message me at hello@ivanvorobei.by. I develop iOS apps and create designs, too. I use swift for development. To request more functionality, you should create a new issue.

You can’t perform that action at this time.