在 iOS 11+ 上即可使用。支持 iOS、tvOS 和 SwiftUI
。
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'
由于苹果公司关于权限访问的新政策,你需要使用子规范特别定义你想要访问的权限类型。例如,如果你想访问Camera
、Location
和Microphone
,你可以定义以下内容
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/Health'
手动操作
如果你不希望使用任何依赖项管理器,你可以手动整合SPPermissions
。复制代码,并从CONTRIBUTING.md文件添加编译标志。
导入
如果你通过Swift 包管理器安装,你应该导入每个模块
import SPPermissions
import SPPermissionsCamera
import SPPermissionsPhotoLibrary
这是必需的,因为库被分割成模块。导入后,你可以通过键入例如SPPermissions.Permission.camera
来看到可用的权限。如果你通过CocoaPods安装,你只需要导入一个类
所有其他安装的类将自动导入。
快速开始
// 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
还有 denied
和 notDetermined
的状态。
位置
对于位置权限,用户可选择授权 precise
或不授权。要获取其状态,请调用以下内容
if SPPermissions.Permission.locationWhenInUse.isPrecise { ... }
同样适用于 .locationAlways
。
请求
SPPermissions
有三种显示风格:Dialog
、List
和 Native
。每个界面都有代理和数据源。如果您想查看示例应用,请打开 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
}
代理
要获取 hidden
、allowed
或 denied
事件,请使用协议 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 上。
