Final Cut Pro插件开发:macOS自动化权限弹窗自动消失问题
Final Cut Pro插件权限弹窗闪消失问题解决
问题分析
添加时间线观察者时,系统弹出的自动化权限弹窗仅显示1秒就消失,导致观察者虽已添加但无权限获取数据,问题出在host.timeline!.add(timelineObserver)执行时机上——同步添加观察者会触发回调逻辑,干扰权限弹窗的正常显示流程。
解决方案
1. 延迟添加观察者,给弹窗留足交互时间
将观察者添加操作放到主线程延迟执行,避免同步操作打断权限弹窗的展示:
let host = ProExtensionHostSingleton() as! FCPXHost if host.timeline != nil { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { host.timeline!.add(self.timelineObserver) } }
2. 提前手动请求自动化权限
在插件初始化阶段主动请求权限,确保用户授权后再添加观察者,避免后续操作干扰弹窗:
import ApplicationServices // 插件初始化时调用 func requestAutomationPermission() { let options = [kAXTrustedCheckOptionPrompt.takeRetainedValue() as String: true] as CFDictionary AXIsProcessTrustedWithOptions(options) } // 确认权限后再添加观察者 let host = ProExtensionHostSingleton() as! FCPXHost if host.timeline != nil { requestAutomationPermission() // 稍作延迟确保权限请求弹窗正常显示 DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { host.timeline!.add(self.timelineObserver) } }
3. 在观察者回调中校验权限
避免回调逻辑在未授权时执行,导致权限弹窗被中断:
class TimelineObserver: NSObject, FCPXTimelineObserver { func activeSequenceChanged() { // 校验权限状态 let checkOptions = [kAXTrustedCheckOptionPrompt.takeRetainedValue() as String: false] as CFDictionary guard AXIsProcessTrustedWithOptions(checkOptions) else { // 未授权时手动触发权限请求 let promptOptions = [kAXTrustedCheckOptionPrompt.takeRetainedValue() as String: true] as CFDictionary AXIsProcessTrustedWithOptions(promptOptions) return } // 有权限后再执行业务逻辑 let host = ProExtensionHostSingleton() as! FCPXHost let hasTimeline: Bool = host.timeline?.activeSequence != nil NotificationCenter.default.post(name: Notification.Name("timelineChanged"), object: nil, userInfo: ["hasTimeline": hasTimeline]) print("AAA", hasTimeline) } func playheadTimeChanged() {} func sequenceTimeRangeChanged() {} }
内容的提问来源于stack exchange,提问作者Luis Parente
相关产品推荐
相关产品推荐

