如果在非活动监视器收到本地通知时触发触觉警报

时间:2016-05-12 13:44:08

标签: swift watchkit uilocalnotification apple-watch watch-os-2

我正在研究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)
    }
}

2 个答案:

答案 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