当非活动手表收到本地通知时如何触发触觉警报
Posted
技术标签:
【中文标题】当非活动手表收到本地通知时如何触发触觉警报【英文标题】:How to trigger haptic alert when inactive watch receives local notification 【发布时间】:2016-05-12 13:44:08 【问题描述】:我正在为 Apple Watch 开发计时器应用程序。
在特定时间(定时器结束),iPhone 会触发一个预定的UILocalNotification
,在不活动的 Apple Watch 上应该会触发一个触觉警报,告诉用户定时器已经结束。
我这样做是因为一旦手表处于非活动状态,计时器就不会继续在 Apple Watch 上运行。
我面临的问题是:
a) 通知有时会显示在 iPhone 上而不是 Apple Watch 上(根据其他帖子,我担心这无法更改...)
b) 手表上不提供触觉警报(仅显示通知,仅在用户下次激活手表时显示,而不是在实际触发通知时)
func sendAwakeNotification(nextTime:NSDate)
print("AppDelegate: - sendAwakeNotification")
dispatch_async(dispatch_get_main_queue()) () -> Void in
let localNotification = UILocalNotification()
localNotification.fireDate = nextTime
localNotification.timeZone = NSTimeZone.defaultTimeZone()
localNotification.alertBody = "Finished Step"
localNotification.alertTitle = "Alert"
localNotification.soundName = UILocalNotificationDefaultSoundName
localNotification.category = "myTimer"
let userInfo: [NSObject : AnyObject] = [
"notification_id" : "myTimerNotification"
]
localNotification.userInfo = userInfo
UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
通知中的代码
override func didReceiveLocalNotification(localNotification: UILocalNotification, withCompletion completionHandler: ((WKUserNotificationInterfaceType) -> Void))
print("received notification")
dispatch_async(dispatch_get_main_queue()) () -> Void in
let notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.postNotificationName(NotificationAlertFromPhone, object: nil)
completionHandler(.Custom)
我尝试直接在 NotificationController (WKInterfaceDevice.currentDevice().playHaptic(WKHapticType.Notification))
中触发触觉警报,但没有成功。因此,我恢复发送应该由 ExtensionDelegate 接收以触发触觉的通知。
这是 ExtensionDelegate 中的代码:
private func setupNotificationCenter()
print("ExtensionDelegate: - setupNotificationCenter")
notificationCenter.addObserverForName(NotificationAlertFromPhone, object: nil, queue: nil) (notification:NSNotification) -> Void in
WKInterfaceDevice.currentDevice().playHaptic(WKHapticType.Notification)
【问题讨论】:
【参考方案1】:通知的显示位置
a) 通知有时会显示在 iPhone 上而不是 Apple Watch 上(根据其他帖子,我担心这无法更改...)
没错。 determine where to show the notification 取决于 ios。
如果您的 iPhone 已解锁,您将在 iPhone 而不是 Apple Watch 上收到通知。
如果您的 iPhone 已锁定或处于睡眠状态,您将在 Apple Watch 上收到通知,除非您的 Apple Watch 已使用您的密码锁定。
当您的本地通知将来触发时,它可能会显示在手机上。在这种情况下,手表根本不会收到任何通知。
手表处理通知时
b) 手表上不提供触觉警报(仅显示通知,并且仅在用户下次激活手表时显示,而不是在实际触发通知时)
这是正确的。你期待didReceiveLocalNotification
在手表上触发,但this only occurs when the watch is activated:
如果在您的应用处于活动状态时收到本地通知,WatchKit 会调用此方法来传递通知负载。使用此方法响应通知。
这就是为什么您的触觉反馈没有按预期发生的原因,因为播放触觉反馈的调用直到稍后才会发生。
您的方法的解决方法
您可以通过首先检查本地通知的fireDate
来有条件地播放您的触觉。仅在刚刚触发通知处理时播放您的触觉反馈。
更好的解决方案
您似乎正在尝试处理与默认反馈无关的触觉播放,默认反馈在 watchOS 为您显示通知时已经出现。
您可能希望跳过扩展程序播放自己的触觉反馈,因为系统已经通知了用户。
提出功能请求
您要解决的真正问题是,只有 Apple 的计时器应用可以安排自己的本地通知。
如果您还没有,您可能想submit a feature request 询问 Apple 是否允许第三方开发者在 watchOS 上发布本地通知。
【讨论】:
亲爱的 PetahChristian,感谢您的回答。我的问题是,虽然根本没有播放任何触觉反馈。既不是收到通知时的标准通知,也不是我尝试以编程方式触发的通知。 你检查过 iPhone 的 Watch 应用,在声音和触觉下吗?确保没有关闭触觉强度(和警报音量)设置。还要确保您的应用已被授予适当的user permission 用于本地 .Sound、.Alert 和 .Badge 通知。否则,将不会播放通知声音。您可以在“设置”应用的“通知”下找到特定于应用的偏好设置。 感谢 PetahChristian,这通常是最明显的错误 ;-) 只授予警报权限,而不是声音... 不客气 :) 请记住,描述实际问题更方便——根本不播放触觉反馈——而不是the attempted solution。【参考方案2】:对于遇到此问题的其他人,也可能是没有设置声音。官方的 Apple Watch 文档没有指定您必须添加声音。
请务必添加:
content.sound = UNNotificationSound.default
【讨论】:
以上是关于当非活动手表收到本地通知时如何触发触觉警报的主要内容,如果未能解决你的问题,请参考以下文章