Swift CLI调用SCShareableContent.current无返回且不抛异常问题
针对你遇到的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.
相关产品推荐
相关产品推荐

