JLAuthorizationManager
中文文档请参看这里
目前,该库支持 Objective-C 版本和 Swift 版本。
特性
- 完全覆盖,目前支持访问 照片、相机、蜂窝网络、麦克风、日历、提醒、通知、位置、苹果音乐、语音识别、Siri、蓝牙 等等。
- 易于使用,统一的接口和分离的单个权限。避免提交 App Store 被拒绝的问题。
- 异步获取授权权限,回调始终在主线程。
- 多种使用方式和灵活使用。
入门
先决条件
- 使用 JLAuthorizationManager 的应用程序可以针对 iOS 8.0 或更高版本。
- 需要 Xcode 8.0 或更高版本。
安装
- 通过 Cocoapods:
1. 安装Cocoapods;
2.运行pod repo update
命令,使 CocoaPods 了解可用的最新 JLAuthorizationManager 版本。
3.由于 Podfile 的目标,按照以下方式添加相应的 pod 命令,然后运行pod install
。最后,使用 CocoaPods 生成的 .xcworkspace 文件来处理您的项目。
// pod 'JLAuthorizationManager/All' is equivatent to
pod 'JLAuthorizationManager'
Or
pod 'JLAuthorizationManager/AuthorizationManager'
Or
pod 'JLAuthorizationManager/Camera'
Or
pod 'JLAuthorizationManager/Microphone'
...
- 手动方式
1.首先,从 https://github.com/123sunxiaolin/JLAuthorizationManager.git克隆项目;
2.然后,找到文档路径JLAuthorizationManager/Classes
,以及您需要的权限文件。请注意,在使用之前,必须将 Base 文件夹添加到您的项目中。
教程
JLAuthorizationManager 的使用:
- 1.通过
+ (JLAuthorizationManager *)defaultManager;
单例方法使用。 - 2.添加头文件
#import "JLAuthorizationManager.h"
- 3.使用统一接口:
// Geneeral
- (void)JL_requestAuthorizationWithAuthorizationType:(JLAuthorizationType)authorizationType
authorizedHandler:(void(^)())authorizedHandler
unAuthorizedHandler:(void(^)())unAuthorizedHandler;
// Health Data
- (void)JL_requestHealthAuthorizationWithShareTypes:(NSSet*)typesToShare
readTypes:(NSSet*)typesToRead
authorizedHandler:(JLGeneralAuthorizationCompletion)authorizedHandler
unAuthorizedHandler:(JLGeneralAuthorizationCompletion)unAuthorizedHandler;
// Social Account( deprecated at 8.0 or later)
- (void)JL_requestAccountAuthorizationWithAuthorizationType:(JLAuthorizationType)authorizationType
options:(NSDictionary *)options
authorizedHandler:(JLGeneralAuthorizationCompletion)authorizedHandler
unAuthorizedHandler:(JLGeneralAuthorizationCompletion)unAuthorizedHandler
errorHandler:(void(^)(NSError *error))errorHandler;
单独权限的使用 - JLxxxPermission
-
- 每个单独的权限类都继承自基类 JLBasePermisssion,实现统一接口协议 JLAuthorizationProtocol
@protocol JLAuthorizationProtocol <NSObject>
/**
return current request authorization type.
*/
@property (nonatomic, assign, readonly) JLAuthorizationType type;
/**
return current authorization status.
In most cases, suggest use 'requestAuthorizationWithCompletion:completion' method.
*/
- (JLAuthorizationStatus)authorizationStatus;
/**
Request authorization and return authorization status in main thread.
*/
- (void)requestAuthorizationWithCompletion:(JLAuthorizationCompletion)completion;
@optional
/**
Wheather add specific permission description key needed.
*/
- (BOOL)hasSpecificPermissionKeyFromInfoPlist;
@end
- 基本使用(以请求 拍照 权限为例)
JLPhotosPermission *permission = [JLPhotosPermission instance];
NSLog(@"current authoriazation status:%@", [self authorizationWithStatus:permission.authorizationStatus]);
NSLog(@"%@ add permission plist description key", permission.hasSpecificPermissionKeyFromInfoPlist ? @"Yes" : @"NO");
[permission requestAuthorizationWithCompletion:^(BOOL granted) {
NSLog(@"%@ : %@", [self titleWithType:permission.type], granted ? @"authorized" : @"unauthorized");
}];
- 通过单例方法
sharedInstance
进行调用,请求 位置 和 蓝牙 权限时。以下以请求 位置 权限为例
JLLocationAlwaysPermission *permission = [JLLocationAlwaysPermission sharedInstance];
NSLog(@"current authoriazation status:%@", [self authorizationWithStatus:permission.authorizationStatus]);
NSLog(@"%@ add permission plist description key", permission.hasSpecificPermissionKeyFromInfoPlist ? @"Yes" : @"No");
[permission requestAuthorizationWithCompletion:^(BOOL granted) {
NSLog(@"%@ : %@", [self titleWithType:permission.type], granted ? @"authorized" : @"unauthorized");
}];
- 健康数据请求:
HKObjectType *type = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning];
HKObjectType *type1 = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
NSSet *shareSet = [NSSet setWithObjects:type, type1, nil];
JLHealthPermission *permission = [[JLHealthPermission alloc] initWithShareType:shareSet readTypes:shareSet];
NSLog(@"current authoriazation status:%@", [self authorizationWithStatus:permission.authorizationStatus]);
NSLog(@"%@ add permission plist description key", permission.hasSpecificPermissionKeyFromInfoPlist ? @"Yes" : @"NO");
[permission requestAuthorizationWithCompletion:^(BOOL granted) {
NSLog(@"%@ : %@", [self titleWithType:permission.type], granted ? @"authorized" : @"unauthorized");
}];
有关更多信息,请参阅 DEMO.
技巧与窍门
- 不要忘记在
info.plist
中添加授权描述。 - 如果想要使用
HealthKit
或Siri
,请打开Capabilities
中的开关,然后系统会自动创建xx..entitlements
文件。 - 如果项目未提交到App Store,您可以使用统一权限管理文件
JLAuthorizationManager
;如果需要提交项目到App Store,您需要根据业务需求添加相应的权限请求文件,否则,由于添加了无用的权限,App Store可能会被拒绝。
更新说明
- v2.1.0 (2019-5-21):修复API可用版本错误。
- v2.0.2 (2019-2-07):更新podSpec文件。
- v2.0.0 (2019-2-07):将所有权限拆分为单个权限文件,以避免在提交到AppStore时失败,并提供多种请求方式。
- v1.1.0 (2019-1-17):优化请求方法,并添加通知权限。
- v1.0.0 (2017-04-13):为开发者提供权限的简单使用方法,所有请求方式都唯一地封装在类图-JLAuthorizationManager中。
问题和改进
- 如果在使用库时发现一些错误或可以改进的地方,您可以直接开启一个问题。如果您有一个更好的实现,欢迎发起拉取请求。
讨论和学习
- iOS QQ群:709148214
- 官方公众号(微信):猿视角(iOSDevSkills)
- 微信:401788217
- 简书
许可
JLAuthorizationManager受MIT许可证的约束。有关更多信息,请参阅LICENSE文件。