Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: "Message reply took too long" - WCSession Watch OS2

So I am using Watch Connectivity to request an array from the iPhone to the Watch.

The idea was to sendMessage from the watch, and the iPhone will reply with the array within the didReceiveMessage method.

However the iPhone does not seem to be responding, I thought the iPhone would open the application when I send the message from the Watch. I have tried even opening the application when I sendMessage but still no luck. When I wait long enough I get the following error message:

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

Does anybody know where I may be going wrong ?

Apple 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)")        
}

The console outputs

WCSession is reachabe Array nil

iPhone App Delegate

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)

}

Nothing from the iPhone is being executed. Even when I manually open the app.

like image 943
RileyDev Avatar asked Feb 02 '16 18:02

RileyDev


1 Answers

If you want the reply to the message the watch sent to contain the requested data, you should change your code to the following:

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

Phone

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)

}

And separately, the reason why the sendMessage from the phone is not received by the watch is because you've implemented the wrong delegate method for the sendMessage invocation you are using.

If you call sendMessage with a nil replyHandler then this delegate method will be invoked on the receiving side: func session(session: WCSession, didReceiveMessage message: [String : AnyObject])

If you call sendMessage with a non-nil replyHandler then this delegate method will be invoked on the receiving side: func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

like image 185
ccjensen Avatar answered Oct 17 '22 12:10

ccjensen