在开发过程可能会遇到要监控当前app的一些工作情况,如弹出窗口,移动窗口位置等。查询资料后,发现可以通过利用AXObserver监控app的一些变化。具体步骤如下:
1 声明观察者
var observer: AXObserver? = nil
2 利用BundleIdentifier获取要监控的app
let apps = NSRunningApplication.runningApplications(withBundleIdentifier: "com.iqiyi.player")
let app = apps.last
let pid: pid_t = (app?.processIdentifier)!
3 创建回调闭包,这里只是打印通知
let myCallBack: AXObserverCallback = {
(observer: AXObserver, app: AXUIElement, noti: CFString, refcon: UnsafeMutableRawPointer?) -> Swift.Void in
print(noti)
}
4 创建观察者
AXObserverCreate(pid, myCallBack, &observer)
5 将AXObserver加入Runloop中
CFRunLoopAddSource(CFRunLoopGetCurrent(), AXObserverGetRunLoopSource(observer!), CFRunLoopMode.defaultMode)
6 添加需接收到通知
AXObserverAddNotification(observer!, AXUIElementCreateApplication(pid), kAXWindowMovedNotification as CFString, nil)