IOS 手机一些使用权限动态检测

该博客介绍了如何在iOS中动态检测和处理相机、相册、麦克风、定位、通讯录和日历的权限。提供了相关API的使用示例,帮助开发者确保应用在需要权限时能够正确引导用户授权。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#import <AVFoundation/AVFoundation.h>
#import <Photos/Photos.h>
#import <CoreLocation/CoreLocation.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>

#import <EventKit/EventKit.h>

/**相机权限*/

+ (void)checkCameraAuthorizationGrand:(void (^)(void))permissionGranted
                     withNoPermission:(void (^)(void))noPermission
{
    AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    switch (videoAuthStatus) {
        case AVAuthorizationStatusNotDetermined:
        {
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
                granted ? permissionGranted() : noPermission();
            }];
            break;
        }
        case AVAuthorizationStatusAuthorized:
        {
            permissionGranted();
            break;
        }
        case AVAuthorizationStatusRestricted:
            NSLog(@"不能完成授权,可能开启了访问限制");
            noPermission();
        case AVAuthorizationStatusDenied:{
            NSLog(@"请到设置授权访问相机");
            noPermission();
        }
            break;
        default:
            break;
    }
}

/**相册权限*/
+ (void)checkPhotoAlbumAuthorizationGrand:(void (^)(void))permissionGranted
                         withNoPermission:(void (^)(void))noPermission
{
    PHAuthorizationStatus photoAuthStatus = [PHPhotoLibrary authorizationStatus];
    switch (photoAuthStatus) {
        case PHAuthorizationStatusNotDetermined:
        {
            [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
                status == PHAuthorizationStatusAuthorized ? permissionGranted() : noPermission();
            }];
            break;
        }
        case PHAuthorizationStatusAuthorized:
        {
            permissionGranted();
            break;
        }
        case PHAuthorizationStatusRestricted:
            NSLog(@"不能完成授权,可能开启了访问限制");
            noPermission();
        case PHAuthorizationStatusDenied:{
            NSLog(@"请到设置授权访问相册");
            noPermission();
            break;
        }
        default:
            break;
            
    }
}

/**麦克风权限*/
+ (void)checkAudioAuthorizationGrand:(void (^)(void))permissionGranted
                    withNoPermission:(void (^)(void))noPermission
{
    AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
    switch (videoAuthStatus) {
        case AVAuthorizationStatusNotDetermined:
        {
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
                granted ? permissionGranted() : noPermission();
            }];
            break;
        }
        case AVAuthorizationStatusAuthorized:
        {
            permissionGranted();
            break;
        }
        case AVAuthorizationStatusRestricted:
            NSLog(@"不能完成授权,可能开启了访问限制");
            noPermission();
        case AVAuthorizationStatusDenied:{
            NSLog(@"请到设置授权访问麦克风");
            noPermission();
        }
            break;
        default:
            break;
    }
}

/**定位权限*/
+ (void)checkLocationServiceAuthorization:(void(^)(BOOL authorizationAllow))checkFinishBack
{
    if ([CLLocationManager locationServicesEnabled])
    {
        //隐私->定位 开启
        CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
        switch (status) {
            case kCLAuthorizationStatusNotDetermined:
                checkFinishBack(NO);
                break;
            case kCLAuthorizationStatusRestricted:
                checkFinishBack(NO);
                break;
            case kCLAuthorizationStatusDenied:
                NSLog(@"请在系统设置中开启定位服务(设置>隐私>定位服务>开启)");
                break;
            case kCLAuthorizationStatusAuthorizedAlways:
                checkFinishBack(YES);
                break;
            case kCLAuthorizationStatusAuthorizedWhenInUse:
                checkFinishBack(YES);
                break;
            default:
                break;
        }
    }else
    {
        NSLog(@"请在系统设置中开启定位服务(设置>隐私>定位服务>开启)");
    }

}

 

/**通讯录检测*/

+(void)checkAddressBookAuthorizationGrand:(void(^)(void))permissionGranted

withNoPermission:(void (^)(void))noPermission

{
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL,NULL);
    ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
    switch (status) {
        case kABAuthorizationStatusNotDetermined:{
            ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
                granted ? permissionGranted():noPermission();
            });
        }break;
        case kABAuthorizationStatusRestricted:
            noPermission();
            break;
        case kABAuthorizationStatusDenied:
            noPermission();
            break;
        case kABAuthorizationStatusAuthorized:
            permissionGranted();
            break;
        default:
            break;
    }
}

 

/**日历读写权限*/

- (void)checkCalendarAuthorizationCompletion:(void(^)(BOOL granted, NSError *error))completion
{
    //EKEventStore
    //检查日历授权状态
    /*
     EKAuthorizationStatusNotDetermined = 0, //未进行授权选择
     EKAuthorizationStatusRestricted, //未授权,且用户无法更新,如家长控制情况下
     EKAuthorizationStatusDenied, //用户拒绝App使用
     EKAuthorizationStatusAuthorized, //已授权,可使用
     */
    EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
    if (authorizationStatus == EKAuthorizationStatusNotDetermined || authorizationStatus == EKAuthorizationStatusDenied) {
        //未进行授权选择
        [[self sharedEKEventStore] requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
            if (granted) {
                DLog(@"授权成功");
                if (completion) {
                    completion(true,nil);
                }
            }else{
                DLog(@"授权失败,error:%@",error);
                if (completion) {
                    completion(false,error);
                }
            }
        }];
    }else if (EKAuthorizationStatusRestricted == authorizationStatus){
        if (completion) {
            completion(false,nil);
        }
    }else if (EKAuthorizationStatusAuthorized == authorizationStatus){
        if (completion) {
            completion(true,nil);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值