1

我在 AppleWatch 和 iPhone 之间进行通信时遇到问题。

  • iPhone to Watch 通讯工作正常。

  • 观看 iPhone:didReceiveApplicationContext在 AppDelegate 中不会触发!!!

-

我在(iPhone)AppDelegate中有这个:

import WatchConnectivity

-

if WCSession.isSupported() {
    WCSession.default.delegate = self
    WCSession.default.activate()
}

...

extension AppDelegate: WCSessionDelegate {

    // MARK: WCSessionDelegate

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        //
    }

    func sessionDidBecomeInactive(_ session: WCSession) {
        //
    }

    func sessionDidDeactivate(_ session: WCSession) {
        //
    }

    func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String: Any]) {
        DispatchQueue.main.async {
            print("Phone didReceiveApplicationContext")
        }
    }
} 

在手表 InterfaceController 我有:

import WatchConnectivity

-

if WCSession.isSupported() {
    WCSession.default.delegate = self
    WCSession.default.activate()
}

-

extension InterfaceController: WCSessionDelegate {

    // MARK: WCSessionDelegate

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        //
    }

    func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String: Any]) {
        DispatchQueue.main.async {
            print("Watch didReceiveApplicationContext")
        }
    }
}

-

我正在尝试通过“更新应用程序上下文”进行交流,如下所示:

@IBAction func buttonPressed() {
    guard WCSession.isSupported() else {
        return
    }

    let message = ["buttonPressed" : true]
    do {
        try WCSession.default.updateApplicationContext(message)
    } catch {
        print("Something went wrong")
    }
}

-

为什么didReceiveApplicationContextAppDelegate 中的方法不触发?

-

我发现调试 Watch 应用程序非常复杂,包括将调试器附加到 iPhone 应用程序等的必要性……也许我的调试方式存在根本性的问题?

4

1 回答 1

1

由于我终于找到了解决方案(经过大量的反复试验和搜索),因此可以将其作为副本关闭。

我不确定我的/问题是什么WCSession.default.updateApplicationContext,但下面的 SO 帖子解释说你可以使用,sendMessage但你必须小心周围的replyHandler.

如果您从手表使用 发送消息sendMessage:replyHandler:errorHandler:,那么只有相应的委托方法 ( session:message:replyHandler:) 将在手机上的 AppDelegate 中触发。而且,你必须打电话replyHandler!!!

WCErrorCodeDeliveryFailed:无法交付有效负载

所以,我使用updateApplicationContext的是电话 > 手表,以及sendMessage:replyHandler:errorHandler:手表 > 电话

于 2018-10-13T14:06:17.800 回答