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

wsewodh2  于 2023-03-11  发布在  Swift
关注(0)|答案(3)|浏览(130)

我正在为苹果手表开发一个计时器应用程序。
在特定的时间(计时器结束),iPhone会触发一个预定的UILocalNotification,在不活动的Apple Watch上,该预定的UILocalNotification会触发一个触觉警报,告诉用户计时器已经结束。

  • 我之所以这样做,是因为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)
    }
}
nfs0ujit

nfs0ujit1#

显示通知的位置

  • a)通知有时会显示在iPhone上,而不是苹果手表上(根据其他帖子,我担心这一点无法改变...)*

没错,iOS升级到determine where to show the notification

  • 如果您的iPhone已解锁,您将在iPhone上收到通知,而不是在Apple Watch上。
  • 如果您的iPhone被锁定或处于睡眠状态,您将在Apple Watch上收到通知,除非您的Apple Watch已使用密码锁定。

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

当监视器处理通知时

  • B)在手表上不给出触觉警报(纯粹显示通知,并且这仅在用户激活手表的下一次时,而不是在实际触发通知的时间)*

这是正确的。您希望didReceiveLocalNotification在手表上触发,但这只在手表被激活时发生:
如果本地通知在您的应用处于活动状态时到达,WatchKit将调用此方法来传递通知负载。使用此方法来响应通知。
这就是为什么触觉反馈没有在您预期的时间发生的原因,因为播放触觉反馈的调用直到稍后才发生。

您的方法的变通方案

您可以通过 * 首先 * 检查本地通知的fireDate来有条件地播放您的触觉反馈。仅当通知处理刚刚触发时才播放您的触觉反馈。

更好的解决方案

看起来你正在尝试处理播放一个独立于默认反馈的触觉,当watchOS为你显示通知时已经发生了。
您可能希望跳过扩展播放自己的触觉反馈,因为系统已经通知了用户。

提出功能请求

你试图解决的真实的问题是,只有苹果的计时器应用程序可以安排自己的本地通知。
如果你还没有,你可能想submit a feature request要求苹果让第三方开发者在watchOS上发布本地通知。

nom7f22z

nom7f22z2#

对于其他有这个问题的人来说,也可能是没有设置声音。苹果手表的官方文档没有指定你必须添加声音。
确保添加:
content.sound = UNNotificationSound.default

mcvgt66p

mcvgt66p3#

将标识符设置为UUID().uuidString而不是“localNotificatoin”

static func setLocalNotification(title: String, subtitle: String, body: String, when: Double) {
    let content = UNMutableNotificationContent()
    content.title = title
    content.subtitle = subtitle
    content.body = body
    content.sound = UNNotificationSound.default

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: when, repeats: false)
    let request = UNNotificationRequest.init(identifier: UUID().uuidString, content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}

相关问题