权限 3.1.2

权限 3.1.2

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2019年11月
SPM支持SPM

Damien Delba维护。



权限 3.1.2

  • Damien

Travis Status CocoaPods compatible Carthage compatible

Permission提供了请求iOS权限的统一API。

使用方法示例安装许可证

使用方法

权限

Permission.swift PermissionStatus.swift

let permission: Permission = .contacts

print(permission.status) // .notDetermined

permission.request { status in
    switch status {
    case .authorized:    print("authorized")
    case .denied:        print("denied")
    case .disabled:      print("disabled")
    case .notDetermined: print("not determined")
    }
}
支持的权限

PermissionType.swift Types/

权限提示框

PermissionAlert.swift

拒绝和禁用警报

当您首次请求权限时,系统将向用户显示警报。如果您请求已被拒绝/禁用的权限,则会显示一个 PermissionAlert。您可能想要更改默认的 标题消息取消设置 文本。

let alert = permission.deniedAlert // or permission.disabledAlert

alert.title    = "Please allow access to your contacts"
alert.message  = nil
alert.cancel   = "Cancel"
alert.settings = "Settings"

如果不希望显示这些警报,请设置 permission.presentDeniedAlert = falsepermission.presentDisabledAlert = false

请求权限前的警报

为了避免错过展示系统警报的唯一机会,您可以展示一个 请求权限前的警报。请参阅这篇文章以获取更多信息 http://techcrunch.com/2014/04/04/the-right-way-to-ask-users-for-ios-permissions/

permission.presentPrePermissionAlert = true

let alert = permission.prePermissionAlert

alert.title   = "Let Foo Access Photos?"
alert.message = "This lets you choose which photos you want to add to your Foo profile"
alert.cancel  = "Not now"
alert.confirm = "Give Access"

只有在用户点击“授予访问”时才会显示系统警报。

PermissionSet

PermissionSet.swift

使用 PermissionSet 来检查一组 权限 的状态,并在请求权限时做出反应。

let permissionSet = PermissionSet(.contacts, .camera, .microphone, .photos)
permissionSet.delegate = self

print(permissionSet.status) // .notDetermined

// ...

func permissionSet(permissionSet: PermissionSet, willRequestPermission permission: Permission) {
    print("Will request \(permission)")
}

func permissionSet(permissionSet: PermissionSet, didRequestPermission permission: Permission) {
    switch permissionSet.status {
    case .authorized:    print("all the permissions are granted")
    case .denied:        print("at least one permission is denied")
    case .disabled:      print("at least one permission is disabled")
    case .notDetermined: print("at least one permission is not determined")
    }
}

PermissionButton

PermissionButton

当点击时请求权限,并且在其底层权限状态改变时更新自己的 PermissionButton

let button = PermissionButton(.photos)

PermissionButtonUIButton 的子类。所有 UIButton 的获取器和设置器在 PermissionButton 中都有其对应项。

button.setTitles([
    .authorized:    "Authorized",
    .denied:        "Denied",
    .disabled:      "Disabled",
    .notDetermined: "Not determined"
])

// button.setAttributedTitles
// button.setTitleColors
// button.setTitleShadowColors
// button.setImages
// button.setBackgroundImages
// etc.

第三方库

示例

class PermissionsViewController: UIViewController, PermissionSetDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel()

        let contacts   = PermissionButton(.contacts)
        let camera     = PermissionButton(.camera)
        let microphone = PermissionButton(.microphone)
        let photos     = PermissionButton(.photos)

        contacts.setTitles([
            .notDetermined: "Contacts - NotDetermined"
            .authorized:    "Contacts - Authorized",
            .denied:        "Contacts - Denied"
        ])

        contacts.setTitleColors([
            .notDetermined: .black,
            .authorized:    .green,
            .denied:        .red
        ])

        // ...

        let permissionSet = PermissionSet(contacts, camera, microphone, photos)

        permissionSet.delegate = self

        label.text = String(describing: permissionSet.status)

        for subview in [label, contacts, camera, microphone, photos] {
            view.addSubview(subview)
        }
    }

    func permissionSet(permissionSet: PermissionSet, didRequestPermission permission: Permission) {
        label.text = String(permissionSet.status)
    }
}

安装

使用Carthage

Carthage是一个去中心化的依赖管理器,能够自动化将框架添加到您的Cocoa应用程序中的过程。

您可以使用以下命令通过Homebrew安装Carthage:

$ brew update
$ brew install carthage

为了使用Carthage将Permission集成到您的Xcode项目中,请在您的Cartfile中指定它。

github "delba/Permission"
配置

由于苹果公司对权限访问的新政策,二进制文件可能会因为试图访问隐私敏感数据而因为没有使用密钥而被拒绝,而且如果没有请求权限则进一步被拒绝。

作为解决方案,您可以在构建动态框架之前提供自定义构建标志,只编译您请求的权限。这通过向项目根目录添加一个名为PermissionConfiguration.xcconfig的配置文件来实现。为了方便,您可以使用PermissionConfiguration.xcconfigPermission/存储库目录中。仅评论掉您想使用的权限,然后编译框架。

为了只编译通知和照片权限,请看以下示例:

PERMISSION_BLUETOOTH         = // PERMISSION_BLUETOOTH
PERMISSION_CAMERA            = PERMISSION_CAMERA
PERMISSION_CONTACTS          = // PERMISSION_CONTACTS
PERMISSION_EVENTS            = // PERMISSION_EVENTS
PERMISSION_LOCATION          = // PERMISSION_LOCATION
PERMISSION_MICROPHONE        = // PERMISSION_MICROPHONE
PERMISSION_MOTION            = // PERMISSION_MOTION
PERMISSION_NOTIFICATIONS     = PERMISSION_NOTIFICATIONS
PERMISSION_PHOTOS            = // PERMISSION_PHOTOS
PERMISSION_REMINDERS         = // PERMISSION_REMINDERS
PERMISSION_SPEECH_RECOGNIZER = // PERMISSION_SPEECH_RECOGNIZER
PERMISSION_MEDIA_LIBRARY     = // PERMISSION_MEDIA_LIBRARY

// Do not modify this line. Instead, remove comments above as needed to enable the categories your app uses.
PERMISSION_FLAGS= $(PERMISSION_BLUETOOTH) $(PERMISSION_CAMERA) $(PERMISSION_CONTACTS) $(PERMISSION_EVENTS) $(PERMISSION_LOCATION) $(PERMISSION_MICROPHONE) $(PERMISSION_MOTION) $(PERMISSION_NOTIFICATIONS) $(PERMISSION_PHOTOS) $(PERMISSION_REMINDERS) $(PERMISSION_SPEECH_RECOGNIZER) $(PERMISSION_MEDIA_LIBRARY)

SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) $(PERMISSION_FLAGS)

CocoaPods

CocoaPods是Cocoa项目的依赖管理器。

您可以使用以下命令安装它:

$ gem install cocoapods

要使用 CocoaPods 将权限集成到您的 Xcode 项目中,请在您的 Podfile 中指定它。由于 Apple 关于权限访问的新政策,您需要特别定义您想使用 subspecs 访问哪种类型的权限。例如,如果要访问相机和通知,请定义以下内容:

use_frameworks!

pod 'Permission/Camera'
pod 'Permission/Notifications'

有关哪些 subspecs 可用的更多信息,请参阅 Permission.podspec

许可协议

版权所有 (c) 2015-2019 Damien (http://delba.io)

特此免费授予任何人获得本软件和相关文档副本(以下简称“软件”)的权利,无权限制使用软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供者提供软件的人这样做,受以下条件约束:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,还是关于适销性、特定用途适用性和不侵权保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类索赔、损害或其他责任是出于合同、侵权或其他法律行为,由软件或软件的使用或其他操作引起。