Tests已测试 | ✗ |
Lang语言 | SwiftSwift |
许可 | MIT |
Released最后发布 | 2016年9月 |
SPM支持SPM | ✗ |
由Nick O'Neill维护。
安装 • 用法 • 定制 • 已知的错误 • 问题 • 许可
灵感来源于(但与Periscope的权限控制无关)PermissionScope是一个用于从用户处智能请求权限的Swift框架。它不仅包含一个简单的请求权限的用户界面,而且还有一个统一的权限API,可以告诉您任何给定系统权限的状态或轻松请求它们。
一些多个权限请求、单个权限和拒绝警告的示例。
PermissionScope为说明请求权限的原因提供空间,并允许用户根据自己进度处理系统对话框。它提供了一种直接的数据权限设计和足够的灵活性,可以适用于大多数基于UIKit的应用。
最好的是,当应用程序的权限被用户拒绝时,PermissionScope会检测到并向用户提供一个简单的提示,让他们进入系统设置页面来修改这些权限。
PermissionScope需要iOS 8+,与基于Swift 3和Objective-C的项目兼容
对于Swift 2.x支持,请使用swift2分支或1.0.2发布版本。此分支在2016年9月6日是最新的,但现在不再维护。所有未来的努力都将集中在Swift 3开发上。
Carthage的安装很简单
github "nickoneill/PermissionScope" ~> 1.0
对于Cocoapods,使用以下内容获取最新发布版
use_frameworks!
pod 'PermissionScope'
并在您想使用它的文件中导入import PermissionScope
最简单的实现是显示权限列表,并在所有权限均满意访问时删除。
class ViewController: UIViewController {
let pscope = PermissionScope()
override func viewDidLoad() {
super.viewDidLoad()
// Set up permissions
pscope.addPermission(ContactsPermission(),
message: "We use this to steal\r\nyour friends")
pscope.addPermission(NotificationsPermission(notificationCategories: nil),
message: "We use this to send you\r\nspam and love notes")
pscope.addPermission(LocationWhileInUsePermission(),
message: "We use this to track\r\nwhere you live")
// Show dialog with callbacks
pscope.show({ finished, results in
print("got results \(results)")
}, cancelled: { (results) -> Void in
print("thing was cancelled")
})
}
}
如果已批准所有权限,权限视图将自动显示,如果权限已经被批准,则不会采取任何行动。如果所有权限都已被批准,它将自动隐藏。
如果您试图在没有权限的情况下阻止对应用程序的屏幕访问(例如,Periscope中的广播屏幕),您应该监控取消闭包,并为您的应用程序执行合适的操作。
通过修改这些属性,您可以轻松地使用PermissionScope更改颜色、标签和按钮字体。
字段 | 类型 | 注释 |
---|---|---|
headerLabel | UILabel | 默认消息为“Hey, listen!”的Header UILabel。 |
bodyLabel | UILabel | 默认消息为“在您开始之前,我们需要一些东西……”的Header UILabel。 |
closeButtonTextColor | UIColor | 设置关闭按钮文本颜色的颜色。 |
permissionButtonTextColor | UIColor | 设置权限按钮文本颜色的颜色。 |
permissionButtonBorderColor | UIColor | 设置权限按钮边框颜色的颜色。 |
buttonFont | UIFont | 用于所有UIButtons的字体。 |
labelFont | UIFont | 用于所有UILabels的字体。 |
closeButton | UIButton | 关闭按钮。默认位于右上角。 |
closeOffset | CGSize | 用于定位关闭按钮的偏移量。 |
authorizedButtonColor | UIColor | 用于带有授权状态的权限按钮的颜色。 |
unauthorizedButtonColor | UIColor? | 用于未授权状态的权限按钮的颜色。默认为authorizedButtonColor 的补色。 |
permissionButtonΒorderWidth | CGFloat | 权限按钮的边框宽度。 |
permissionButtonCornerRadius | CGFloat | 权限按钮的圆角半径。 |
permissionLabelColor | UIColor | 权限标签文本颜色的颜色。 |
contentView | UIView | 对话框的内容视图。 |
此外,默认情况下,在对话框后面的背景上轻按将取消对话框(这将调用您在show
中提供的取消闭包)。您可以在初始化期间通过backgroundTapCancels
更改此行为。
如果您想对特定权限的按钮文本有更多控制,可以为您的目标语言使用一个.strings文件并以此方式覆盖它们。如果您想为其他语言贡献本地化文件,请与我们联系!
PermissionScope还提供了一个抽象API,用于获取给定权限的状态以及当您需要在正常对话框UI之外请求权限时的权限请求。将其视为一个提供一些甚至苹果都不提供的功能的统一iOS权限API(例如,检测被拒绝的通知权限)。
switch PermissionScope().statusContacts() {
case .Unknown:
// ask
PermissionScope().requestContacts()
case .Unauthorized, .Disabled:
// bummer
return
case .Authorized:
// thanks!
return
}
request*
方法通常,PermissionScope用于在用户可以在您的应用中做某事之前引导他们走必要的权限流程。有时您可能希望直接从您的UI调用PermissionScope的各种request*
权限请求方法。
要直接调用这些方法,您必须首先将viewControllerForAlerts
方法设置为您的当前UIViewController,以防PermissionScope需要向用户显示有关拒绝或禁用权限的一些警告。
let pscope = PermissionScope()
pscope.viewControllerForAlerts = self
您可能还希望设置onAuthChange
、onCancel
和onDisabledOrDenied
闭包,这些闭包在request*
方法完成后在合适的时机被调用,否则您将不知道何时工作完成。
pscope.onAuthChange = { (finished, results) in
println("Request was finished with results \(results)")
if results[0].status == .Authorized {
println("They've authorized the use of notifications")
UIApplication.sharedApplication().registerForRemoteNotifications()
}
}
pscope.onCancel = { results in
println("Request was cancelled with results \(results)")
}
pscope.onDisabledOrDenied = { results in
println("Request was denied or disabled with results \(results)")
}
然后,您可以在用户切换开关时调用它。
@IBAction func notificationsChanged(sender: UISwitch) {
if sender.on {
// turn on notifications
if PermissionScope().statusNotifications() == .Authorized {
UIApplication.sharedApplication().registerForRemoteNotifications()
} else {
pscope.requestNotifications()
}
} else {
// turn off notifications
}
如果您还在以传统方式使用PermissionScope,请别忘了将其视图控制器的警报(viewControllerForAlerts)设置回默认值,即PermissionScope的实例。做到这一点的最简单方法是在调用任何request*
方法之前明确设置它,然后在您的闭包中重置它。
pscope.viewControllerForAlerts = pscope as UIViewController
当使用PermissionScope时,用户会收到启用通知的提示,但是您必须在您的应用代理的didRegisterUserNotificationSettings
中监视结果,然后独立地注册远程通知。这样就不会再次提示用户。您仍然需要处理将用户通知设置发送到您的推送服务器。
为了定位正常工作,您必须设置以下Info.plist键
实现定位权限最困难的部分是什么?您必须在Info.plist文件中实现适当的键,并简要说明您的应用如何使用位置信息(在系统权限对话框中显示)。没有这个,试图获取位置权限将只会默默失败。 软件!
根据您的应用使用情况使用相应的NSLocationAlwaysUsageDescription
或NSLocationWhenInUseUsageDescription
。您可以在配置PermissionScope时指定您希望请求的位置权限之一,使用.LocationAlways
或.LocationInUse
。
Info.plist中的NSBluetoothPeripheralUsageDescription键指定为什么您的应用需要在后台充当蓝牙外围设备的一段简短描述,这是可选的。
然而,启用功能部分中的background-modes
和检查“充当蓝牙LE附件”复选框是必需的。
在目标的功能中启用HealthKit
,必需。
解决方案:待定
解决方案:无。这是由OS意图实现的。
解决方案:不使用调试器运行您的应用。
Carthage
时,发生以下错误:“模块文件是由较旧版本的编译器创建的”。解决方案:使用--no-use-binaries
标志(例如:carthage update --no-use-binaries
)。
PermissionScope使用MIT许可证。如果您有任何问题或想分享您如何使用此工具,请提交问题。