在watchOS2上只有声音和触觉的LocalNotification

时间:2016-05-17 10:49:00

标签: ios watchkit uilocalnotification watch-os-2 swift2.2

如何从iPhone上触发UILocalNotification哪个没有警报但只在Apple Watch上播放声音/触觉反馈?

进一步背景:

我正在制作一个watchOS2计时器应用程序。我使用iPhone触发的UIlocalNotification告诉用户已达到计时器结束(以处理手表未激活的情况)。

问题是Apple使用自己的逻辑来确定手表或手机上是否出现通知。如果我触发的通知没有警报但只发出声音,则此通知始终在手机上播放,从不在手表上播放。

我更喜欢在手表上播放通知声音/触觉。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

你所要求的缺点:

手表上的纯声通知会令人困惑。

如果没有与声音相关的消息,当用户看了一眼他们的手表时,用户就不会看到任何通知原因。

目前如何做你所问的问题的缺点:

WKInterfaceDevice documentation指出Apple打算采用触觉反馈:

  

您还可以使用此对象在您的应用激活时播放触诊反馈

以下是滥用API来完成不打算做的事情。它很脆弱,可能很烦人,可能会让用户搜索不同的计时器应用程序。

iOS 10的更改阻止了这项工作,unless your complication is on the active watch face

你现在如何在watchOS 2中做你要求的事情:

要在您的应用未激活时提供触觉反馈,您需要一种方法让手表扩展程序立即在后台唤醒,以提供反馈:

WKInterfaceDevice.currentDevice().playHaptic(.Notification) 

为此,您可能会滥用WCSession transferCurrentComplicationUserInfo方法。它的正确用途是立即将复杂数据从手机传输到手表(表面复杂功能可能会更新)。作为该流程的一部分,it wakes the watch extension in the background可以接收其信息。

在手机的timerDidFire方法中

检查您是否与手表有有效的观看连接会话后,使用transferCurrentComplicationUserInfo立即将字典发送到观看分机。

guard let session = session where session.activationState == .Activated && session.paired && session.watchAppInstalled else { // iOS 9.3
    return
}
let hapticData = ["hapticType": 0] // fragile WKHapticType.Notification.rawValue
// Every time you misuse an API, an Apple engineer dies
session.transferCurrentComplicationUserInfo(hapticData)

如图所示,字典可以包含指定触觉反馈类型的键/值对,或者只是按住一个键,指示手表应该播放硬编码通知。

使用内部原始值很脆弱,因为它可能会发生变化。如果您确实需要通过手机指定特定的触觉类型,则应设置枚举而不是使用幻数。

在观看分机的会话代理中:

watchOS会唤醒您的扩展程序以准备接收并发症用户信息。在这里,您可以播放触觉反馈,而不是像预期的那样更新并发症。

func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
    if let hapticTypeValue = userInfo["hapticType"] as? Int, hapticType = WKHapticType(rawValue: hapticTypeValue) {
        WKInterfaceDevice.currentDevice().playHaptic(hapticType)
    }
}

正确的解决方案:

Request Apple提供了一种在手表上安排本地通知的方法。 Apple的计时器应用程序已经这样做了。

您也可以等到2016年WWDC宣布宣布的内容,以确定watchOS 3中的任何新功能是否有助于创建适当的独立计时器应用。