SPPermissions 7.1.5

SPPermissions 7.1.5

Ivan VorobeiIvan Vorobei 维护。



  • 作者:
  • Ivan Vorobei

SPPermissions

提供三个可用界面 - 列表、对话框和本地化。支持 iPad、暗黑模式和已本地化功能。您还可以检查权限状态,支持的值为 .authorized.denied.notDetermined

支持的权限

导航

Swift 包管理器

Swift 包管理器(Swift Package Manager)是一种自动化Swift代码分发工具,并与“swift”编译器集成。它通过与Swift构建系统集成来自动化下载、编译和链接依赖项的过程。

一旦你设置好你的Swift包,将其添加为依赖项就像将它添加到你的Package.swift中的dependencies值一样简单。

dependencies: [
    .package(url: "https://github.com/ivanvorobei/SPPermissions", .upToNextMajor(from: "7.1.0"))
]

接下来选择你需要的权限。但不要全部添加,因为苹果公司将拒绝含有所有权限的应用。

CocoaPods

CocoaPods是一个依赖项管理器。有关使用和安装说明,请访问他们的网站。要使用CocoaPods整合,请在你的Podfile中指定它。

pod 'SPPermissions/Notification'

由于苹果公司关于权限访问的新政策,你需要使用子规范特别定义你想要访问的权限类型。例如,如果你想访问CameraLocationMicrophone,你可以定义以下内容

pod 'SPPermissions/Camera'
pod 'SPPermissions/LocationAlways'
pod 'SPPermissions/Microphone'
子规范

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/Music'
pod 'SPPermissions/Bluetooth'
pod 'SPPermissions/Tracking'
pod 'SPPermissions/FaceID'
pod 'SPPermissions/Siri'
pod 'SPPermissions/Health'

手动操作

如果你不希望使用任何依赖项管理器,你可以手动整合SPPermissions。复制代码,并从CONTRIBUTING.md文件添加编译标志。

导入

如果你通过Swift 包管理器安装,你应该导入每个模块

import SPPermissions
import SPPermissionsCamera
import SPPermissionsPhotoLibrary

这是必需的,因为库被分割成模块。导入后,你可以通过键入例如SPPermissions.Permission.camera来看到可用的权限。如果你通过CocoaPods安装,你只需要导入一个类

import SPPermissions

所有其他安装的类将自动导入。

快速开始

// MARK: 1. Choose the permissions you need:

let permissions: [SPPermissions.Permission] = [.camera, .notification]

// MARK: 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. Native Style
let controller = SPPermissions.native(permissions)
controller.present(on: self)

// MARK: 3. Optional: Check permission state (available `authorized`, `denied`, `notDetermined`):

let authorized = SPPermissions.Permission.calendar.authorized

更多详细信息请参阅 请求 部分。

状态

要检查任何权限的状态,请调用 SPPermissions.Permission

let authorized = SPPermissions.Permission.calendar.authorized

还有 deniednotDetermined 的状态。

位置

对于位置权限,用户可选择授权 precise 或不授权。要获取其状态,请调用以下内容

if SPPermissions.Permission.locationWhenInUse.isPrecise { ... }

同样适用于 .locationAlways

请求

SPPermissions 有三种显示风格:DialogListNative。每个界面都有代理和数据源。如果您想查看示例应用,请打开 Example Apps/SPPermissions.xcodeproj

列表

这是一个原生的 UITableViewController。当您有超过两个权限时,请使用它。以下是使用示例

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

// If you want auto dismiss controler,
// when all permissions has any determinated state
// set dismiss mode `allPermissionsDeterminated`.
// By default dismiss controller happen only when all permission allowed.
controller.dismissCondition = .allPermissionsDeterminated

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

对话框

这是一个模态警报。建议在您请求的权限少于三个时使用此警报样式。使用示例

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

// Override 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

// If you want auto dismiss controler,
// when all permissions has any determinated state
// set dismiss mode `allPermissionsDeterminated`.
// By default dismiss controller happen only when all permission allowed.
controller.dismissCondition = .allPermissionsDeterminated

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

原生

使用原生 UIAlertController 请求权限。您可以一次性请求许多权限

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

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

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

数据源

对于使用协议 SPPermissionsDataSource 的数据源。您可以自定义权限单元并提供拒绝提示文本。

extension Controller: SPPermissionsDataSource {
    
    func configure(_ cell: SPPermissionsTableViewCell, for permission: SPPermissions.Permission) {
        
        // Here you can customise cell, like texts or colors.
        cell.permissionTitleLabel.text = "Title"
        cell.permissionDescriptionLabel.text = "Description"
        
        // If you need change icon, choose one of this:
        cell.permissionIconView.setPermissionType(.bluetooth)
        cell.permissionIconView.setCustomImage(UIImage.init(named: "custom-name"))
        cell.permissionIconView.setCustomView(YourView())
    }
}

拒绝警报

如果拒绝权限,您可以为用户提供一个警报,并提供打开设置的选项。以下如何自定义警报文本的示例

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

接下来实现以下方法并返回

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

代理

要获取 hiddenalloweddenied 事件,请使用协议 SPPermissionsDelegate 设置代理

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

本地化

SPPermissions 为以下语言提供了即用型本地化:

  • 英语 en
  • 阿拉伯语 ar
  • 德语 de
  • 西班牙语 es
  • 法语 fr
  • 波兰语 pl
  • 葡萄牙语 pt
  • 乌克兰语 uk
  • 俄语 ru
  • 简体中文 zh_Hans
  • 意大利语 it
  • 繁体中文 zh_Hant
  • 波斯语 fa

如果您想添加更多,请创建文件夹 [language_id].lproj 并发起拉取请求。如果您想使用自定义字符串,请检查数据源部分。

Info.plist 中的键

根据苹果的要求,您需要向 Info.plist 文件中添加一些带有描述的键。您可以通过以下方式获取权限键的 plist:

let key = SPPermissions.Permission.bluetooth.usageDescriptionKey

键列表

  • NSCameraUsageDescription
  • NSContactsUsageDescription
  • NSCalendarsUsageDescription
  • NSMicrophoneUsageDescription
  • NSAppleMusicUsageDescription
  • NSRemindersUsageDescription
  • NSPhotoLibraryUsageDescription
  • NSPhotoLibraryAddUsageDescription
  • NSSpeechRecognitionUsageDescription
  • NSMotionUsageDescription
  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysAndWhenInUseUsageDescription
  • NSBluetoothAlwaysUsageDescription
  • NSBluetoothPeripheralUsageDescription(iOS 12 及以前版本)
  • NSUserTrackingUsageDescription
  • NSFaceIDUsageDescription
  • NSSiriUsageDescription
  • NSHealthUpdateUsageDescription
  • NSHealthShareUsageDescription

请勿将描述用作键的名称。

如果您使用 xliff 本地化导出,键将自动创建。如果您想手动创建本地化文件,您需要创建 InfoPlist.strings 文件,在右侧菜单中选择语言,并将键作为 plist 文件中的键添加。参见

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

苹果审核

苹果于2021年6月更改了其审核指南。当请求权限时,应用应要求用户始终请求并做出允许或拒绝权限的决定。因此,SPPermissions 中默认隐藏了关闭按钮。如果您想强制显示关闭按钮,请运行以下代码

// Show & hide close button
controller.showCloseButton = true

// Enable or Disable drag intercation
controller.allowSwipeDismiss = true

同时也更改了按钮的标题。现在使用 继续 而不是 允许。苹果审核团队要求这样做。有关详细信息,请查看 此问题

俄罗斯社区

我在 telegram 频道 上发布新闻和教程。
聊天室 中可以帮助您解决问题。

视频教程发布在 YouTube 上。

Tutorials on YouTube