当最前面的应用收到通知时播放触觉

Posted

技术标签:

【中文标题】当最前面的应用收到通知时播放触觉【英文标题】:Playing a haptic when frontmost app receives a notification 【发布时间】:2017-10-25 17:28:06 【问题描述】:

在 Apple 的 Frontmost App Behavior 文档中,声明

“[...]当最前面的应用收到通知时,它可以播放触觉反馈或自定义声音,而不是显示通知警报,然后更新其用户界面。”

但是,我在执行此操作时遇到了麻烦。现在,按下按钮后,我在安排通知之前将应用声明为最前面:

@IBAction func StartButtonPressed() 
    WKExtension.shared().isFrontmostTimeoutExtended = true
    scheduleNotification()

当应用处于前台时收到通知时,它会播放触觉:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 
    //MARK: Handle foreground notification here
    WKInterfaceDevice.current().play(.success)
    print("Foreground notification received")
    return

这在用户的手腕抬起时有效,但在用户点击按钮后放下手腕时无效。 当手腕抬起或放下时,控制台都会打印收到前台通知

如果不是播放触觉,我设置completionHandler([.alert,.sound]) 通知会在手腕抬起或放下时提醒用户。这是我想要的行为,但仅限于触觉。

我该如何实现?

【问题讨论】:

【参考方案1】:

检查applicationState。如果状态为backgroundinactiveplay(:) 方法将不起作用。

当您的共享 WKExtension 对象的 applicationState 属性为背景或非活动状态时调用此方法无效。默认情况下,您无法在后台播放触觉反馈。唯一的例外是具有活跃锻炼会话的应用程序。有关更多信息,请参阅 HKWorkoutSession 中的后台运行。

https://developer.apple.com/documentation/watchkit/wkinterfacedevice/1628128-play

【讨论】:

在 watchOS 4 最前端的应用程序获得了从后台唤醒以接收通知的优势。如果应用从后台唤醒,为什么通知不播放触觉? @Patrick 这就是苹果文档所说的。你确定运行WKInterfaceDevice.current().play(.success)时状态是前台吗? 似乎应该可以。似乎不需要设置这个但值得一试。 LINK 我检查了应用程序是否处于最前端状态,因为根据文档,watchOS 4 中最前端的应用程序特别能够从后台播放触觉反馈。在 watchOS 4 之前,已经可以通过锻炼会话来播放触觉,但现在不应该没有它就可以工作吗?如果applicationState. play(:) 不起作用,那么正确的方法是什么?

以上是关于当最前面的应用收到通知时播放触觉的主要内容,如果未能解决你的问题,请参考以下文章

当非活动手表收到本地通知时如何触发触觉警报

当蓝牙耳机连接到 Apple Watch 时,触觉不会在后台播放

收到本地通知时无法播放音乐,当应用程序处于后台状态时

收到远程通知时如何播放声音?

WatchKit 上的延迟警报?

播放音乐时,我的音频应用程序中没有收到通知或消息的声音 | AV音频播放器