我正在研究Apple Watch的计时器应用程序。
在特定时间(计时器结束),iPhone会触发预定的UILocalNotification
,在非活动的Apple Watch上应触发触觉警报以告知用户计时器已结束。
我已经完成了这项工作,因为一旦手表处于非活动状态,计时器就不会继续在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)
}
}
答案 0 :(得分:2)
a)通知有时会显示在iPhone而不是苹果手表上(基于其他帖子,我担心这不能改变......)
那是对的。它适用于iOS determine where to show the notification。
如果您的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上发布本地通知。
答案 1 :(得分:0)
对于任何其他遇到此问题的人,也可能是未设置声音。苹果手表官方文档没有指定您必须添加声音。
请确保添加:
content.sound = UNNotificationSound.default