PermissionScope 1.1.1

PermissionScope 1.1.1

Tests已测试
Lang语言 SwiftSwift
许可 MIT
Released最后发布2016年9月
SPM支持SPM

Nick O'Neill维护。



PermissionScope

安装用法定制已知的错误问题许可

灵感来源于(但与Periscope的权限控制无关)PermissionScope是一个用于从用户处智能请求权限的Swift框架。它不仅包含一个简单的请求权限的用户界面,而且还有一个统一的权限API,可以告诉您任何给定系统权限的状态或轻松请求它们。

一些多个权限请求、单个权限和拒绝警告的示例。

permissionscope gif

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文件并以此方式覆盖它们。如果您想为其他语言贡献本地化文件,请与我们联系!

统一的权限API

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

您可能还希望设置onAuthChangeonCancelonDisabledOrDenied闭包,这些闭包在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注册用户通知设置,而不是远程通知

当使用PermissionScope时,用户会收到启用通知的提示,但是您必须在您的应用代理的didRegisterUserNotificationSettings中监视结果,然后独立地注册远程通知。这样就不会再次提示用户。您仍然需要处理将用户通知设置发送到您的推送服务器。

权限的额外要求

定位

为了定位正常工作,您必须设置以下Info.plist键

实现定位权限最困难的部分是什么?您必须在Info.plist文件中实现适当的键,并简要说明您的应用如何使用位置信息(在系统权限对话框中显示)。没有这个,试图获取位置权限将只会默默失败。 软件

根据您的应用使用情况使用相应的NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription。您可以在配置PermissionScope时指定您希望请求的位置权限之一,使用.LocationAlways.LocationInUse

蓝牙

Info.plist中的NSBluetoothPeripheralUsageDescription键指定为什么您的应用需要在后台充当蓝牙外围设备的一段简短描述,这是可选的

然而,启用功能部分中的background-modes和检查“充当蓝牙LE附件”复选框是必需的

HealthKit

在目标的功能中启用HealthKit必需

已知的错误

  • ITC应用拒绝,原因如下:“此应用尝试访问隐私敏感数据,没有使用描述”。(《https://github.com/nickoneill/PermissionScope_issues/194》#194)

解决方案:待定

  • 当用户被带到Settings.app时,如果应用任何权限发生变化(当应用处于后台时),应用将会崩溃。(《https://github.com/nickoneill/PermissionScope_issues/160》#160)

解决方案:无。这是由OS意图实现的。

  • 链接“让我看看”在拒绝权限时不可用(《https://github.com/nickoneill/PermissionScope_issues/61》#61)

解决方案:不使用调试器运行您的应用。

  • 在使用Carthage时,发生以下错误:“模块文件是由较旧版本的编译器创建的”。

解决方案:使用--no-use-binaries标志(例如:carthage update --no-use-binaries)。

许可证

PermissionScope使用MIT许可证。如果您有任何问题或想分享您如何使用此工具,请提交问题。