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

进一步的背景:

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

问题在于,Apple使用自己的逻辑来确定手表或手机上是否出现通知。如果我触发的通知没有提醒,只有声音,那么该通知将始终在手机上播放,而不是在手表上播放。

我希望通知声音/触觉能在手表上播放。我该如何实现?

最佳答案

您要问的缺点:

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

如果没有与声音相关的消息,则用户在看手表时将看不到发出通知的任何原因。

当前如何处理您要问的问题的缺点:

WKInterfaceDevice documentation指出了苹果播放触觉反馈的意图:

当您的应用程序处于 Activity 状态时,您还可以使用此对象来播放触觉反馈

接下来是滥用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方法中:

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

如图所示,词典可以包含指定触觉反馈类型的键/值对,或者仅持有指示手表应播放硬编码通知的键。

使用内部原始值很脆弱,因为它可能会更改。如果确实需要从电话中指定特定的触觉类型,则应设置一个枚举而不是使用幻数。

在监视扩展的 session 委托中:

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提供了一种在手表上安排本地通知的方法。苹果的计时器应用程序已经做到了。

您可能还需要等待WWDC 2016上发布的内容,以决定watchOS 3中可用的任何新功能是否有助于创建合适的独立手表计时器应用程序。

10-05 20:23