ISHPermissionKit 2.1.3

ISHPermissionKit 2.1.3

测试已测试
Lang语言 Obj-CObjective C
许可证 NOASSERTION
发布上次发布2021年1月

Felix LamourouxSebastian Hagedorn 维护。




  • Felix Lamouroux

ISHPermissionKit

Travis Build Status  Version  Carthage compatible

ISHPermissionKit 提供了一种礼貌且统一的方式来请求 iOS 上的权限。它还提供 UI 来在向用户展示系统权限对话框之前解释权限要求。这允许开发者在系统对话框出现之前进行延迟。该框架不提供任何实际的用户界面,让开发者和设计师负责创建视图。

虽然您可以使用 ISHPermissionKit 同时请求用户多个类别的权限,并且脱开上下文,但您应该只在应用程序需要时请求权限。但是,可能在同时需要多个权限的情况下,例如开始记录位置和运动数据。

此框架还提供了明确请求用户权限的方式,而系统 API 只提供隐式方法。

支持的权限类别

  • 日历:事件和提醒
  • 联系信息
  • 位置:始终和当使用
  • 动作:活动数据(计步等)
  • HealthKit
  • 话筒
  • 音乐库
  • 通知:本地和远程
  • 照片:图库和相机
  • 社交:Facebook、Twitter、新浪微博、腾讯微博
  • Siri
  • 语音识别

该库使用 iOS 11 SDK 或更高版本进行编译,并部署回 iOS 9。对不支持版本的部署目标之后添加的权限类别将跳过。

所有权限类别都与敏感用户信息相关。如果你的应用二进制文件包含访问此信息的代码,则必须遵守特殊的审查指南和其他要求,才能通过App Store Connect和应用的审查。因此,你必须通过构建标志明确启用所需的类别,其他内容将不包括在框架中。请仔细阅读安装说明

ISHPermissionKit验证您的应用Info.plist文件中提供了所需的用途描述。如果设置了DEBUG预处理器宏,它将断言并解释需要添加哪些密钥。每个权限类别的要求在其他头文件ISHPermissionCategory.h中的文档中有说明。

Sample App Demo

与其他库不同,ISHPermissionKit允许您展示自定义视图控制器,按顺序请求多个权限,通过子类提供统一的API,并且与iOS 10兼容。

推荐阅读: 正确请求用户的iOS权限方法

路线图

缺少的功能

  1. 设备重置时正确重置状态
  2. 权限变更时的监控和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。它包含了所有支持标志的列表,您可以通过注释或取消注释相应的行轻松指定所需的特性。

您将需要使用相同的配置文件来构建您的应用,否则将无法访问特定类别的符号。在您的项目设置中,您可以为目标选择配置文件。

Setting a configuration file

如果您已经使用配置文件,您可以选择一个并将其包含在内。确保在设置预处理器宏时始终使用 $(inherited)

必需的框架

ISHPermissionKit 使用系统框架来完成其任务。除非您已禁用应用目标的构建设置中的 "启用模块"(CLANG_ENABLE_MODULES)和 "自动链接框架"(CLANG_MODULES_AUTOLINK),否则大部分框架将自动链接。

不幸的是,一些框架默认不会进行弱链接,这可能导致在不支持相应框架的旧系统上启动时您的应用崩溃。这些框架必须显式地链接到您的应用,并设置为 "可选"。您可以将 rdar://28008958(https://openradar.appspot.com/search?query=28008958)相应的信息复制过来。

Weak-linking a framework in Xcode

目前,这适用于 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

您可以请求单个类别或一系列类别的权限。以下示例展示了在需要时如何为ActivityLocationWhenInUse权限使用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,即没有任何类别允许用户提示(要么是用户已经授权或拒绝,不愿意再次询问,或者在设备上该功能根本不支持)。

您可以设置completionBlockdelegate(两者都是可选的),当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: 中返回您的新子类来实现。

子类必须至少实现两个方法

  1. - (ISHPermissionState)permissionState
  2. - (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,请告知我们,我们将它在此处列出。