iOS隐私权限获取和检测 ECPrivacyCheckTools 2.0 版本

ECPrivacyCheckTools

ECPrivacyCheckTools 2.0.0 版本 20200608

更新 & bug fix

  1. ECPrivacyCheckTools 2.0.0版本

    • 去掉对 iOS 7.0 版本支持
    • 针对 iOS 13.0 新 API 优化
    • 隐私权限??槎懒⑽募?,可以单独引入使用,无需引入全部工具类
    • 常见常用隐私权限检测集合类,可以直接导入项目中使用。包含:定位服务、照片、相机、通讯录
    • 其他bug fix
  2. 20171211 bug修复:iOS11获取相册权限需要在plist中增加NSPhotoLibraryAddUsageDescription字段

<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要获取您的相册信息</string>
  1. 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 概要

该工具类主要是为了方便大家获取设备系统权限和检查对应的权限。目前2.0版本兼容 iOS 8.0 及其以上版本。具体每一项隐私权限的获取和检测在源码中有非常详细的逻辑代码,使用方式在 ECPrivacyCheckTools_Example 工程中亦有相似介绍。如果有什么不清楚的可以在git上issues我或者微信联系我。

Features & Requirements 特性 & 要求

  • 支持 iOS 8.0 +
  • ARC
  • 最新版本:2.0.0

目前支持的隐私类型(顺序参照:iPhone - 设置 - 隐私):

LocationServices       定位服务
Contacts               通讯录
Calendars              日历
Reminders              提醒事项
Photos                 照片
Bluetooth              蓝牙
Microphone             麦克风
SpeechRecognition      语音识别 >= iOS 10.0
Camera                 相机
Health                 健康 >= iOS 8.0
HomeKit                HomeKit >= iOS 8.0
MediaAndAppleMusic     媒体与Apple Music >= iOS9.3
FilesAndFolders        文件和文件夹
MotionAndFitness       运动与健身
参照下图
01.PNG
plist文件下添加对应的参数
<key>NSAppleMusicUsageDescription</key>
    <string>Add tracks to your music library.</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>若不允许,你将无法使用联机服务</string>
    <key>NSBluetoothAlwaysUsageDescription</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>若不允许,你将无法使用智能家居服务</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>我们需要获取你的定位权限以供完成查找附近商户功能</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>我们需要获取你的定位权限以供完成查找附近商户功能</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>我们需要获取你的麦克风权限以供完成语音搜索功能</string>
    <key>NSMotionUsageDescription</key>
    <string>我们需要获取你的运动权限以完成运动挑战赛功能</string>
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>我们需要获取你的相册权限以完成图片上传和识别功能</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>我们需要获取你的相册权限以完成图片上传和识别功能</string>
    <key>NSRemindersUsageDescription</key>
    <string>我们需要获取你的提醒事项权限以供添加提醒事项</string>
    <key>NSSiriUsageDescription</key>
    <string>我们需要获取你的Siri权限以方便完成Siri建议功能</string>
    <key>NSSpeechRecognitionUsageDescription</key>
    <string>我们需要获取你的语音识别功能已完成键盘语音识别输入功能</string>
    <key>NSVideoSubscriberAccountUsageDescription</key>
    <string>我们需要获取你的TV权限</string>

Content 正文

Uage 使用

  • 使用 ECPrivacyCheckGatherTool 集合:包含:定位服务、照片、相机、通讯录
    • 将 ECPrivacyCheckTools 文件夹下 ECPrivacyCheckGatherTool.h 和 ECPrivacyCheckGatherTool.m 文件引入工程
    • 调用对应 API
  • 单独使用任一权限检测
    • 将 ECPrivacyCheckTools/Core 文件下对应权限的 .h 和 .m 文件引入工程
    • 调用对应API

Code Example

// MARK: - 定位服务 LocationServices
/** 定位授权状态
 *

 *  ECLBSAuthorizationStatusUnable:不支持或不可用
 *  ECLBSAuthorizationStatusNotDetermined:用户从未进行过授权等处理,首次访问相应内容会提示用户进行授权
 *  ECLBSAuthorizationStatusRestricted:应用没有相关权限,且当前用户无法改变这个权限,比如:家长控制
 *  ECLBSAuthorizationStatusDenied:用户拒绝
 *  ECLBSAuthorizationStatusAuthorizedAlways:一直允许获取定位
 *  ECLBSAuthorizationStatusAuthorizedWhenInUse:在使用时允许定位
 *  ECLBSAuthorizationStatusAuthorized:已废弃,在iOS2.0~8.0使用,> iOS 8.0 请使用 ECLBSAuthorizationStatusAuthorizedAlways: 一直允许获取定位
    */
    typedef NS_ENUM(NSInteger, ECLBSAuthorizationStatus) {
     ECLBSAuthorizationStatusUnable = -1,
     ECLBSAuthorizationStatusNotDetermined = 0,
     ECLBSAuthorizationStatusRestricted,
     ECLBSAuthorizationStatusDenied,
     ECLBSAuthorizationStatusAuthorizedAlways,
     ECLBSAuthorizationStatusAuthorizedWhenInUse,
     ECLBSAuthorizationStatusAuthorized API_DEPRECATED("Use ECLBSAuthorizationStatusAuthorizedAlways", ios(2.0, 8.0)) = ECLBSAuthorizationStatusAuthorizedAlways
    };

/// 检查定位权限状态:仅检查权限,不主动请求权限

+ (ECLBSAuthorizationStatus)locationAuthorizationStatus;

/// 检查定位权限状态:仅检查权限,不主动请求权限

- (ECLBSAuthorizationStatus)locationAuthorizationStatus;

/// 请求定位权限
/// @param completionHandler completionHandler

- (void)requestLocationAuthorizationWithCompletionHandler:(void(^)(ECLBSAuthorizationStatus status))completionHandler;

// MARK: - 照片 Photos
/** 授权状态

 *  ECAuthorizationStatusUnable:不支持或不可用
 *  ECAuthorizationStatusNotDetermined:用户从未进行过授权等处理,首次访问相应内容会提示用户进行授权
 *  ECAuthorizationStatusRestricted:应用没有相关权限,且当前用户无法改变这个权限,比如:家长控制
 *  ECAuthorizationStatusDenied:用户拒绝
 *  ECAuthorizationStatusAuthorized:已授权
    */
    typedef NS_ENUM(NSInteger, ECAuthorizationStatus) {
    ECAuthorizationStatusUnable = -1,
    ECAuthorizationStatusNotDetermined = 0,
    ECAuthorizationStatusRestricted,
    ECAuthorizationStatusDenied,
    ECAuthorizationStatusAuthorized
    };

/// 检查相册权限状态:仅检查权限,不主动请求权限

+ (ECAuthorizationStatus)photosAuthorizationStatus;

/// 检查相册权限状态:仅检查权限,不主动请求权限

- (ECAuthorizationStatus)photosAuthorizationStatus;

/// 请求相册权限
/// @param completionHandler completionHandler

+ (void)requestPhotosAuthorizationWithCompletionHandler:(void(^)(BOOL granted))completionHandler;

// MARK: - Bluetooth 蓝牙
/** 蓝牙权限状态
 *

 * ECCBAuthorizationStateUnknown:未知状态

 * ECCBAuthorizationStateResetting:正在重置,与系统服务暂时丢失

 * ECCBAuthorizationStateUnsupported:不支持蓝牙

 * ECCBAuthorizationStateUnauthorized:未授权

 * ECCBAuthorizationStatePoweredOff:关闭

 * ECCBAuthorizationStatePoweredOn:开启并可用
   */
   typedef NS_ENUM(NSInteger, ECCBAuthorizationState) {

   ECCBAuthorizationStateUnknown = 0,
   ECCBAuthorizationStateResetting,
   ECCBAuthorizationStateUnsupported,
   ECCBAuthorizationStateUnauthorized,
   ECCBAuthorizationStatePoweredOff,
   ECCBAuthorizationStatePoweredOn
   };

/// 获取蓝牙权限
/// @param completionHandler completionHandler

- (void)requestBluetoothAuthorizationWithCompletionHandler:(void(^)(ECCBAuthorizationState state))completionHandler;

// MARK: - 通讯录 Contacts
/** 授权状态

 *  ECAuthorizationStatusUnable:不支持或不可用
 *  ECAuthorizationStatusNotDetermined:用户从未进行过授权等处理,首次访问相应内容会提示用户进行授权
 *  ECAuthorizationStatusRestricted:应用没有相关权限,且当前用户无法改变这个权限,比如:家长控制
 *  ECAuthorizationStatusDenied:用户拒绝
 *  ECAuthorizationStatusAuthorized:已授权
    */
    typedef NS_ENUM(NSInteger, ECAuthorizationStatus) {
    ECAuthorizationStatusUnable = -1,
    ECAuthorizationStatusNotDetermined = 0,
    ECAuthorizationStatusRestricted,
    ECAuthorizationStatusDenied,
    ECAuthorizationStatusAuthorized
    };

/// 检查通讯录权限状态:仅检查权限,不主动请求权限

+ (ECAuthorizationStatus)contactsAuthorizationStatus;

/// 检查通讯录权限状态:仅检查权限,不主动请求权限

- (ECAuthorizationStatus)contactsAuthorizationStatus;

/// 请求通讯录权限
/// @param completionHandler completionHandler

+ (void)requestContactsAuthorizationWithCompletionHandler:(void(^)(BOOL granted))completionHandler;

/// 请求通讯录权限
/// @param completionHandler completionHandler

- (void)requestContactsAuthorizationWithCompletionHandler:(void(^)(BOOL granted))completionHandler;
获取定位权限
- (void)checkLBS:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        ECLBSAuthorizationStatus status = [ECPrivacyCheckGatherTool locationAuthorizationStatus];
        ECAlertShow(@"定位权限状态:", [NSString stringWithFormat:@"%ld", (long)status], @"确定", ^{
        });
    } else {
        self.gatherTools = [[ECPrivacyCheckGatherTool alloc] init];
        [self.gatherTools requestLocationAuthorizationWithCompletionHandler:^(ECLBSAuthorizationStatus status) {
            if (status == ECLBSAuthorizationStatusAuthorizedAlways) {
                [ECAlert showConfirmAlertWithMessage:@"已获取持续定位权限" completion:nil];
            } else if (status == ECLBSAuthorizationStatusAuthorizedWhenInUse) {
                [ECAlert showConfirmAlertWithMessage:@"已获取使用APP期间定位权限" completion:nil];
            } else if ((status == ECLBSAuthorizationStatusRestricted) || (status == ECLBSAuthorizationStatusDenied)) {
                [ECAlert showConfirmAlertWithMessage:@"用户禁用该APP使用定位权限" completion:nil];
            } else {
                NSLog(@"ECLBSAuthorizationStatusNotDetermined,用户未决定");
            }
        }];
    }
}
照片权限
/// 请求相册权限
/// @param completionHandler completionHandler
- (void)requestPhotosAuthorizationWithCompletionHandler:(void(^)(BOOL granted))completionHandler;

- (void)checkPhotos:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        ECAuthorizationStatus status = [ECPrivacyCheckGatherTool photosAuthorizationStatus];
        ECAlertShow(@"照片权限状态:", [NSString stringWithFormat:@"%ld", (long)status], @"确定", ^{
        });
    } else {
        [ECPrivacyCheckGatherTool requestPhotosAuthorizationWithCompletionHandler:^(BOOL granted) {
            if (granted) {
                [ECAlert showConfirmAlertWithMessage:@"已获取照片权限" completion:nil];
            } else {
                [ECAlert showConfirmAlertWithMessage:@"用户禁用该APP使用照片权限" completion:nil];
            }
        }];
    }
}
通讯录权限
- (void)checkContact:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        ECAuthorizationStatus status = [ECPrivacyCheckGatherTool contactsAuthorizationStatus];
        ECAlertShow(@"通讯录权限状态:", [NSString stringWithFormat:@"%ld", (long)status], @"确定", ^{
        });
    } else {
        [ECPrivacyCheckGatherTool requestContactsAuthorizationWithCompletionHandler:^(BOOL granted) {
            if (granted) {
                [ECAlert showConfirmAlertWithMessage:@"已获取通讯录权限" completion:nil];
            } else {
                [ECAlert showConfirmAlertWithMessage:@"用户禁用该APP使用通讯录权限" completion:nil];
            }
        }];
    }
}
蓝牙权限
- (void)checkBluetooth:(NSInteger)buttonIndex {
    // 这里要用全局属性
    self.bluetoohTools = [[ECPrivacyCheckBluetooth alloc] init];
    
    [self.bluetoohTools requestBluetoothAuthorizationWithCompletionHandler:^(ECCBAuthorizationState state) {
        if (state == ECCBAuthorizationStatePoweredOn) {
            ECAlertShow(@"蓝牙状态", @"开启并可用", @"确定", nil);
        } else if (state == ECCBAuthorizationStatePoweredOff) {
            ECAlertShow(@"蓝牙状态", @"关闭", @"确定", nil);
        } else if (state == ECCBAuthorizationStateUnauthorized) {
            ECAlertShow(@"蓝牙状态", @"未授权", @"确定", nil);
        } else if (state == ECCBAuthorizationStateUnsupported) {
            ECAlertShow(@"蓝牙状态", @"不支持蓝牙", @"确定", nil);
        } else if (state == ECCBAuthorizationStateResetting) {
            ECAlertShow(@"蓝牙状态", @"正在重置,与系统服务暂时丢失", @"确定", nil);
        } else {
            // ECCBAuthorizationStateUnknown
            ECAlertShow(@"蓝牙状态", @"未知状态", @"确定", nil);
        }
    }];
}
代码中均有非常详细的中文注释,可以直接查看
再附一张Demo截图
02.PNG
工具类和Demo中已经给出了非常完整的获取权限和检测权限逻辑代码,除了可以直接导入工具类使用外,也可以直接Copy逻辑代码到自己的项目中使用。

Author

License

ECPrivacyCheckTools is available under the MIT license. See the LICENSE file for more info.

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