ios - 错误 : "Message reply took too long" - WCSession Watch OS2

标签 ios swift watchconnectivity wcsession

所以我正在使用 Watch Connectivity 来请求从 iPhone 到 Watch 的数组。

想法是从 watch sendMessage,iPhone 将在didReceiveMessage 方法中回复数组。

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

Error Domain=WCErrorDomain Code=7012 "Message reply took too long." UserInfo={NSLocalizedDescription=Message reply took too long., NSLocalizedFailureReason=Reply timeout occured.}

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

苹果 watch

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 is reachabe Array nil

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 中没有任何内容正在执行。即使我手动打开应用程序。

最佳答案

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

观看

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)

}

另外, watch 未收到来自手机的 sendMessage 的原因是您为正在使用的 sendMessage 调用实现了错误的委托(delegate)方法。

如果您使用 nil replyHandler 调用 sendMessage,那么此委托(delegate)方法将在接收方调用: func session(session: WCSession, didReceiveMessage message: [String : AnyObject])

如果您使用 非 nil replyHandler 调用 sendMessage,那么此委托(delegate)方法将在接收方调用: func session(session: WCSession, didReceiveMessage 消息: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

关于ios - 错误 : "Message reply took too long" - WCSession Watch OS2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35160934/

相关文章:

ios - Objective-C 中的类继承和自定义 ^block 执行

ios - 当 View Controller 消失时会调用 deinit 吗?

ios - 如何在 iOS 应用程序(Swift)中单击选项卡栏项目时重定向到 rootviewcontroller

ios - 在 Swift 中设置导航栏高度

ios - 如何诊断和解决 WCSession sendMessage(_ :replyHandler:errorHandler:)?

ios - 通过 sendMessage 发送一个巨大的字典 - WatchKit

ios - 在后台运行的 swift WatchConnectivity - ApplicationContext 并非一直运行

html - 如何禁用 iOS Chrome 密码/信用卡自动填充?

ios - 从不同 VC 访问时,带有完成处理程序的 API 调用函数崩溃

ios - 在 iOS 应用程序中存储 token 的最佳实践