在 watchOS2 上只有声音和触觉的 Lo​​calNotification

LocalNotification with only sound and haptic on watchOS2

如何从 iPhone 触发 UILocalNotification,它不会发出警报,但只会在 Apple Watch 上播放声音/触觉反馈?

进一步的背景:

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

问题是 Apple 使用自己的逻辑来确定通知是否出现在手表或 phone 上。如果我触发了一个没有警报但只有声音的通知,这个通知总是在 phone 上播放,从不在手表上播放。

我希望通知 sound/haptic 在手表上播放。我怎样才能做到这一点?

你所问的缺点:

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

如果没有与声音关联的消息,用户看手表时看不到通知的任何原因。

目前如何做你所要求的事情的缺点:

WKInterfaceDevice documentation指出Apple玩触觉反馈的意图:

You can also use this object to play haptic feedback when your app is active.

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

对 iOS 10 的更改阻止了此工作,

您目前如何在 watchOS 2 中执行您要求的操作:

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

WKInterfaceDevice.currentDevice().playHaptic(.Notification) 

为此,您可能会滥用 WCSession transferCurrentComplicationUserInfo method. Its proper use is to immediately transfer complication data from the phone to the watch (that a watch face complication might be updated). As a part of that process, 来接收其信息。

在您的 phone 的 timerDidFire 方法中:

检查您与手表的 Watch Connectivity 会话是否有效后,使用 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)

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

使用内部原始值很脆弱,因为它可能会改变。如果您确实需要从 phone 指定特定的触感类型,您应该设置枚举而不是使用幻数。

在手表扩展的会话委托中:

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 中可用的任何新功能是否有助于创建合适的独立手表计时器应用程序。