【问题标题】:How to force a macOS app to update while being in the background?如何在后台强制 macOS 应用程序更新?
【发布时间】:2020-08-10 12:06:10
【问题描述】:

我正在使用 Xcode(MacOS Catalina 下的 XCode 11.5)编写 macOS 应用程序,目标是通过 UDP 发送与我的 Macbook Pro 触控板接触的手指坐标,并在收到 UDP 消息时触发触觉反馈.

作为 Xcode 的新手,我使用this codeSwiftOSC 创建了我的应用程序用于 UDP 通信。当应用程序在前台时,我成功地做我想做的事。

代码:正是找到here的那个。

问题:应用在后台没有更新。

更新:遵循@zrzka 的建议:

  1. 我用
NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.any) {event in
    self.backMouseMovements(with: event)
}

在后台监听事件,功能如下:

func backMouseMovements(with event: NSEvent) {
    print("Event: \(event)")
    let touches = event.touches(matching: .moved, in: self)
    delegate?.touchesView(self, didUpdateTouchingTouches: touches)
}

我将此代码放在this codeAppKitTouchesView 类的override init(frame frameRect: NSRect) 中。

  1. 辅助功能:AXIsProcessTrusted() 返回true

  2. 我无法通过这些事件访问touches,更不用说normalizedPosition,这是我的最终目标。

相反,我有一个错误:

2020-08-13 09:40:53.538119+0200 TrackPad[1263:34805] *** Assertion failure in -[NSEvent touchesMatchingPhase:inView:], /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1894.50.103/AppKit.subproj/NSEvent.m:4874
2020-08-13 09:40:53.538198+0200 TrackPad[1263:34805] [General] An uncaught exception was raised
2020-08-13 09:40:53.538229+0200 TrackPad[1263:34805] [General] Invalid message sent to event "NSEvent: type=MouseMoved loc=(1197.92,994.461) time=3138.3 flags=0 win=0x0 winNum=150 ctxt=0x0 evNum=307 click=1 buttonNumber=0 pressure=0 deltaX=1.000000 deltaY=0.000000 deviceID:0x300000080500000 subtype=NSEventSubtypeTouch"
2020-08-13 09:40:53.539294+0200 TrackPad[1263:34805] [General] (
    0   CoreFoundation                      0x00007fff318c5be7 __exceptionPreprocess + 250
    1   libobjc.A.dylib                     0x00007fff6a69d5bf objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff318eed98 +[NSException raise:format:arguments:] + 88
    3   Foundation                          0x00007fff33fdde9d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 191
    4   AppKit                              0x00007fff2ee7fc36 -[NSEvent touchesMatchingPhase:inView:] + 449
    5   TrackPad                            0x0000000100002d0d $s8TrackPad17AppKitTouchesViewC18backMouseMovements4withySo7NSEventC_tF + 813
    6   TrackPad                            0x0000000100002986 $s8TrackPad17AppKitTouchesViewC5frameACSo6CGRectV_tcfcySo7NSEventCcfU_ + 214
    7   TrackPad                            0x0000000100002f09 $sSo7NSEventCIegg_ABIeyBy_TR + 73
    8   AppKit                              0x00007fff2f0a14e9 GlobalObserverHandler + 89
    9   HIToolbox                           0x00007fff3044f8ff _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1254
    10  HIToolbox                           0x00007fff3044ed8d _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 329
    11  HIToolbox                           0x00007fff3044ec3d SendEventToEventTargetWithOptions + 45
    12  HIToolbox                           0x00007fff3048eb8c _ZL29ToolboxEventDispatcherHandlerP25OpaqueEventHandlerCallRefP14OpaqueEventRefPv + 1329
    13  HIToolbox                           0x00007fff3044fe8a _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 2673
    14  HIToolbox                           0x00007fff3044ed8d _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 329
    15  HIToolbox                           0x00007fff3046447e SendEventToEventTarget + 39
    16  AppKit                              0x00007fff2eabe9aa _DPSNextEvent + 1268
    17  AppKit                              0x00007fff2eabd070 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1352
    18  AppKit                              0x00007fff2eaaed7e -[NSApplication run] + 658
    19  AppKit                              0x00007fff2ea80b86 NSApplicationMain + 777
    20  TrackPad                            0x000000010000eead main + 13
    21  libdyld.dylib                       0x00007fff6b844cc9 start + 1

我猜这个错误是因为我想访问touches,而这些事件不存在。但是,我不明白如何在我的addGlobalMonitorForEventsNSTouchNSEvent 之间建立链接,其中normalizedPosition 可用。

谢谢!

【问题讨论】:

  • 欢迎您!请使用Tour 并阅读What types of questions should I avoid asking?What topics can I ask about here?How do I ask a good question?——您刚刚分享了您正在做的事情以及您正在使用的几个库/代码。但是你也应该提供你的应用程序的代码,那些不起作用的部分。我的猜测是您的应用程序只是在打盹。见my answer
  • 实际上,该应用程序在不处于后台时运行良好。我不知道应用程序可以打盹,我会读一下这个和你的答案,谢谢!
  • 我将添加一段相关代码的简短摘录,而不是链接,然后解释代码如何未按预期执行/您要添加的功能。
  • 如果我的理解正确,即使应用程序在后台,您也想发送触控板手指位置?实际上,我编写了您链接的代码,但它并没有以您期望的方式工作。它是为处理视图触摸而编写的。但是即使您的应用程序在后台,您也需要一个全局事件监视器来监视鼠标事件。只需搜索 SO,周围有大量示例,并将它们与我的代码结合起来计算手指位置。
  • @zrzka 没错。我想我只需要添加一行代码就可以通过 OSC 发送数据,就像这样(在代码的 struct Touch 中):init(_ nsTouch: NSTouch) { self.normalizedX = nsTouch.normalizedPosition.x self.normalizedY = 1.0 - nsTouch.normalizedPosition.y self.id = nsTouch.hash self.position = [] client.send(OSCMessage(OSCAddressPattern("/position"), Float(normalizedX), Float(normalizedY))) } 感谢您的建议!作为一个新手,我发现很难理解这是如何工作的,感谢您花时间回答:)

标签: swift macos-catalina appkit xcode11.5


【解决方案1】:

我终于找到了这个框架的解决方案:https://github.com/Kyome22/OpenMultitouchSupport

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多