如何在macOS Catalina上触发屏幕录制权限系统模态对话框

14

我有一个应用程序,其中包含屏幕共享功能。在 macOS Catalina beta8 (19A558d) 中,您必须授予屏幕录制权限以共享您的屏幕(未经许可,只会与另一方共享背景和菜单栏)。不幸的是,我真的不知道哪个事件或调用会触发系统模态对话框,有时对话框出现,有时不出现。

在wwdc macos安全文档的第75页显示了系统模态对话框:
https://devstreaming-cdn.apple.com/videos/wwdc/2019/701ngx868rfo8jlj/701/701_advances_in_macos_security.pdf?dl=1

因此,这绝对是不确定的。如果没有与此模态对话框交互,我的应用程序就不会在安全性与隐私/屏幕录制下注册,因此无法为其授予权限。有人有什么想法,如何解决这个问题吗?

3个回答

16

macOS 11+

现在,苹果提供了API来确定您的应用程序是否具有屏幕录制访问权限,可以使用CGPreflightScreenCaptureAccess()查看是否有该权限,并使用CGRequestScreenCaptureAccess()请求该权限。请求访问将呈现系统提示并自动将您的应用程序添加到列表中,以便用户只需启用访问即可。系统提示每个应用程序会话仅出现一次。例如,如果他们在第一个提示中点击拒绝,则如果您的应用再次请求访问,则不会出现该提示。但是,如果他们退出并重新启动您的应用程序,则您的应用程序可能会再次请求访问,然后该提示将出现。

原始回答:

屏幕录制提示仅会出现一次-当您调用尝试记录用户屏幕的API时,例如:

CGDisplayStreamRef stream = CGDisplayStreamCreate(CGMainDisplayID(), 1, 1, kCVPixelFormatType_32BGRA, nil, ^(CGDisplayStreamFrameStatus status, uint64_t displayTime, IOSurfaceRef frameSurface, CGDisplayStreamUpdateRef updateRef) {
});
if (stream) {
    CFRelease(stream);
}

正如您指出的那样,在触发系统提示之前,您的应用程序不会在“屏幕录制”下出现在“系统偏好设置”中。

如果触发提示并且用户拒绝了它,您将无法再次弹出该提示 - 用户必须在“系统偏好设置”中手动启用它。

有用的测试信息:

在构建和测试过程中,您可以通过 tccutil reset ScreenCapture com.company.appname 重置应用程序的权限,就好像您从未调用过屏幕录制API一样。或者使用 All 而不是 ScreenCapture 为您的应用程序重置所有权限。


2
不要使用“全部”,请使用“ScreenCapture”。使用“全部”会重置许多其他内容。 - seth
1
我在代理应用程序中调用了屏幕录制API。当屏幕录制API被调用时,我没有收到任何权限弹出窗口。我尝试调试代码时,只有在调试过程中才会出现弹出窗口? - Sangram Shivankar

8
我曾在Ask Different.SE上回答过同样的问题。你需要使用tccutil来重置这些权限。
重置屏幕录制应用程序的隐私数据库:
tccutil reset ScreenCapture

或者,如果您知道应用程序的包标识符,您可以重置单个应用程序。

tccutil reset ScreenCapture [com.WHATEVERBUNDLE.YOURAPPID]

重置隐私权限后,您必须退出应用程序,更改才能生效。然后您可以重新启动应用程序并尝试屏幕录制,提示框应该会重新出现。

3
希望能够添加条目。由于某种原因,我使用的应用程序不再请求权限,因此无法进行屏幕共享。真是一团糟。不过至少这个解决方案确实清除了权限值。谢谢。 - GabLeRoux
@GabLeRoux 你在链接的答案中尝试了每个选项吗?这个过程已经帮助我恢复了我遇到的每台Catalina笔记本电脑上的屏幕录制。如果它仍然对你不起作用,让我们开始一个聊天吧。 - Nic
1
我成功解决了重启的问题。出于某种原因,我使用的应用程序从未请求权限,无法进行屏幕共享。我使用了“tccutil reset ScreenCapture All”命令,这个错误也影响了其他所有应用程序。然后我重启了电脑,现在所有应用程序都再次请求权限了。“先生,您尝试关闭并重新打开它吗?”这招奏效了。 - GabLeRoux
@GabLeRoux 没错。tccutil 必须跟着退出每个应用程序。重新启动是一种方法。 - Nic
啊,我确实尝试过先退出应用程序。但是没有成功,可能是由于某些后台工作进程造成的。我想我应该尝试一些类似于 pgrep $appName | xargs kill 的操作。 - GabLeRoux
显示剩余2条评论

-2
尝试以下步骤: 关闭您的 Mac。 使用 Cmd+R 启动。 打开终端。 ..$ csrutil enable 重新启动 Mac。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接