请原谅我的英语不好!我正在尝试在Mac OS X中获得专注的应用程序。在XCode 6.1.1中运行时,下面的代码运行正常:
func getFocusedApp() -> AXUIElementRef? {
let systemWideElement : AXUIElement = AXUIElementCreateSystemWide().takeRetainedValue()
let kAXFocusedApplication : CFString! = "AXFocusedApplication"
var focusedElementPtr : Unmanaged<AnyObject>?
var error : AXError = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedApplication, &focusedElementPtr)
if let ue = focusedElementPtr {
return ue.takeUnretainedValue() as AXUIElementRef
}
else {
printError(error)
}
return nil
}
其中 printError 显然是打印错误的函数。但是,当我将应用程序存档到Yosemite的Applications文件夹中时, focusedElementPtr 始终为nil,而 error == AXError(kAXErrorSuccess)(启用辅助功能,它会传递 AXIsProcessTrustedWithOptions 测试)。我无法弄清楚出了什么问题。如果有人可以帮助我,那就太好了。
提前致谢!
更新:我猜测它与内存管理有关,因此我将代码更改为:
func getFocusedApp() -> AXUIElementRef? {
var output: AXUIElementRef? = nil
let systemWideElement : AXUIElement = AXUIElementCreateSystemWide().takeRetainedValue()
let kAXFocusedApplication : CFString! = "AXFocusedApplication"
var focusedElementPtr : UnsafeMutablePointer<Unmanaged<AnyObject>?> = UnsafeMutablePointer<Unmanaged<AnyObject>?>.alloc(1)
var error : AXError = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedApplication, focusedElementPtr)
if let ue = focusedElementPtr.memory {
output = ue.takeUnretainedValue() as AXUIElementRef
}
else {
printError(error)
}
focusedElementPtr.dealloc(1)
return output
}
它可能不是最好的解决方案,但现在应用程序按预期运行:)如果我浪费了某人的时间,我很抱歉!