2015-12-25 15 views
10

Sto sviluppando un'estensione watchOS che utilizza WCSession per comunicare con l'iPhone. Tuttavia, non possiedo un Apple Watch e quindi devo fare affidamento su Watch Simulator per testare il mio codice.Come verificare lo scenario in cui Apple Watch non è collegato a un iPhone

C'è un modo per testare lo scenario in cui l'orologio è disconnesso dal telefono nel simulatore?

In caso contrario, c'è qualche documentazione o un post del blog ben studiato che fornisce alcune informazioni sul comportamento di WCSession in questo caso?

risposta

3

Chiudere il simulatore di iPhone dovrebbe consentire di approssimare questo scenario.

+0

Buona idea! Sono davvero in grado di inviare i dati a iPhone dopo aver lasciato il simulatore. Tuttavia, 'session.reachable' è ancora' true' sull'orologio e l'errore che ottengo in 'errorHandler' di' sendMessage (...) 'è' Code = 7001 "Errore di WatchConnectivity sconosciuto." 'W/il sottostante errore essendo 'Code = 23" Time out "'. È questo ciò che si ottiene quando l'iPhone non è raggiungibile? – fabian789

+0

Questo è un possibile errore, ma solo se si colpisce una gara abbastanza piccola. L'altro più probabile è l'errore non raggiungibile (credo 7007). – ccjensen

+0

Ok. Secondo 'WCError.h', è effettivamente 7007. Ma di solito,' session.reachable' sarebbe 'false' quando l'iPhone si disconnette? – fabian789

2

Io non la penso così la sua possibile perché Apple doc dice,

Inoltre, le applicazioni WatchKit hanno una connessione affidabile al dispositivo host simulato perché entrambi sono in esecuzione nel simulatore.

Apple ha parlato di questo in Hardware sezione Differenza di Simulator User Guide

+0

Link interessante, grazie! Tuttavia, a mio parere, ciò non esclude completamente la possibilità che ci sia un modo _some_ per simulare il mio scenario! – fabian789

1

Si dovrebbe utilizzare una query se-, se l'iPhone è raggiungibile prima di iniziare un WC Richiesta:

if (WCSession.defaultSession().reachable) { 

    //do your request here 

} else { 

    //handle non-reachability 

} 

Se si desidera verificare la reazione della tua app su una non raggiungibilità sostituisce semplicemente WCSession.defaultSession().reachable con false.

+0

Grazie per l'input, ma intendevo "test" nel senso di testare il mio codice, non come verificare la raggiungibilità _in_ code :) – fabian789

1

Capisco che in realtà desideri uno scenario di test.

Ma quale direzione di comunicazione vuoi testare? Se si controlla la documentazione di WCSession, viene sempre indicato il comportamento per l'orologio e il dispositivo iOS.

Inoltre, cosa intendi con "disconnesso"?

È possibile verificare la WCSession.defaultSession().reachable ma documentazione afferma

Su iOS, il valore è YES quando l'Apple Osservare abbinato è in campo e Watch applicazione associata è in esecuzione in primo piano.

È possibile verificare per paired, ma è anche necessario verificare per watchAppInstalled.

Credo che tutta la comunicazione sia asincrona. Vuoi controllare il codice errorHandler: come in

- (void)sendMessageData:(NSData *)data 
    replyHandler:(void (^)(NSData *replyMessageData))replyHandler 
    errorHandler:(void (^)(NSError *error))errorHandler 

penso che non è possibile testarlo su un simulatore. È possibile copiare temporaneamente il codice errorHandler per rispondere aHandler per il test.

ecco il codice che uso per testare la disponibilità:

if WCSession.isSupported() { 
    let session = WCSession.defaultSession() 
    session.delegate = _modelController 
    session.activateSession() 
    _modelController!.transferArrayToWatchWithSession() 
} 

e all'interno della _modelController

func transferArrayToWatchWithSession() { 
    let session = WCSession.defaultSession() 
    if WCSession.isSupported() && session.watchAppInstalled { 
     session.transferUserInfo([kWatchControlsDictKey:self.verifiedWatchArray]) 
    } else { 
     log.info(....") 
    } 
} 
+0

Vorrei testare o "simulare" lo scenario reale in cui l'iPhone non è vicino all'orologio e vedere come si comporta l'API 'WatchConnectivity'. – fabian789

0

Uscire il simulatore di iPhone, mentre il simulatore di Apple Osservare è in esecuzione raggiunge lo stato specifico che si descrivi ... Come con un Apple Watch attuale, il simulatore di orologio mostrerà un'icona di telefono scollegata nella parte superiore dello schermo quando esci da iPhone Simulator. Vedi l'immagine qui sotto.

C'è un altro stato da considerare, ovvero che WCSession può comunicare solo quando le due app sono entrambe in primo piano. Pertanto, dovresti anche testare lo scenario in cui sono collegati Watch e iPhone (entrambi i simulatori sono in esecuzione) ma l'app per iPhone non è in primo piano. (E allo stesso modo, con l'app per iPhone in primo piano mentre l'orologio è connesso ma l'app Orologio non è in primo piano.) Apple Watch Simulator with disconnected iPhone Simulator

+0

Purtroppo questo non sembra funzionare per me in Xcode 8. Inoltre, il bit relativo all'app per iPhone in background non è corretto; l'app per iPhone può essere comunicata mentre è in background, ma non l'app di controllo. –

Problemi correlati