【问题标题】:WCSession Failing to ActivateWCSession 激活失败
【发布时间】:2023-03-31 10:20:02
【问题描述】:

当我调用 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 方法,但我仍然收到错误消息。如果有人可以帮助解释发生了什么,那就太好了,谢谢! :)

【问题讨论】:

  • 此代码运行时是否有任何内容记录到系统日志中? (如果代码在设备上运行你可以使用Xcode查看,如果是模拟器你可以使用debug菜单打开模拟器的syslog)
  • 你能修复它吗?,我也面临同样的错误。

标签: iphone watchkit ios9


【解决方案1】:

您应该在 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 错误。

【讨论】:

    【解决方案2】:

    由于 Xcode 8 中“activateSession()”更改为“activate()”,您需要为您的类添加和扩展来委托会话(WCSessionDelegate),并使用函数对其进行扩展:

    func session(_ session: 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)
        }
    
         //....
    
       }
    }
    

    【讨论】:

      【解决方案3】:

      您是否使用大数值?

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-11-15
        • 2023-04-03
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 2011-06-20
        • 2020-02-29
        相关资源
        最近更新 更多