我在调用session.activateSession()方法时遇到问题,WatchKit连接会话无法激活。这是我用来设置会话的代码。
if (WCSession.isSupported()) {
session = WCSession.defaultSession()
session.delegate = self // conforms to WCSessionDelegate
session.activateSession()
print("Session has been activated")
}
但是,我在打印行上放置了一个断点,当我检查会话对象时,它表示sessionActivated属性仍然是false,即使在调用activateSession之后也是如此。当我调用激活会话时,我似乎没有遇到任何类型的错误,所以我认为它应该有效,但似乎并非如此。
此外,如果我稍后在我的代码中尝试在会话对象上使用sendMessage方法 -
let message = ["request": "fireLocalNotification"]
session.sendMessage(
message, replyHandler: { (replyMessage) -> Void in }) { (error) -> Void in
print(error.localizedDescription)
}
我收到错误代码"操作无法完成。 (WCErrorDomain错误7004。)"我查了一下这意味着" WCErrorCodeSessionNotActivated。"这是我认为activateSession方法没有正确调用的另一个原因。我甚至尝试在发送消息之前直接运行activateSession方法,但我仍然收到错误。如果有人可以帮助解释发生了什么,那将是非常好的,谢谢! :)
答案 0 :(得分:3)
您应该在WatchKit Extension和iOS应用目标上激活WatchConnectivity会话。例如,您可以在InterfaceController的
中执行此操作override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
if WCSession.isSupported() {
let wcsession = WCSession.defaultSession()
wcsession.delegate = self
wcsession.activateSession()
wcsession.sendMessage(["update": "list"], replyHandler: { (dict) -> Void in
print("InterfaceController session response: \(dict)")
}, errorHandler: { (error) -> Void in
print("InterfaceController session error: \(error)")
})
}
}
并在AppDelegate
中 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if WCSession.isSupported() {
let wcsession = WCSession.defaultSession()
wcsession.delegate = self
wcsession.activateSession()
}
return true
}
我在几个例子中注意到的是,人们倾向于仅在处理请求的类中设置委托,例如如果手表要向iOS应用程序发送消息,则只能在iOS应用程序中设置代理。这是错的。正如WatchConnectivity明确指出的那样,您必须在两种情况下都设置委托,否则您将收到7004错误。
答案 1 :(得分:2)
由于Xcode 8中的“activateSession()”更改为“activate()”,您需要为您的类添加和扩展以委派会话(WCSessionDelegate),并使用以下函数对其进行扩展:
func session(_ session:WCSession,activationDidCompleteWith activationState:WCSessionActivationState,error:Error?)
为了确保异步方法“activate”成功完成。
在你的情况下:
extension YourInterfaceControllerClass : WCSessionDelegate {
func session(_ session: WCSession,
didReceiveMessage message: [String : Any],
replyHandler: @escaping ([String : Any]) -> Void)
{
//this function is mandatory and can be empty
}
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?)
{
// Your code to be executed after asynchronous activation is completed:
let message = ["request": "fireLocalNotification"]
session.sendMessage(
message, replyHandler: { (replyMessage) -> Void in }) { (error) -> Void in
print(error.localizedDescription)
}
//....
}
}
答案 2 :(得分:0)
您使用的是大数值吗?
NSDictionary *userInfo = @{
@"a1":@(1000000000), // 1000000000
@"a2":@(10000000000), // 1e+10
@"a3":@(100000000000), // crash!
};
[[WCSession defaultSession] transferUserInfo:userInfo];
在上面的代码中,key" a3"的值这是危险的,它会导致Apple Watch崩溃。
发送清单后,它将保留在Apple Watch中,直到重新安装监视应用程序。
(此崩溃发生在设备上,而不是模拟器上)