GCController在后台冻结

时间:2019-07-16 15:33:46

标签: swift macos io gamepad

在macOS 10.15上,当窗口失去焦点时,我的应用程序未从无线连接的Xbox控制器接收任何输入。最初,我尝试使用设置为GCController.extendedGamepad.valueChangedHandler的运动处理程序。专注时,该应用程序将按预期工作,但是一旦我切换到另一个应用程序,它就会冻结。在我再次移动控制器之前,再次聚焦应用程序不会更新它。

func handleControllerDidConnectNotification(_ notification: NSNotification) {
    let gameController = notification.object as! GCController
    initialize(gameController)
}

func initialize(_ controller: GCController) {
    print("Initializing")

    if let extendedGamepad = controller.extendedGamepad {
        extendedGamepad.valueChangedHandler = movementHandler
    }

}

func movementHandler(_ gamepad: GCExtendedGamepad, _: GCControllerElement) {
    let gps = gamepad.saveSnapshot()
    // respond to input
}

想知道是否只是valueChangedHandler未被调用,我尝试从计时器中手动提取值。

let t = Timer(timeInterval: 0.01, repeats: true, block: {_ in Example.run()})
t.tolerance = 0.01
RunLoop.current.add(t, forMode: .default)

class Example {
    func run() {
        let gps = GCController.controllers()[0].extendedGamepad!.saveSnapshot()
        // respond to input
    }
}

日志确认计时器确实在后台运行,但是除非从窗口中获取焦点,否则我从控制器快照读取的值不会更改。与我以前的行为相同。

我正在尝试制作一个将控制器输入映射到键盘/鼠标输入的应用程序,所以不用说这需要在后台工作。

0 个答案:

没有答案