2015-09-20 4 views
5

Sto utilizzando il metodo sendMessage per inviare un messaggio dall'estensione WatchKit a un'app per iOS. Ci vuole circa 230 ms in media per ricevere una risposta. Il tempo non dipende dal fatto che l'app iOS sia sullo schermo o in esecuzione in background. 230 ms è approssimativamente il tempo impiegato dalla luce per percorrere la circonferenza della Terra e tornare indietro. Ma il telefono è seduto a 30 cm dal mio orologio quando sto testando questo.Perché inviare un messaggio dall'estensione WatchKit a iOS e ottenere una risposta è così lento?

Domande:

  1. Perché è così lento?
  2. Si suppone che sia così lento?
  3. C'è un modo per renderlo più veloce?

Un'osservazione: secondo i miei precedenti esperimenti in watchOS 1 la comunicazione era un po 'più veloce, un giro di andata usato per circa 50 ms.

Inviare un messaggio da un'estensione WatchKit

let session = WCSession.defaultSession() 

session.sendMessage(["message from watch":""], replyHandler: { reply in 
    // Getting reply from iOS app here 
}, errorHandler: nil) 

ricevere il messaggio da iOS

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

    replyHandler(["reply from iOS":""]) 
} 

Demo app: https://github.com/evgenyneu/WatchKitParentAppBenchmark

iOS 9.0, watchos: 2.0

risposta

2

AFAIK, quando si invia un messaggio ad un altro dispositivo, il messaggio verrà archiviato su file nella directory locale che ha chiamato come WatchDirectory.

Questa directory verrà sincronizzata con altri dispositivi come altre App iCloud Drive o Drop Box tramite Bluetooth. Perché questo approccio non ha bisogno dell'app in esecuzione per iOS e app watchOS mentre il trasferimento sarà finito.

Quando i nuovi file sono arrivati ​​sulla directory, iOS (o watchOS) invocherà l'API relativa a WCSession per elaborare il contenuto. Se necessario, iOS (o watchOS) risveglierà l'App di destinazione in background prima del messaggio di spedizione.

Con watchOS1, l'estensione dell'orologio funziona su iOS, solo l'interfaccia utente remota viene eseguita su AppleWatch. Quindi richiede molto più semplice processo di comunicazione, solo comunicazione tra processi.

sendMessage è un metodo molto più costoso di altre API di comunicazione fornite da WCSession. iOS non può utilizzarlo finché l'app orologio non viene eseguita in primo piano e utilizzare sendMessage da watchOS dovrebbe essere necessario riattivare iPhone e avviare l'app iOS in background. Dopo che i messaggi inviati sono stati gestiti, iOS può uccidere l'app di destinazione che è in esecuzione sullo sfondo per recuperare la memoria.

Quindi, IMO non c'è motivo per cui dovrebbe essere veloce.

0

Nel mio caso per rinfrescare la mia UI istantaneamente sul dispositivo:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    //receive message from watch 
    dispatch_async(dispatch_get_main_queue()) { 
     self.textLabel.text = message["optionSent"]! as? String 
    } 

    } 
Problemi correlati