swift – 当非活动手表收到本地通知时,如何触发触觉警报

我正在为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上发布本地通知.

点赞