2015-03-30 11 views
6

Con WatchKit hai l'app che funziona sul telefono e l'app di controllo che funziona come un'estensione.WatchKit iOS - come determinare se il codice è in esecuzione nell'estensione dell'orologio o nell'app

Se si crea una libreria che contiene codice comune da utilizzare sia nell'app per telefono che nell'estensione dell'orologio, esiste un modo per sapere se il codice è in esecuzione nell'app del telefono o nell'estensione dell'orologio?

I.e.

if ([self isRunningInWatchExtension]) { 
    NSLog(@"this is running on watch"); 
} else { 
    NSLog(@"this is running on phone app"); 
} 


- (BOOL)isRunningInWatchExtension { 
    ??? 
} 

risposta

4

ho compiuto questo controllando l'identificatore bundle:

if ([[[NSBundle mainBundle] bundleIdentifier] isEqualToString:kAppBundleIdentifier]) { 

    // Running in main app 
} 
else if ([[[NSBundle mainBundle] bundleIdentifier] isEqualToString:kWatchBundleIdentifier]) { 

    // Running in extension 
} 
+0

Questo funziona per la domanda come richiesto. Non ho pronunciato correttamente la domanda per adattarla alle mie esigenze. Nel mio caso sto sviluppando una libreria che può essere utilizzata da altre applicazioni, sia nell'estensione dell'orologio che nell'applicazione principale. Non posso fare affidamento sugli identificatori di bundle poiché gli sviluppatori possono nominarli come vogliono. –

+0

Forse qualcosa che controlla se esiste una classe unica? Come 'BOOL isExtension = (NSClassFromString (@" WKInterfaceDevice ")! = Nil);' –

0
  • Questo può essere facile se si sta chiamando tutti i metodi personalizzati nella classe quadro comune. Hai solo bisogno di aggiungere ulteriori parametri del metodo al metodo. E se chiami questo metodo dall'app per iOS o dall'app Watchkit, aggiungi la coppia chiave-valore appropriata al dizionario per i parametri. E confronta questo nei tuoi metodi quadro.

  • Per determinare questo da init o qualsiasi altro metodo, allora si può ancora arrivare a conoscere da questo codice,

    NSLog(@"%@",[NSThread callStackSymbols]); 
    

Quindi, è necessario analizzare questa stringa e ottenere nomi di destinazione appropriate. Se viene chiamato dall'app per iOS, riceverai la stringa "UIKit" e dall'estensione dell'app del kit di vigilanza verrà visualizzata la stringa "YourApp WatchKit Extension". È anche possibile consultare questo SO rispondere per l'analisi questa stringa e confrontarla - https://stackoverflow.com/a/9603733/602997

8

In condizionali di destinazione ci sono alcune condizionali che possono aiutare,

#if TARGET_OS_WATCH 
//do something for watch 
#else 
//do something for ios ==> assuming you only support two platforms 
#endif 
Problemi correlati