我正在为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)
}
}
最佳答案 显示通知的位置
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:
If a local notification arrives while your app is active, WatchKit calls this method to deliver the notification payload. Use this method to respond to the notification.
这就是为什么您的触觉反馈不会在您预期发生的原因,因为播放触觉反馈的呼叫直到稍后才会发生.
您的方法的解决方法
您可以通过首先检查本地通知的fireDate来有条件地播放您的触觉.仅在触发通知处理时才播放您的触觉反馈.
更好的解决方案
您似乎正在尝试处理播放触觉,而不依赖于watchOS为您显示通知时已发生的默认反馈.
您可能希望跳过扩展程序播放自己的触觉反馈,因为系统已通知用户.
提出功能请求
您尝试解决的真正问题是,只有Apple的计时器应用程序可以安排自己的本地通知.
如果你还没有,你可能想要submit a feature request要求Apple让第三方开发者在watchOS上发布本地通知.