ISHPermissionKit
ISHPermissionKit 提供了一种礼貌且统一的方式来请求 iOS 上的权限。它还提供 UI 来在向用户展示系统权限对话框之前解释权限要求。这允许开发者在系统对话框出现之前进行延迟。该框架不提供任何实际的用户界面,让开发者和设计师负责创建视图。
虽然您可以使用 ISHPermissionKit 同时请求用户多个类别的权限,并且脱开上下文,但您应该只在应用程序需要时请求权限。但是,可能在同时需要多个权限的情况下,例如开始记录位置和运动数据。
此框架还提供了明确请求用户权限的方式,而系统 API 只提供隐式方法。
支持的权限类别
- 日历:事件和提醒
- 联系信息
- 位置:始终和当使用
- 动作:活动数据(计步等)
- HealthKit
- 话筒
- 音乐库
- 通知:本地和远程
- 照片:图库和相机
- 社交:Facebook、Twitter、新浪微博、腾讯微博
- Siri
- 语音识别
该库使用 iOS 11 SDK 或更高版本进行编译,并部署回 iOS 9。对不支持版本的部署目标之后添加的权限类别将跳过。
所有权限类别都与敏感用户信息相关。如果你的应用二进制文件包含访问此信息的代码,则必须遵守特殊的审查指南和其他要求,才能通过App Store Connect和应用的审查。因此,你必须通过构建标志明确启用所需的类别,其他内容将不包括在框架中。请仔细阅读安装说明。
ISHPermissionKit验证您的应用Info.plist
文件中提供了所需的用途描述。如果设置了DEBUG
预处理器宏,它将断言并解释需要添加哪些密钥。每个权限类别的要求在其他头文件ISHPermissionCategory.h
中的文档中有说明。
与其他库不同,ISHPermissionKit允许您展示自定义视图控制器,按顺序请求多个权限,通过子类提供统一的API,并且与iOS 10兼容。
推荐阅读: 正确请求用户的iOS权限方法
路线图
缺少的功能
- 设备重置时正确重置状态
- 权限变更时的监控和NSNotifications
请为缺少的权限提交问题。
如何使用
示例应用
为了演示使用ISHPermissionKit所需的全部步骤,该示例应用有一个独立的仓库。
该示例应用使用动态链接框架。
安装
构建标志
ISHPermissionKit 的变体将仅包含您实际需要的权限类别。我们使用预处理器宏来确保不编译任何未使用的代码,以防止意外遭到 App Store 拒绝,因为某些隐私指南适用于所有包含用于访问用户数据代码的应用,无论这些代码是否在您的应用中被调用。如何启用所需类别取决于您如何安装 ISHPermissionKit(见下文)。
静态库
将此 Xcode 项目作为您的应用的子项目添加。然后,将您的应用目标链接到静态库(《ISHPermissionKitLib.a》)。您还需要将静态库添加为目标依赖项。这两个设置都可以在您的应用目标中找到《构建阶段》。
您必须手动提供构建配置。
使用 #import <ISHPermissionKit/ISHPermissionKit.h>
导入所有公共头文件。如果您担心应用的启动时间,请推荐使用静态库版本,因为大量的动态库可能会增加启动时间(请参阅 WWDC 2016 会话 406)。
动态链接框架
将此 Xcode 项目作为您的应用的子项目添加。然后,将框架(《ISHPermissionKit.framework》)添加到应用的嵌入二进制文件(在您的应用目标设置中的《通用》选项卡上)。在《构建阶段》选项卡中,确认框架已添加到《目标依赖关系》和《链接库》阶段,并且已创建了一个新的《嵌入框架》阶段。
您必须手动提供构建配置。
您可以使用 Carthage 来获取和构建框架。您仍需手动提供构建配置。
框架可以用作模块,因此您可以使用 @import ISHPermissionKit;
导入所有公共头文件。有关模块的进一步阅读,请访问 Clang 文档
提供构建配置
在构建静态库或动态库时,ISHPermissionKit 将在其根目录的同一目录中(不是在根目录内)以及再往上一层寻找名为 ISHPermissionKitAppConfiguration.xcconfig
的文件。这两个位置的配置文件都允许您设置用于编译框架的预处理器标志。
我们强烈建议您从该仓库中的模板配置文件开始,即 ISHPermissionKitAppConfiguration.xcconfig
。它包含了所有支持标志的列表,您可以通过注释或取消注释相应的行轻松指定所需的特性。
您将需要使用相同的配置文件来构建您的应用,否则将无法访问特定类别的符号。在您的项目设置中,您可以为目标选择配置文件。
如果您已经使用配置文件,您可以选择一个并将其包含在内。确保在设置预处理器宏时始终使用 $(inherited)
。
必需的框架
ISHPermissionKit 使用系统框架来完成其任务。除非您已禁用应用目标的构建设置中的 "启用模块"(CLANG_ENABLE_MODULES
)和 "自动链接框架"(CLANG_MODULES_AUTOLINK
),否则大部分框架将自动链接。
不幸的是,一些框架默认不会进行弱链接,这可能导致在不支持相应框架的旧系统上启动时您的应用崩溃。这些框架必须显式地链接到您的应用,并设置为 "可选"。您可以将 rdar://28008958(https://openradar.appspot.com/search?query=28008958)相应的信息复制过来。
目前,这适用于 Speech 框架,并且仅在您启用语音权限类别时。
Cocoa Pods
您可以使用 CocoaPods 将 ISHPermissionKit 作为静态库或动态库进行安装。每个权限类别需要一个单独(子)pod。以下示例 Podfile 包含了所有可用的 pod - 您应该只选择您在应用中实际使用的那些。
target 'MyApp' do
use_frameworks! // remove this line if you want to link your pods statically
pod 'ISHPermissionKit/Motion'
pod 'ISHPermissionKit/Health'
pod 'ISHPermissionKit/Location'
pod 'ISHPermissionKit/Microphone'
pod 'ISHPermissionKit/PhotoLibrary'
pod 'ISHPermissionKit/Camera'
pod 'ISHPermissionKit/Notifications'
pod 'ISHPermissionKit/SocialAccounts'
pod 'ISHPermissionKit/Contacts'
pod 'ISHPermissionKit/Calendar'
pod 'ISHPermissionKit/Reminders'
pod 'ISHPermissionKit/Siri'
pod 'ISHPermissionKit/Speech'
pod 'ISHPermissionKit/MusicLibrary'
end
当您使用 CocoaPods 时,不需要手动提供构建配置,并且也可以忽略 必需的框架 部分。
有关如何开始使用 CocoaPods 的详细信息,请参阅官方网站。
ISHPermissionsViewController
您可以请求单个类别或一系列类别的权限。以下示例展示了在需要时如何为Activity
和LocationWhenInUse
权限使用ISHPermissionsViewController
。
NSArray *permissions = @[
@(ISHPermissionCategoryLocationWhenInUse),
@(ISHPermissionCategoryActivity)
];
ISHPermissionsViewController *vc = [ISHPermissionsViewController permissionsViewControllerWithCategories:permissions dataSource:self];
if (vc) {
UIViewController *presentingVC = [self.window rootViewController];
[presentingVC presentViewController:vc
animated:YES
completion:nil];
}
指定的构造函数在以下任何一种情况下都会返回nil
,即没有任何类别允许用户提示(要么是用户已经授权或拒绝,不愿意再次询问,或者在设备上该功能根本不支持)。
您可以设置completionBlock
或delegate
(两者都是可选的),当ISHPermissionsViewController
遍历所有类别后将被通知。如果您没有设置代理,视图控制器将简单地在完成后关闭,如果设置,将调用完成块。如果您设置了代理,代理负责关闭视图控制器。
dataSource
是必需的,并且必须为每个请求的ISHPermissionCategory
提供一个ISHPermissionRequestViewController
实例。
ISHPermissionRequestViewController
提供了用于提示用户的权限、询问稍后和不再询问的IBAction
。但是它不提供任何按钮或UI。您子类可以创建一个带有文本、图像和按钮等的视图,更详细地解释为什么您的应用程序需要某个权限。子类应该包含至少触发上述操作之一(请参阅标题以查看它们的签名)的按钮。一个取消按钮应调用changePermissionStateToAskAgainFromSender:
。如果您的子类重写了这些三个操作中的任何一个,您必须调用super
。
ISHPermissionRequest
ISHPermissionRequest
可用于确定权限类别的当前状态。它还可以用于在ISHPermissionsViewController
外部触发请求权限的用户提示。
您必须使用额外的(...+All.h
)方法+requestForCategory:
为给定的权限类别创建适当的请求。
以下是如何检查访问麦克风的权限
ISHPermissionRequest *r = [ISHPermissionRequest requestForCategory:ISHPermissionCategoryMicrophone];
BOOL granted = ([r permissionState] == ISHPermissionStateAuthorized);
针对本地通知的相同示例
ISHPermissionRequest *r = [ISHPermissionRequest requestForCategory:ISHPermissionCategoryNotificationLocal];
BOOL granted = ([r permissionState] == ISHPermissionStateAuthorized);
如何贡献
欢迎贡献。查看路线图和开放问题。添加对更多权限类型的支持可能是最有回报的,以下是如何入门的一些提示。
添加对新权限的支持
您需要创建一个新的 ISHPermissionRequest
子类,并添加一个 ISHPermissionCategory
(确保使用显式值,因为这些值可能被持久保存)。不要更改现有值。最后,在 ISHPermissionRequest+All
中连接它,通过在 +requestForCategory:
中返回您的新子类来实现。
子类必须至少实现两个方法
- (ISHPermissionState)permissionState
- (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletionBlock)completion
这些方法实际上做什么取决于系统API提供的机制。理想情况下,permissionState
应首先检查系统授权状态,并返回合适的内部枚举值从 ISHPermissionState
。如果系统状态不可用或类似于 kCLAuthorizationStatusNotDetermined
,则此方法应返回 internalPermissionState
。您应尽量避免使用 internalPermissionState
,尽可能将系统提供的状态映射到 ISHPermissionState
。
在请求权限状态时,您应仅在无法轻松从系统中检索状态(例如与指定的协处理器进行活动监控时)的情况下,将结果存储在 internalPermissionState
中。
在添加新权限之前,您必须引入一个新的构建标志,并确保库在有和没有它的情况下都能编译。请相应地更新此文档,将新的构建标志添加到模板配置文件 (ISHPermissionKitAppConfiguration.xcconfig
) 中,并创建一个新的CocoaPods subspec。
归属
ISHPermissionKit 图标由 Jason Grube (CC BY 3.0) 设计于 Noun Project
由 iosphere 的更多开源项目
ISHHoverBar
- 用于替换浮动的 UIToolBar,如iOS 10地图应用程序中所看到的,支持垂直和水平方向
ISHPullUp
- 垂直分割视图控制器,如iOS 10地图应用程序中看到的拉起手势
使用ISHPermissionKit的应用程序 路径 · 户外GPS日志簿 SumUp – 接受EMV卡支付 瑞士雪情报告
如果你的应用程序使用了ISHPermissionKit,请告知我们,我们将它在此处列出。