【问题标题】:Error: "Message reply took too long" - WCSession Watch OS2错误:“消息回复时间过长” - WCSession Watch OS2
【发布时间】:2016-02-02 18:15:24
【问题描述】:

所以我使用 Watch Connectivity 从 iPhone 向 Watch 请求一个数组。

这个想法是从手表到sendMessage,iPhone 将在didReceiveMessage 方法中回复数组。

但是 iPhone 似乎没有响应,我认为当我从 Watch 发送消息时 iPhone 会打开应用程序。当我sendMessage 时,我什至尝试打开应用程序,但仍然没有运气。当我等待足够长的时间时,我会收到以下错误消息:

Error Domain=WCErrorDomain Code=7012 "消息回复时间过长。" UserInfo={NSLocalizedDescription=消息回复时间过长。, NSLocalizedFailureReason=回复超时。}

有人知道我哪里出错了吗?

苹果手表

import WatchKit
import Foundation
import CoreData
import WatchConnectivity

class BookmarkedInterfaceController: WKInterfaceController, WCSessionDelegate {

var session : WCSession!
var objects: [AnyObject]!

@IBOutlet var table: WKInterfaceTable!

override func willActivate() {
    super.willActivate()
    //Check if session is supported and Activate
    if (WCSession.isSupported()) {
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
    sendMessageToIphone()
}
func sendMessageToIphone() {
    if WCSession.defaultSession().reachable {

        print("WCSession is reachabe")

        let messageDict = ["Request": "iPhone Can You Give Me The Array"]
        WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
            print(replyDict)
            }, errorHandler: { (error) -> Void in
                print(error)
        })
    }
}

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
   //recieving message from iphone
    print("recieved message from iphone \(message)")

    objects.append(message["Array"]!)

    print("Objects array = \(objects)")        
}

控制台输出

WCSession 可达 数组无

iPhone 应用代理

import UIKit
import CoreData
import WatchConnectivity

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {

var window: UIWindow?
var session : WCSession!

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    //Check if session is supported and Activate
    if (WCSession.isSupported()) {
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
}

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    print("did recieve message from Watch")

    let applicationData = ["Array":["One", "Two", "Three"]]

    replyHandler(applicationData)

}

没有执行任何来自 iPhone 的操作。即使我手动打开应用程序。

【问题讨论】:

  • 您的代码对我来说看起来不错。只有一个问题,您使用的是相同的虚拟数据 (["Array":["One", "Two", "Three"]]),对吗?因为如果您运行其他一些代码块来发回实际数据,那么可能会完全存在其他一些问题。例如。无法像这样将自定义对象数组传回给 Watch App。
  • @Gandalf 我将首先练习在 WCSession 函数中发送和打印的字符串数组。我的目标是将一组 NSManagedObject 发送到 Watch 以显示在表中。所以基本上电话上的回复处理程序会将字典和对象数组发送到手表。真的很奇怪我怎么无法让手机响应:/ 可能会用新版本更新 Xcode 并希望最好

标签: ios swift watchconnectivity wcsession


【解决方案1】:

如果您希望对手表发送的消息的回复包含所请求的数据,您应该将您的代码更改为以下内容:

观看

func sendMessageToIphone() {
    if WCSession.defaultSession().reachable {

        print("WCSession is reachabe")

        let messageDict = ["Request": "iPhone Can You Give Me The Array"]
        WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
            print("Array \(replyDict["array"])")
            }, errorHandler: { (error) -> Void in
                print(error)
        })
    }
}

电话

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    print("did recieve message from Watch")

    let applicationData = ["Array":["One", "Two", "Three"]]

    //If identifier from recievedMessage is for Objects

    replyHandler(applicationData)

}

另外,手表没有收到来自手机的 sendMessage 的原因是您为正在使用的 sendMessage 调用实现了错误的委托方法。

如果你用 nil replyHandler 调用 sendMessage,那么这个委托方法将在接收端被调用: func session(session: WCSession, didReceiveMessage message: [String : AnyObject])

如果您使用 non-nil replyHandler 调用 sendMessage,则此委托方法将在接收端调用: func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

【讨论】:

  • 感谢您的回复,因此我将代码更改为您建议的代码,抱歉,我不确定您在从 iPhone 接收手表上的消息时说什么。你是说我应该改变func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { print("recieved message from iphone \(message)") } 吗?此外,随着他当前的更新,我在控制台中得到以下输出。WCSession is reachable Array nil Program ended with exit code: 0
  • 奇怪;也许尝试将print("Array \(replyDict["array"])") 更改为print("replyDict \(replyDict)")
【解决方案2】:

您必须在发送消息之前激活会话。此外,您必须在激活会话之前设置委托,因为您可能会丢失一些待处理的消息。

iphone端:

import UIKit
import WatchConnectivity

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {

var window: UIWindow?
var session : WCSession!

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    print("did recieve message from Watch")
    let applicationData = ["Array":["One", "Two", "Three"]]

    //If identifier from recievedMessage is for Objects
    session.sendMessage(applicationData, replyHandler: { reply in
        print("Got reply: \(reply)")
        }, errorHandler: { error in
            print("error: \(error)")
    })
}

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    session = WCSession.defaultSession()
    session.delegate = self
    session.activateSession()
    return true
}
}

iWatch 扩展接口控制器 您必须在接口控制器 willactivate 方法中激活会话。

import WatchKit
import Foundation
import WatchConnectivity

class InterfaceController: WKInterfaceController, WCSessionDelegate {

var session : WCSession!
var objects: [AnyObject]!

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)

    // Configure interface objects here.
}
override func willActivate() {
    // This method is called when watch view controller is about to be visible to user
    super.willActivate()
    session = WCSession.defaultSession()
    session.delegate = self
    session.activateSession()
    objects = []
    sendMessageToIphone()
}

override func didDeactivate() {
    // This method is called when watch view controller is no longer visible
    super.didDeactivate()
}

func sendMessageToIphone() {
    if WCSession.defaultSession().reachable{

        print("WCSession is reachabe")

        let messageDict = ["Request": "iPhone Can You Give Me The Array"]
        WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
            print(replyDict)
            }, errorHandler: { (error) -> Void in
                print(error)
        })
    }
}

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
    //recieving message from iphone
    print("recieved message from iphone \(message)")

    objects.append(message["Array"]!)

    print("Objects array = \(objects)")
}
}

注意。首先运行 iphone 应用程序。然后运行扩展程序并将 iphone 应用程序保持在前台。

【讨论】:

  • 对不起,我已经用完整的代码更新了我的问题,我已经激活了会话并设置了委托。
  • @JKSDEV 在观察方面:您尚未初始化对象数组。请在 willActivate 方法中创建空数组 objects = []。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2015-12-12
相关资源
最近更新 更多