iOS隐私权限获取和检测

GitHub:ECAuthorizationTools

该工具类主要是为了方便大家获取设备权限和检查对应的权限,目前支持iOS7 - iOS10所有设置中的隐私权限获取和检测。具体每一个隐私的权限获取和检测都在工具类ECAuthorizationTools.h中有详细的逻辑思路。DemoViewController.m中也有详细的使用工具类方式。如果有什么不清楚的可以给我留言解决或者在git上issues我。

点击前往GitHub下载项目


更新 & bug fix
20170731 bug修复:iOS7获取相册权限不弹框
// 当某些情况下,ALAuthorizationStatus 为 ALAuthorizationStatusNotDetermined的时候,
// 无法弹出系统首次使用的收取alertView,系统设置中也没有相册的设置,此时将无法使用,
// 所以做以下操作,弹出系统首次使用的授权alertView
__block BOOL isShow = YES;
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if (isShow) {
        [self executeCallBack:accessStatusCallBack accessStatus:ECAuthorizationStatus_Authorized type:ECPrivacyType_Photos];
        isShow = NO;
    }
} failureBlock:^(NSError *error) {
    [self executeCallBack:accessStatusCallBack accessStatus:ECAuthorizationStatus_Denied type:ECPrivacyType_Photos];
}];


Abstract 概要

Features & Requirements 特性 & 要求

  • 支持iOS7+
  • ARC
目前支持的隐私类型(顺序参照:iphone设置-隐私):
typedef NS_ENUM(NSUInteger, ECPrivacyType){
    ECPrivacyType_None                  = 0,
    ECPrivacyType_LocationServices      = 1,    // 定位服务
    ECPrivacyType_Contacts              = 2,    // 通讯录
    ECPrivacyType_Calendars             = 3,    // 日历
    ECPrivacyType_Reminders             = 4,    // 提醒事项
    ECPrivacyType_Photos                = 5,    // 照片
    ECPrivacyType_BluetoothSharing      = 6,    // 蓝牙共享
    ECPrivacyType_Microphone            = 7,    // 麦克风
    ECPrivacyType_SpeechRecognition     = 8,    // 语音识别 >= iOS10
    ECPrivacyType_Camera                = 9,    // 相机
    ECPrivacyType_Health                = 10,   // 健康 >= iOS8.0
    ECPrivacyType_HomeKit               = 11,   // 家庭 >= iOS8.0
    ECPrivacyType_MediaAndAppleMusic    = 12,   // 媒体与Apple Music >= iOS9.3
    ECPrivacyType_MotionAndFitness      = 13,   // 运动与健身
};
参照下图:
image
Tips:在iOS10下记得在plist文件下添加对应的参数。
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要获取蓝牙权限</string>
<key>NSCalendarsUsageDescription</key>
<string>日历</string>
<key>NSCameraUsageDescription</key>
<string>需要获取您的摄像头信息</string>
<key>NSContactsUsageDescription</key>
<string>需要获取您的通讯录权限</string>
<key>NSHealthShareUsageDescription</key>
<string>健康分享权限</string>
<key>NSHealthUpdateUsageDescription</key>
<string>健康数据更新权限</string>
<key>NSHomeKitUsageDescription</key>
<string>HomeKit权限</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>一直定位权限</string>
<key>NSLocationUsageDescription</key>
<string>定位权限</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>使用app期间定位权限</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要获取您的麦克风权限</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要获取您的相册信息</string>
<key>NSRemindersUsageDescription</key>
<string>提醒事项</string>
<key>NSSiriUsageDescription</key>
<string>需要获取您的Siri权限</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>语音识别权限</string>
<key>NSVideoSubscriberAccountUsageDescription</key>
<string>AppleTV权限</string>
<key>NSAppleMusicUsageDescription</key>
<string>Add tracks to your music library.</string>
<key>NSMotionUsageDescription</key>
<string>运动与健身权限</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要获取您的相册信息</string>


Content 正文

Installation 安装

  • 将ECAuthorizationTools文件夹直接拖入项目中即可。
  • 在需要做权限检测或者获取的类中导入ECAuthorizationTools.h
#import "ECAuthorizationTools.h"

Explain 说明

ps:该工具类中注释也比较完整,并且有完整的使用Dmeo。这里就简单解释说明一下代码以及一些容易踩的坑。
ECAuthorizationStatus 权限状态,参考PHAuthorizationStatus等。
typedef NS_ENUM(NSUInteger, ECAuthorizationStatus){
    ECAuthorizationStatus_NotDetermined  = 0, // 用户从未进行过授权等处理,首次访问相应内容会提示用户进行授权
    ECAuthorizationStatus_Authorized     = 1, // 已授权
    ECAuthorizationStatus_Denied         = 2, // 拒绝
    ECAuthorizationStatus_Restricted     = 3, // 应用没有相关权限,且当前用户无法改变这个权限,比如:家长控制
    ECAuthorizationStatus_NotSupport     = 4, // 硬件等不支持
};
ECLocationAuthorizationStatus 定位权限状态,参考CLAuthorizationStatus
typedef NS_ENUM(NSUInteger, ECLocationAuthorizationStatus){
    ECLocationAuthorizationStatus_NotDetermined         = 0, // 用户从未进行过授权等处理,首次访问相应内容会提示用户进行授权
    ECLocationAuthorizationStatus_Authorized            = 1, // 一直允许获取定位 ps:< iOS8用
    ECLocationAuthorizationStatus_Denied                = 2, // 拒绝
    ECLocationAuthorizationStatus_Restricted            = 3, // 应用没有相关权限,且当前用户无法改变这个权限,比如:家长控制
    ECLocationAuthorizationStatus_NotSupport            = 4, // 硬件等不支持
    ECLocationAuthorizationStatus_AuthorizedAlways      = 5, // 一直允许获取定位
    ECLocationAuthorizationStatus_AuthorizedWhenInUse   = 6, // 在使用时允许获取定位
};
ECCBManagerState 蓝牙状态,参考 CBManagerState
typedef NS_ENUM(NSUInteger, ECCBManagerStatus){
    ECCBManagerStatusUnknown         = 0,        // 未知状态
    ECCBManagerStatusResetting       = 1,        // 正在重置,与系统服务暂时丢失
    ECCBManagerStatusUnsupported     = 2,        // 不支持蓝牙
    ECCBManagerStatusUnauthorized    = 3,        // 未授权
    ECCBManagerStatusPoweredOff      = 4,        // 关闭
    ECCBManagerStatusPoweredOn       = 5,        // 开启并可用
};

Usage 使用方式

Main Enter Method 主要的一些入口方法

ps:下述方法都有中文注释,就不再做过多解释,如果有疑问的可以参考Dmeo。
检查和请求对应类型的权限
/**
 Check and request access for * type 
 检查和请求对应类型的权限

 @param type ECPrivacyType
 @param accessStatusCallBack AccessForTypeResultBlock
 */
+ (void)checkAndRequestAccessForType:(ECPrivacyType)type accessStatus:(AccessForTypeResultBlock)accessStatusCallBack;
检查和请求定位服务的权限
/**
 Check and request access for LocationServices
 检查和请求定位服务的权限
 
 @param accessStatusCallBack accessStatus
 */
- (void)checkAndRequestAccessForLocationServicesWithAccessStatus:(AccessForLocationResultBlock)accessStatusCallBack;
检查和请求蓝牙共享服务的权限
/**
 Check and request access for BluetoothSharing
 检查和请求蓝牙共享服务的权限

 @param accessStatusCallBack accessStatus
 */
- (void)checkAndRequestAccessForBluetoothSharingWithAccessStatus:(AccessForBluetoothResultBlock)accessStatusCallBack;
检查和请求健康的权限
/**
 Check and request access for Health
 检查和请求健康的权限
 
 @param accessStatusCallBack accessStatus
 */
- (void)checkAndRequestAccessForHealthWtihAccessStatus:(AccessForTypeResultBlock)accessStatusCallBack;
访问家庭权限是需要回调指定的的HMHomeManagerDelegate协议,并且回调之后的后续逻辑处理比较麻烦,建议使用者可以直接调用系统的获取权限方法。在回调协议中做处理。这里做出简单Demo以方便参考。注意:HMError.h类
/**
 Check And Request Access For Home
  Tip:访问家庭权限是需要回调指定的的HMHomeManagerDelegate协议,并且回调之后的后续逻辑处理比较麻烦,建议使用者可以直接调用系统的获取权限方法。在回调协议中做处理。这里做出简单Demo以方便参考。注意:HMError.h类

 @param accessForHomeCallBack AccessForHomeResultBlock
 */
- (void)checkAndRequestAccessForHome:(AccessForHomeResultBlock)accessForHomeCallBack;
同访问Home一样,运动与健身这里也只给出简单demo方便参考,可以直接copy代码到自己的项目中直接用
/**
 Check And Request Access For Motion And Fitness
 同访问Home一样,运动与健身这里也只给出简单demo方便参考,可以直接copy代码到自己的项目中直接用

 */
- (void)checkAndRequestAccessForMotionAndFitness;

Example 使用范例

获取相册访问权限
[ECAuthorizationTools checkAndRequestAccessForType:ECPrivacyType_Photos accessStatus:^(ECAuthorizationStatus status, ECPrivacyType type) {
    // status 即为权限状态,状态类型参考:ECAuthorizationStatus
}];
访问定位权限
ECAuthorizationTools *tools = [[ECAuthorizationTools alloc] init];
[tools checkAndRequestAccessForLocationServicesWithAccessStatus:^(ECLocationAuthorizationStatus status) {
    // status 类型参考 ECLocationAuthorizationStatus
}];
Tips:访问定位、蓝牙、健康、家庭、运动等权限的时候需要用对象方法去获取,其余可以采用类方法传入对应类型枚举即可获取。为什么呢?因为上述几种类型权限获取都需要响应对应的代理协议,并且需要在类中用到其对象,所以采用对象方法获取权限更便捷方便。可以参考Demo中的DemoViewController.m文件,里面有详细的使用方法可供参考。
再附上一张Demo截图:
image

More 更多

点击前往GitHub下载项目

Info

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容