WCSession 激活失败

问题描述 投票:0回答:3

当我调用

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
方法,但我仍然收到错误。如果有人能帮忙解释一下发生了什么,那就太好了,谢谢! :)

iphone watchkit ios9
3个回答
3
投票

您应该在 WatchKit 扩展和 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 错误。


3
投票

自从 Xcode 8 中

activateSession()
更改为
activate()
以来,您需要为您的类添加和扩展以委托会话(
WCSessionDelegate
),并使用以下函数扩展它:

func 会话(_会话:WCSession,activationDidCompleteWith 激活状态:WCSessionActivationState,错误:错误?)

为了确保异步方法

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)
    }
    
     //....
    
   }
}

0
投票

您使用的是大数值吗?

NSDictionary *userInfo = @{
                           @"a1":@(1000000000),   // 1000000000
                           @"a2":@(10000000000),  // 1e+10
                           @"a3":@(100000000000), // crash!
                           };
[[WCSession defaultSession] transferUserInfo:userInfo];

在上面的代码中,键“a3”的值是危险的,它会导致Apple Watch崩溃。

发送列表后,它会保留在 Apple Watch 中,直到重新安装手表应用程序为止。

(此崩溃发生在设备上,而不是模拟器上)

© www.soinside.com 2019 - 2024. All rights reserved.