屏幕录制权限缺失
macOS 10.15苹果加强了权限管理,如果你的APP需要获取其他APP的界面,需要用户主动在系统“偏好设置-安全性与隐私-屏幕录制-勾选对应APP“,但是有很多用户不知道这个额外操作,导致APP的功能出现在这些用户的电脑中不可用的情况,具体功能比如应用无法获取屏幕截图,只能截取本APP的界面。
屏幕录制权限跳转
这个时候,我们就需要去提示用户执行上述中的权限赋予操作,权限赋予操作可以使用如下代码实现。(下图中的URL Scheme的获取也是一门技术活,有兴趣的同学可以看看)
NSURL *URL = [NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"];
[[NSWorkspace sharedWorkspace] openURL:URL];
屏幕录制权限判断
但是会有一个问题,我们什么时候去弹出这个权限控制框,我们需要对APP是否获取屏幕录制权限做一个判断。 上述问题通过 WWDC 2019 Advances in macOS Security 找到了答案。
下面是该视频中的一段文字摘要,清楚的表达了如何去判断APP是否获得了屏幕录制权限。
the window name and sharing state are not available, unless the user has preapproved the app for screen recording. And this is because some apps put sensitive data such as account names or more likely web page URLs in the window's name.
上面大意就是当用户没有屏幕录制权限时,其他APP的窗口名称跟共享状态是不可用的。更详细的信息,大家可以去看一下这期WWDC的视频,着急的话,看文字版就好。
接下来就是根据这段文字翻译而成的代码
- (BOOL)ScreeningRecordPermissionCheck {
if (@available(macOS 10.15, *)) {
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSUInteger numberOfWindows = CFArrayGetCount(windowList);
NSUInteger numberOfWindowsWithInfoGet = 0;
for (int idx = 0; idx < numberOfWindows; idx++) {
NSDictionary *windowInfo = (NSDictionary *)CFArrayGetValueAtIndex(windowList, idx);
NSString *windowName = windowInfo[(id)kCGWindowName];
NSNumber* sharingType = windowInfo[(id)kCGWindowSharingState];
if (windowName || kCGWindowSharingNone != sharingType.intValue) {
numberOfWindowsWithInfoGet++;
} else {
NSNumber* pid = windowInfo[(id)kCGWindowOwnerPID];
NSString* appName = windowInfo[(id)kCGWindowOwnerName];
NSLog(@"windowInfo get Fail pid:%lu appName:%@", pid.integerValue, appName);
}
}
CFRelease(windowList);
if (numberOfWindows == numberOfWindowsWithInfoGet) {
return YES;
} else {
return NO;
}
}
return YES;
}
总结
通过屏幕录制权限的判断以及跳转,已经可以完美解决本次macOS 10.15更新带来的问题。
网友评论