我在调用 session.activateSession() 方法时遇到无法激活 WatchKit 连接 session 的问题。这是我用来设置 session 的代码。

if (WCSession.isSupported()) {
    session = WCSession.defaultSession()
    session.delegate = self // conforms to WCSessionDelegate
    session.activateSession()
    print("Session has been activated")
}

但是,我在打印行上放置了一个断点,当我检查 session 对象时,它说 sessionActivated 属性仍然为 false,即使在调用 activateSession 之后也是如此。当我调用 activate session 时,我似乎没有遇到任何类型的错误,所以我认为它应该有效,但事实并非如此。

此外,如果我稍后在我的代码中尝试在 session 对象上使用 sendMessage 方法,如下所示 -
let message = ["request": "fireLocalNotification"]
session.sendMessage(
    message, replyHandler: { (replyMessage) -> Void in }) { (error) -> Void in
        print(error.localizedDescription)
    }

我收到错误代码“无法完成操作。(WCErrorDomain 错误 7004。)”,我查找了它,意思是“WCErrorCodeSessionNotActivated”。这是我认为 activateSession 方法没有正确调用的另一个原因。我什至尝试在发送消息之前直接在该行运行 activateSession 方法,但我仍然收到错误消息。如果有人可以帮助解释发生了什么,那就太好了,谢谢! :)

最佳答案

您应该在 WatchKit 扩展和 iOS 应用程序目标上激活 WatchConnectivity session 。例如,您可以在 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
}

我在几个例子中注意到的是,人们倾向于只在处理请求的类中设置委托(delegate),例如如果 watch 要向 iOS 应用程序发送消息,则只能在 iOS 应用程序中设置委托(delegate)。这是错误的。正如 WatchConnectivity 明确指出的那样,您必须在两种情况下都设置委托(delegate),否则您将收到 7004 错误。

10-08 12:14