【问题标题】:How to trigger screen recording permission system modal dialog on macOS Catalina如何在 macOS Catalina 上触发屏幕录制权限系统模式对话框
【发布时间】:2019-09-16 12:45:56
【问题描述】:

我有一个具有屏幕共享功能的应用程序。在 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

所以它是绝对不确定的。如果不与此模式对话框交互,我的应用程序将不会在Security & Privacy / Screen Recording 下注册,因此我无法授予它权限。有谁知道,我该如何解决这个问题?

【问题讨论】:

    标签: xcode11 screen-recording macos-catalina


    【解决方案1】:

    录屏提示只会出现一次——第一次调用试图录屏的API,比如:

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

    如您所述,在您调用屏幕录制 API 从而触发系统提示之前,您的应用不会出现在屏幕录制下的系统偏好设置中。

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

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

    【讨论】:

    • 不要使用All 使用ScreenCapture。全部重置许多其他内容。
    • 我在 Agent 应用中调用了录屏 API。当屏幕录制 API 调用时,我没有收到任何权限弹出窗口。当我尝试调试代码并且仅在调试时弹出?
    【解决方案2】:

    我在Ask Different.SE 上回答了同样的问题。您需要tccutil 来重置这些权限。

    重置屏幕录制应用的隐私数据库:

    tccutil reset ScreenCapture
    

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

    tccutil reset ScreenCapture [com.WHATEVERBUNDLE.YOURAPPID]
    

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

    【讨论】:

    • 我希望它也允许添加条目。出于某种原因,我正在使用的应用程序不再请求许可,因此我无法进行屏幕共享。真是一团糟? 至少这个解决方案确实明确了权限值。谢谢?
    • @GabLeRoux 您尝试了链接答案中的每个选项?这个过程帮助我恢复了我遇到的每台 Catalina 笔记本电脑上的屏幕录制。如果它仍然不适合你,让我们开始聊天吧。
    • 我设法解决了重启时遇到的问题。出于某种原因,我使用的应用程序从未请求过许可,也无法进行屏幕共享。我使用了tccutil reset ScreenCapture All,并且该错误适用于所有其他应用程序。我重新启动,现在所有应用程序再次请求权限。 “先生,您试过关掉再打开吗?”工作?
    • @GabLeRoux 没错。 tccutil 必须通过退出每个应用程序来跟进。重启是一种方法。
    • 啊,我确实尝试过先退出应用程序。没有这样做,但可能是由于有一些后台工作进程。我想我应该尝试一下pgrep $appName | xargs kill
    【解决方案3】:

    试试这个: 大声喊出你的 Mac。 使用 Cmd+R 启动 打开终端 ..$ csrutil 启用 重启 Mac

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2021-09-20
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多