Я работаю над приложением таймера для Apple Watch.
В определенное время (конец таймера) iPhone запускает запланированный UILocalNotification
, который на неактивных Apple Watch должен вызвать тактильное оповещение, чтобы сообщить пользователю, что таймер закончился.
Я сделал это, поскольку таймеры не продолжают работать на Apple Watch, когда часы неактивны.
Проблема, с которой я столкнулся:
а) уведомление иногда отображается на iPhone, а не на часах Apple (судя по другим сообщениям, я боюсь, что это нельзя изменить ...)
б) на часах не отображается тактильное оповещение (чисто отображение уведомления, и это только в следующий раз, когда пользователь активирует часы, а не в то время, когда уведомление фактически запускается)
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)
}
}