随着系统10.15版本的发布, 系统对隐私权限 越来越重视, 在10.15中增加了 对屏幕录制的权限控制. 下面总结了 对摄像头, 麦克风, 屏幕录制权限的鉴权.
1. 对摄像头 麦克风的鉴权判断, 前提是在plist.info 文件里面, 添加过隐私设置描述 代码片段:
if (@available(macOS 10.14, *)) {
NSString * mediaTypeVideo = AVMediaTypeVideo;
AVAuthorizationStatus authorizationVideoStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaTypeVideo]; if (authorizationVideoStatus == AVAuthorizationStatusNotDetermined) {
//发起请求鉴权(系统弹窗)
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
}];
} else if (authorizationVideoStatus == AVAuthorizationStatusRestricted || authorizationVideoStatus == AVAuthorizationStatusDenied) {
NSLog(@"摄像头权限被限制"); //可以做一些自定义的操作: 提醒用户打开设置面板 勾选摄像头权限
} else {
//已经授权
}
NSString * mediaTypeAudio = AVMediaTypeAudio;
AVAuthorizationStatus authorizationAudioStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaTypeAudio];
if (authorizationAudioStatus == AVAuthorizationStatusNotDetermined) {
//发起请求鉴权(系统弹窗)
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
}];
} else if (authorizationAudioStatus == AVAuthorizationStatusRestricted || authorizationAudioStatus == AVAuthorizationStatusDenied) {
NSLog(@"麦克风权限被限制"); //可以做一些自定义的操作: 提醒用户打开设置面板 勾选麦克风权限
} else {
//已经授权
}
}
2. 对屏幕录制的鉴权判断, 不用在plist.info中添加隐私权限使用描述.
CGDisplayStreamRef stream = CGDisplayStreamCreateWithDispatchQueue(CGMainDisplayID(), 1, 1, kCVPixelFormatType_32BGRA,
nil, //可为nil
dispatch_queue_create(NULL, NULL),
^(CGDisplayStreamFrameStatus status,
uint64_t displayTime,
IOSurfaceRef frameSurface,
CGDisplayStreamUpdateRef updateRef) { });
BOOL canRecord = stream != NULL;
if (stream) {
CFRelease(stream);
}
//对canRecord进行判断 0 为没有权限 1为已经获取了权限.
以上代码的意思是 去获取一个屏幕截图的图像流, 如果获取的到那么就意味着能够截图, 具有屏幕录制的权限, 否则就没有权限. 如果没有权限, 怎么样去调用系统录制屏幕的鉴权弹窗呢? 在录制或者截图的时候, 就可以自动调起系统的鉴权弹窗, 如果想要事先获取到, 那么就截取一个点的图像, 来调用起系统的鉴权弹窗
CGImageRef screenshot = CGWindowListCreateImage(
CGRectMake(0,0,1,1),
kCGWindowListOptionOnScreenOnly,
kCGNullWindowID,
kCGWindowImageDefault);
CFRelease(screenshot);