JLAuthorizationManager 2.1.1

JLAuthorizationManager 2.1.1

Jack_lin 维护。



JLAuthorizationManager

Build Status Pod Version Pod Platform System Version Pod License

中文文档请参看这里

Swift 版本

🔑 JLAuthorizationManager 是一个简单、轻量级、易于使用、功能完整的线程安全权限库,供 iOS 开发者使用。

目前,该库支持 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'
...

教程

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

    1. 每个单独的权限类都继承自基类 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 中添加授权描述。
  • 如果想要使用 HealthKitSiri,请打开 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文件。