我正在为苹果手表开发一个计时器应用程序。
在特定的时间(计时器结束),iPhone会触发一个预定的UILocalNotification
,在不活动的Apple Watch上,该预定的UILocalNotification
会触发一个触觉警报,告诉用户计时器已经结束。
- 我之所以这样做,是因为Apple Watch一旦处于非活动状态,计时器就不会继续运行。*
我面临的问题是:
a)通知有时会显示在iPhone上而不是苹果手表上(根据其他帖子,我担心这一点无法改变...)
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)
}
}
3条答案
按热度按时间nfs0ujit1#
显示通知的位置
没错,iOS升级到determine where to show the notification。
当您的本地通知在将来触发时,它可能会显示在手机上。在这种情况下,手表将不会收到任何通知。
当监视器处理通知时
这是正确的。您希望
didReceiveLocalNotification
在手表上触发,但这只在手表被激活时发生:如果本地通知在您的应用处于活动状态时到达,WatchKit将调用此方法来传递通知负载。使用此方法来响应通知。
这就是为什么触觉反馈没有在您预期的时间发生的原因,因为播放触觉反馈的调用直到稍后才发生。
您的方法的变通方案
您可以通过 * 首先 * 检查本地通知的
fireDate
来有条件地播放您的触觉反馈。仅当通知处理刚刚触发时才播放您的触觉反馈。更好的解决方案
看起来你正在尝试处理播放一个独立于默认反馈的触觉,当watchOS为你显示通知时已经发生了。
您可能希望跳过扩展播放自己的触觉反馈,因为系统已经通知了用户。
提出功能请求
你试图解决的真实的问题是,只有苹果的计时器应用程序可以安排自己的本地通知。
如果你还没有,你可能想submit a feature request要求苹果让第三方开发者在watchOS上发布本地通知。
nom7f22z2#
对于其他有这个问题的人来说,也可能是没有设置声音。苹果手表的官方文档没有指定你必须添加声音。
确保添加:
content.sound = UNNotificationSound.default
mcvgt66p3#
将标识符设置为UUID().uuidString而不是“localNotificatoin”