You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift CLI调用SCShareableContent.current无返回且不抛异常问题

解决ScreenCaptureKit授权后SCShareableContent.current await冻结问题

针对你遇到的Swift CLI应用授权ScreenCaptureKit后,调用await SCShareableContent.current陷入冻结的问题,可以从以下几个方向排查和修复:

1. 修正CLI异步任务的运行逻辑

CLI环境没有AppKit的自动运行循环,异步任务的回调无法触发,导致await一直挂起。需要手动维持运行循环,并在任务完成后主动退出程序。修改测试代码如下:

import ScreenCaptureKit

print("CHECKING PERMISSIONS")

Task {
    let authStatus = SCAuthorizationStatus.current()
    print("当前授权状态: \(authStatus.rawValue)")
    
    if authStatus == .authorized {
        do {
            let _ = try await SCShareableContent.current
            print("PERMISSIONS GRANTED")
        } catch {
            print("获取共享内容失败: \(error.localizedDescription)")
        }
    } else {
        do {
            try await SCRequestAuthorization()
            print("已发起授权请求,请在系统设置中允许")
        } catch {
            print("授权请求失败: \(error.localizedDescription)")
        }
    }
    exit(0) // 任务完成后主动退出程序
}

// 启动主运行循环,等待异步任务执行
RunLoop.main.run()

2. 重置系统屏幕录制权限缓存

系统权限缓存异常可能导致授权状态不同步,手动重置步骤:

  • 打开「系统设置」>「隐私与安全性」>「屏幕录制」
  • 找到你的CLI应用,取消勾选权限,等待10秒后重新勾选
  • 重启应用再次测试

3. 添加超时调试逻辑

给异步调用添加超时处理,避免无限挂起,同时捕获可能的隐藏错误:

import ScreenCaptureKit
import Foundation

print("CHECKING PERMISSIONS")

// 自定义超时错误
struct TimeoutError: Error, LocalizedError {
    var errorDescription: String? { "请求超时" }
}

// 带超时的异步任务包装函数
func withTimeout<T>(seconds: TimeInterval, operation: @escaping () async throws -> T) async throws -> T {
    return try await withThrowingTaskGroup(of: T.self) { group in
        group.addTask { try await operation() }
        group.addTask {
            try await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
            throw TimeoutError()
        }
        let result = try await group.next()!
        group.cancelAll()
        return result
    }
}

Task {
    do {
        let _ = try await withTimeout(seconds: 5) {
            try await SCShareableContent.current
        }
        print("PERMISSIONS GRANTED")
    } catch is TimeoutError {
        print("请求SCShareableContent超时,可能是权限状态异常或系统问题")
    } catch {
        print("NO PERMISSIONS: \(error.localizedDescription)")
    }
    exit(0)
}

RunLoop.main.run()

4. 确认系统版本兼容性

确保你的macOS版本在Ventura(13.0)及以上,ScreenCaptureKit仅支持该版本及更高系统,系统自动更新后若出现兼容性问题,可尝试重启系统后再测试。

内容的提问来源于stack exchange,提问作者Tobias K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:57:22