2016-02-02 12 views
6

Così sto usando Guarda la connettività per richiedere una matrice da iPhone per l'orologio.errore: "Messaggio di risposta ha impiegato troppo tempo" - WCSession Guarda OS2

L'idea era di sendMessage dall'orologio e l'iPhone risponderà con l'array all'interno del metodo didReceiveMessage.

Tuttavia l'iPhone non sembra essere la risposta, ho pensato che l'iPhone avrebbe aperto l'applicazione quando invio il messaggio dall'orologio. Ho provato anche ad aprire l'applicazione quando ho sendMessage ma ancora senza fortuna. Quando aspetto abbastanza a lungo ottengo il seguente messaggio di errore:

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

Qualcuno sa dove potrei aver sbagliato?

Apple Osservare uscite

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

la console

WCSession is reachabe Array nil

iPhone App delegato viene eseguito

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) 

} 

Nulla da iPhone. Anche quando apro manualmente l'app.

+0

Il tuo codice mi sta bene. Solo una domanda, stai usando gli stessi dati fittizi ('[" Array ": [" One "," Two "," Three "]]'), giusto? Perché se si dispone di un altro blocco di codice in esecuzione per inviare i dati effettivi, potrebbe esserci qualche altro problema. Per esempio. Una matrice di oggetti personalizzati non può essere comunicata alla Watch App in questo modo. – Gandalf

+0

@Gandalf Stavo per esercitarmi con una serie di stringhe che prima venivano inviate e stampate all'interno delle funzioni di WCSession. Il mio obiettivo era quello di inviare una serie di NSManagedObject per l'orologio da visualizzare nella tabella. Quindi, in pratica, il gestore delle risposte sul telefono inviava il dizionario e una serie di oggetti all'orologio. Davvero strano come non riesca a rispondere al telefono:/Potrei aggiornare Xcode con la nuova versione e sperare per il meglio – RileyDev

risposta

3

Se si desidera che la risposta al messaggio l'orologio inviato per contenere i dati richiesti, è necessario modificare il codice per il seguente:

Guarda

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

Telefono

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) 

} 

E a parte, il motivo per cui il sendMessage dal telefono non viene ricevuto entro l'orologio è perché hai implementato il metodo delegato sbagliato per l'invocazione sendMessage che si sta utilizzando.

Se si chiama sendMessage con un replyHandler nil allora questo metodo delegato verrà richiamato sul lato ricevente: func session(session: WCSession, didReceiveMessage message: [String : AnyObject])

Se si chiama sendMessage con un non-nil replyHandler allora questo metodo delegato sarà invocato dal lato ricevente: func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

+0

Grazie per aver risposto, quindi ho cambiato il codice per quello che hai suggerito, mi spiace non sono sicuro di quello che stai dicendo ricevere il messaggio sull'orologio da iPhone. Stai dicendo che dovrei cambiare 'func session (session: WCSession, didReceiveMessage message: [String: AnyObject]) {print (" messaggio ricevuto da iphone \ (message) ")}'? Anche con gli aggiornamenti correnti, ottengo il seguente output nella console. WCSession è raggiungibile Array nil Programma terminato con codice di uscita: 0' – RileyDev

+0

strano; forse prova a cambiare 'print (" Array \ (replyDict ["array"]) ")' a 'print (" replyDict \ (replyDict) ")' – ccjensen

0

È necessario attivare la sessione prima di inviare il messaggio. Inoltre, è necessario impostare il delegato prima di attivare la sessione in quanto si potrebbero perdere alcuni messaggi in sospeso.

iphone lato:

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 estensione InterfaceController È necessario attivare la sessione nel metodo di controller di interfaccia 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)") 
} 
} 

Nota. Esegui prima l'applicazione iphone. Quindi esegui l'estensione e mantieni l'app per iPhone in primo piano.

+0

Scusa se ho aggiornato la mia domanda con il codice completo, avevo già attivato il sessione e impostare il delegato. – RileyDev

+0

@JKSDEV Lato orologio: non è stato inizializzato l'array di oggetti. Si prega di creare oggetti array vuoti = [] nel metodo willActivate. –

Problemi correlati