自动请求和处理权限的简单方法。
为什么你会需要它?
这个库可以很容易地处理 notDetermined
,authorised
,restricted
和 denied
的情况,而不必自己来做。不再需要对手动处理 restricted
和 denied
的情况做错误处理,创建并向用户显示特定的警报。当然,它不是一个万能的解决方案,但它是你项目中的一个很好的工具!
功能
- 通过
Configuration
自定义或本地化警告消息 - 自动创建和显示警告
- 用户可以轻松地在设置中更改权限的机会
- CoreLocation 权限返回用户决策的完成块
- 示例项目,便于理解框架
支持权限类型
相机
通讯录
事件
相册
位置
媒体库
麦克风
提醒
Siri
语音识别
CocoaPods 安装方法
ios-permissions-service 可通过 CocoaPods 和 Carthage 使用
CocoaPods
安装方法,只需将以下一行或多行添加到您的 Podfile 中:
pod "PermissionsService/Location"
pod "PermissionsService/Camera"
您可在此处找到可用的完整权限列表:这里。
如果您需要,还有一个关于 Swift 3/4 的版本记录在单独的分支中
现在您需要从项目文件夹中运行 pod update
命令,这样就完成了!
Carthage
- 将以下行添加到您的 Cartfile 中
github "lemberg/ios-permissions-service"
如果您想使用另一个 Swift 版本的具体分支,可以添加分支名称
github "lemberg/ios-permissions-service" "swift4"
-
从项目文件夹中运行
carthage update --platform iOS
命令。 -
找到 Carthage/Build 文件夹,位于您的项目文件夹中。将
PermissionsService.framework
文件拖放到项目设置中 General 选项卡下的 Linked Frameworks and Libraries 部分。 -
转到 Build Phases 设置选项卡。如果您还没有新建运行脚本阶段,点击“+”图标并选择 New Run Script Phase。将以下行添加到脚本中
/usr/local/bin/carthage copy-frameworks
- 在 Input Files 下添加框架路径
$(SRCROOT)/Carthage/Build/iOS/PermissionsService.framework
- 将框架路径添加到 Output Files
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/PermissionsService.framework
您可以在 这里 找到有关使用和配置 Carthage 的更多信息。
注意!
关于安装,由于 Apple 的政策存在一个重要的注意事项。由于关于权限访问的政策,二进制文件可能会因为被认为是不带使用密钥访问隐私敏感数据而被拒绝,然后进一步被拒绝,因为没有请求权限。这个错误会在您尝试上传到 itunesconnect 时发生。
但有一个 解决方案。您需要在构建动态框架之前提供自定义构建标志,只编译您请求的权限。
-
前往项目根目录并添加名为
PermissionConfiguration.xcconfig
的xcconfig
文件。您可以在这里找到此类文件的示例:链接 -
注释掉不希望使用的行,如下所示
PERMISSION_CAMERA = PERMISSION_CAMERA
PERMISSION_CONTACTS = // PERMISSION_CONTACTS
这里有一个仅使用 Camera
权限的示例。将无法访问 Contacts
权限。
- 现在可以运行
carthage update --platform iOS
来编译框架。
如果您需要更改可用的权限,请转到
PermissionConfiguration.xcconfig
文件并修改它。然后再次更新框架。
如何使用
-
根据选择的权限类型配置您所需的所有项目设置。例如,在相册的情况下,向您的 .plist 文件添加一个特定的键。
-
在您的类中实现
Permissible
协议。如果不是UIVIewController
类,则应实现showAlert(_:)
方法;如果是,则存在默认实现,您可以直接留空。 -
添加一个
Permission<T: PermissionService>
对象,其中包含您需要的类型,并使用prepare(_:)
方法请求权限并向用户展示警报。
Permission<Gallery>.prepare(for: self, callback: { (granted) in
if granted {
//present library
} else {
//perform specific functions
}
})
这是使用默认权限设置的一个简单示例。
请注意,名为 Events 的 Calendar 权限服务。
- 享受吧!
配置
如果您需要,这个库提供了进行自定义或配置的机会。
配置消息
您可以通过创建一个新的符合 ServiceMessages
协议的 struct
来添加自定义的 denied
和 restricted
情况下的警报消息。
struct CameraMessages: ServiceMessages {
let deniedTitle = "Access denied"
let deniedMessage = "You can enable access to camera in Privacy Settings"
let restrictedTitle = "Access restricted"
let restrictedMessage = "Access to camera is restricted"
}
要使用您自定义的消息,您需要使用 DefaultConfiguration
类。让我们来初始化它!
let config = DefaultConfiguration(with: CameraMessages())
现在请将其放入 prepare(_:)
方法中,如下所示
Permission<Camera>.prepare(for: self, with: config) { (granted) in
if granted {
print("Granted")
} else {
print("Error")
}
}
位置权限类型
如您所知,您可以请求两种类型的用户位置权限: WhenInUse
和 Always
。要选择它,您需要使用配置。类 LocationConfiguration
是 DefaultConfiguration
的子类,使用方式相同。
您可以通过类型来初始化它。
let config = LocationConfiguration(.always)
或者,您可以使用它与您的消息一起使用。
let config = LocationConfiguration(.always, with: CustomLocationMessages())
然后只需将其放入您的 prepare(_:)
方法中即可,就像您已经使用 DefaultConfiguration
那样。
Permission<Location>.prepare(for: self, with: config) { (granted) in
if granted {
print("Granted")
} else {
print("Error")
}
}
如果您还有任何问题或问题(也许是改进!)请随时打开新的问题或PR。
需求
作者
Lemberg Solutions
许可证
ios-permissions-service 在 BSD 许可证 下可用。有关更多信息,请参阅 LICENSE 文件。