WatchConnectivity: didReceiveApplicationContext永远不会被调用,尽管con



我遇到了以下问题:我能够在iPhone和Watch(模拟器和真实设备)上启动WCSessions,并且可以使用sendMessage方法。我知道updateApplicationContext需要发送一个更新过的字典,所以我添加了一个uid用于调试:

context = ["user":id,"messageId": UUID().uuidString]

当方法被调用时没有抛出错误,但是在监视端didReceiveApplicationContext永远不会被调用并且receivedApplicationContext字典一直保持空。在阅读了大量类似的代码示例和文档后,我看不出我错在哪里。

我正在构建XCode 12.5和iOS 14.5和watchOS 7.4

这是处理WCSession的iOS代码,上下文在另一个方法中设置,并且通过sendMessage成功传输,但没有通过updateApplicationContext:

import WatchConnectivity
public class CDVSettings : CDVPlugin, WCSessionDelegate {
var wcSession : WCSession! = nil
var didSendMessage:Bool = false
var context: [String : Any] = [:] {
didSet {
debugPrint("context didSet:", self.context)
debugPrint("WCSession.isPaired: (wcSession.isPaired), WCSession.isWatchAppInstalled: (wcSession.isWatchAppInstalled)")
if wcSession.activationState == WCSessionActivationState.activated {
do {
debugPrint("updateApplicationContext is called")
self.didSendMessage=true
try wcSession.updateApplicationContext(self.context)
}
catch let error as NSError {
debugPrint(error.localizedDescription)
}
catch {}
wcSession.sendMessage(self.context, replyHandler: { reply in
print("Got reply: (reply)")
}, errorHandler: { error in
print("error: (error)")
})
} else {
print("activationState is not activated")
wcSession.activate()
}
}
}
public func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
print("activationDidCompleteWith activationState:(activationState) error:(String(describing: error))")
}
public func sessionDidBecomeInactive(_ session: WCSession) {

}
public func sessionDidDeactivate(_ session: WCSession) {
}
@objc(pluginInitialize)
public override func pluginInitialize() {
wcSession = WCSession.default
wcSession.delegate = self
wcSession.activate()
}
[...]
}

这是手表部分:

import WatchConnectivity

class ConnectivityRequestHandler: NSObject, ObservableObject, WCSessionDelegate {

var session = WCSession.default
override init() {
super.init()
session.delegate = self
session.activate()
debugPrint("ConnectivityRequestHandler started with session", session)
}

// MARK: WCSession Methods

func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
debugPrint(error)
debugPrint("session is reachable:",session.isReachable)
debugPrint("last received application context:",session.receivedApplicationContext)
}


func session(_ session: WCSession, didReceiveMessage message: [String: Any], replyHandler: @escaping ([String: Any]) -> Void) {
debugPrint("didReceiveMessage: (message)")
replyHandler(["message received": Date()])
}

func session(_ session: WCSession, didReceiveMessageData messageData: Data, replyHandler: @escaping (Data) -> Void) {
debugPrint("didReceiveMessageData: (messageData)")
}

func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
debugPrint("did receive application context")
debugPrint(applicationContext)
if let id = applicationContext["user"] as? [String]{
debugPrint("(id)")
UserDefaults.standard.set(id, forKey: "user")
}
}
}

iOS上对应的日志

"上下文didSet:"【"user"0 e4a28b5 - f8a0 40 - a5 - 942 d - 5 - f13b610a93a","messageId"8 a78246c - 91 - e6 - 48 - dc - b55d - 4 - f4ebc761211"】"WCSession。isPaired: true, WCSession。isWatchAppInstalled: true"updateApplicationContext被调用收到回复:["消息收到";2019-09-03 08:31:54 +0000]

and on watchOS

ConnectivityRequestHandler with session"& lt; WCSession:0x600003be0b40, hasDelegate: YES, activationState: 0;Nil "session是可获得的:";最后收到的应用程序上下文:"[:]didReceiveMessage: ["user"; 0e4a28b5-f8a0-40a5-942d-5f13b610a93a,"messageId" 8 a78246c - 91 - e6 - 48 - dc - b55d - 4 - f4ebc761211]">

我做错了什么?谢谢你的帮助。

对于那些在研究过程中被我的问题绊倒的人,这不是真正的解决方案,而是我(现在)与他人分享的一个观察结果(参见上面的评论):它如预期的那样,但是您可能需要重新启动他们在这个过程中。在模拟器中,似乎不同的方法可以工作,而其他方法则不能,甚至因开发人员而异。

在Xcode 14中,这应该也适用于模拟器。至少对我来说,它似乎没有问题

相关内容

最新更新