swift - 如何在非事件 watch 收到本地通知时触发触觉警报

标签 swift watchkit uilocalnotification apple-watch watchos-2

我正在为 Apple Watch 开发计时器应用。

在特定时间(计时器结束),iPhone 会触发预定的 UILocalNotification,在未激活的 Apple Watch 上,它会触发触觉警报,告诉用户计时器已结束。

我这样做是因为一旦 watch 处于非事件状态,计时器就不会继续在 Apple Watch 上运行。

我面临的问题是:

a) 通知有时会显示在 iPhone 而不是 apple watch 上(根据其他帖子,我担心这无法更改...)

b) watch 上没有触觉提示(纯粹显示通知,并且仅在下次用户激活 watch 时显示,而不是在实际触发通知时显示)

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 而不是 apple watch 上(根据其他帖子,我担心这无法更改...)

没错。这取决于 iOS determine where to show the notification .

  • 如果您的 iPhone 已解锁,您将在 iPhone 而不是 Apple Watch 上收到通知。

  • 如果您的 iPhone 已锁定或处于 sleep 状态,您将在 Apple Watch 上收到通知,除非您的 Apple Watch 已使用您的密码锁定。

当您的本地通知将来触发时,它可能会显示在手机上。在这种情况下, watch 根本不会收到任何通知。

当 watch 处理通知时

b) watch 上没有触觉提示(纯粹显示通知,并且仅在下次用户激活 watch 时显示,而不是在实际触发通知时显示)

这是正确的。您期望 didReceiveLocalNotification 在 watch 上触发,但是 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 上发布本地通知。

关于swift - 如何在非事件 watch 收到本地通知时触发触觉警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37188804/

相关文章:

ios - Watchkit 扩展 - 未找到匹配的配置文件

watchkit - 长按手势 watch 套件

ios - Swift,将数据加载到临时文件流中以进行transferFile

objective-c - 应用程序在后台时不显示 iOS UILocalNotification

ios - 在日期后显示两种不同类型的单元格

ios - 如何使用 FCM 为富文本通知创建有效负载

ios - 如何在所有 View 中拥有一个 UIViewController 但不与所有 View 相关

ios - 在 iOS 中的拨号屏幕上添加弹出窗口

ios - 获取现有 UILocalNotifications 的列表并修改它们的日期

iphone - 我们如何获取本地通知的关闭事件?