Arek
AREK is a clean and easy way to request any kind of iOS permission (with some nifty features π€)
Install / Use
/learn @ennioma/ArekREADME
AREK is a clean and easy to use wrapper over any kind of iOS permission written in Swift.
Why AREK could help you building a better app is well described by Apple <a href="https://developer.apple.com/ios/human-interface-guidelines/interaction/requesting-permission/">here</a>:
Request personal data only when your app clearly needs it.
...
Explain why your app needs the information if itβs not obvious.
...
Request permission at launch only when necessary for your app to function.
...
Every goal could be easily reached using AREK.
- show a native popup used to avoid burning the possibility to ask to iOS the real permission
- show a popup to invite the user to re-enable the permission if it has been denied
- manage through an easy configuration how many times to ask the user to re-enable the permission (Only once, every hour, once a day, weekly, alwaysπ·)
π¨ AREK is a Swift 4.2 and Xcode 10 compatible project π¨
Important!
- If you want to use it with Xcode 10, swift 4.2, point to the version 4.0.1
- If you want to use it with Xcode 9, point to any prior version
Build Status
| Branch | Status |
| ------------- | ------------- |
| Master | |
| Develop |
|
Table of Contents
- Implemented permissions
- How to use AREK
- Permissions Configuration
- How to install AREK
- How to contribute
- TODO
- License and Credits
<a name="implementedPermissions"></a>
Implemented permissions
- [x] Camera
- [x] Bluetooth
- [x] CloudKit
- [x] Contacts
- [x] Events (Calendar)
- [x] Health
- [x] Location (Always)
- [x] Location (When in use)
- [x] Media Library
- [x] Microphone
- [x] Motion
- [x] Notifications
- [x] Photo
- [x] Reminders
- [x] Siri
- [x] Speech Recognizer
<a name="howTo"></a>
How to use AREK
Check permission status
let permission = ArekPhoto()
permission.status { (status) in
switch status {
case .authorized:
print("! β
!")
case .denied:
print("! βοΈ !" )
case .notDetermined:
print("! π€ !" )
case .notAvailable:
print("! π« !" )
}
}
Request a permission
let permission = ArekEvent()
permission.manage { (status) in
switch status {
case .authorized:
symbol = "β
"
case .denied:
symbol = "βοΈ"
case .notDetermined:
symbol = "π€"
case .notAvailable:
return "π«"
}
}
<a name="permissionsConfiguration"></a>
Permissions Configuration
General configuration
Each permission type included in AREK is configurable through the ArekConfiguration struct. Each permission has a default configuration, so if you are happy with the basic configuration you don't have to care about how it works behind the scenes.
An ArekConfiguration is made up by:
frequency: ArekPermissionFrequency (.Always, .EveryHour, .OnceADay, .OnceAWeek, .JustOnce) This frequency value is related to how often you want to the user to re-enable a permission if that one has been disallowed.
Set by default to .OnceADay
presentInitialPopup: Bool This is an initial popup used to ask kindly to the user to allow a permission. This is useful to avoid burning the possibility to show the system popup.
Set by default to true
presentReEnablePopup: Bool This is the popup used to kindly to the user to re-enable that permission. The frequency value is related to this popup.
Set by defaul to true
Configure the initial and the re-enable popup: ArekPopupData
ArekPopupData is the struct used to configure both the pre-permission popup and the re-enable popup. These popups could be instances of the amazing PMAlertController by Codeido or native iOS alerts.
The configuration is the following:
public struct ArekPopupData {
var title: String!
var message: String!
var image: String!
var type: ArekPopupType!
public init(title: String = "", message: String = "", image: String = "", type: ArekPopupType = .codeido) {
self.title = title
self.message = message
self.image = image
self.type = type
}
}
This is an example of the ArekContacts pre-enable popup using PMAlertController:
<br />
<img src="https://github.com/ennioma/arek/blob/master/code/Assets/arek_contacts.png" width="150">
If you want to present a native UIAlertController set the type to .native otherwise if you want to setup a PMAlertController set the type to .codeido.
Localized Strings
AREK by convention expects to find localized strings in your Localizable files in order to configure the UI.
In the following table there are the configurations for:
- Pre-permission popup title
- Pre-permission popup message
- Re-enable popup title
- Re-enable popup message
- Popup image for that permission
- Allow button title
- Deny button title
Messages related to the iOS native permission popup should be configured following the conventions described <a href="https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW1">here</a>.
| Permission | Pre-permission Title | Pre-permission Message | Re-Enable Title | Re-Enable Message | Image | Allow Button Title | Deny Button Title | | :-------------: | :-------------: | :-------------: | :-------------: | :---------------: | :---: | :----------------: | :---------------: | | Camera | ArekCamera_initial_title | ArekCamera_initial_message | ArekCamera_reenable_title | ArekCamera_reenable_message | ArekCamera_image | ArekCamera_allow_button_title | ArekCamera_deny_button_title | | CloudKit | ArekCloudKit_initial_title | ArekCloudKit_initial_message | ArekCloudKit_reenable_title | ArekCloudKit_reenable_message | ArekCloudKit_image | ArekCloudKit_allow_button_title | ArekCloudKit_deny_button_title | Contacts | ArekContacts_initial_title | ArekContacts_initial_message | ArekContacts_reenable_title | ArekContacts_reenable_message | ArekContacts_image | ArekContacts_allow_button_title | ArekContacts_deny_button_title | Events | ArekEvents_initial_title | ArekEvents_initial_message | ArekEvents_reenable_title | ArekEvents_reenable_message | ArekEvents_image | ArekEvents_allow_button_title | ArekEvents_deny_button_title | | HealthKit | ArekHealth_initial_title | ArekHealth_initial_message | ArekHealth_reenable_title | ArekHealth_reenable_message | ArekHealth_image | ArekHealth_allow_button_title | ArekHealth_deny_button_title | | Media Library | ArekMediaLibrary_initial_title | ArekMediaLibrary_initial_message | ArekMediaLibrary_reenable_title | ArekMediaLibrary_reenable_message | ArekMediaLibrary_image | ArekMediaLibrary_allow_button_title | ArekMediaLibrary_deny_button_title | | Microphone | ArekMicrophone_initial_title | ArekMicrophone_initial_message | ArekMicrophone_reenable_title | ArekMicrophone_reenable_message | ArekMicrophone_image | ArekMicrophone_allow_button_title | ArekMicrophone_deny_button_title | | Motion | ArekMotion_initial_title | ArekMotion_initial_message | ArekMotion_reenable_title | ArekMotion_reenable_message | ArekMotion_image | ArekMotion_allow_button_title | ArekMotion_deny_button_title | | Notifications | ArekNotifications_initial_title | ArekNotifications_initial_message | ArekNotifications_reenable_title | ArekNotifications_reenable_message | ArekNotifications_image | ArekNotifications_allow_button_title | ArekNotifications_deny_button_title | | Photo Library | ArekPhoto_initial_title | ArekPhoto_initial_message | ArekPhoto_reenable_title | ArekPhoto_reenable_message | ArekPhoto_image | ArekPhoto_allow_button_title | ArekPhoto_deny_button_title | | Reminders | ArekReminders_initial_title | ArekReminders_initial_message | ArekReminders_reenable_title | ArekReminders_reenable_message | ArekReminders_image | ArekReminders_allow_button_title | ArekReminders_ deny_button_title| | Siri | ArekSiri_initial_title | ArekSiri_initial_message | ArekSiri_reenable_title | ArekSiri_reenable_message | ArekSiri_image | ArekSiri_allow_button_title | ArekSiri_deny_button_title | | Speech Recognizer | ArekSpeechRecognizer_initial_title | ArekSpeechRecognizer_initial_message | ArekSpeechRecognizer_reenable_title | ArekSpeechRecognizer_reenable_message | ArekSpeechRecognizer_image | ArekSpeechRecognizer_allow_button_title | ArekSpeechRecognizer_deny_button_title | | Bluetooth | ArekBluetooth_initial_title | ArekBluetooth_initial_message | ArekBluetooth_reenable_title | ArekBluetooth_reenable_message | ArekBluetooth_image | ArekBluetooth_allow_button_title |
