2015-03-30 12 views
6

Dzięki WatchKit masz aplikację, która działa w telefonie, oraz w aplikacji do oglądania, która działa jako rozszerzenie.iOS WatchKit - sposób sprawdzania, czy kod działa w rozszerzeniu zegarka lub aplikacji

Jeśli utworzysz bibliotekę zawierającą wspólny kod, który będzie używany zarówno w aplikacji telefonu, jak i rozszerzeniu zegarka, czy istnieje sposób sprawdzenia, czy kod jest uruchomiony w aplikacji telefonu lub w rozszerzeniu oglądania?

tj.

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


- (BOOL)isRunningInWatchExtension { 
    ??? 
} 

Odpowiedz

4

Mam dokonał tego poprzez sprawdzenie identyfikatora zestawie:

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

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

    // Running in extension 
} 
+0

To działa na pytanie, które zadano. Nie dość poprawnie sformułowałem pytanie, aby dopasować je do moich potrzeb. W moim przypadku tworzę bibliotekę, która może być używana przez inne aplikacje, zarówno w rozszerzeniu oglądania, jak i głównej aplikacji. Nie mogę polegać na identyfikatorach pakietów, ponieważ programiści mogą nadawać im dowolne nazwy. –

+0

Być może coś, co sprawdza, czy istnieje wyjątkowa klasa? Jak 'BOOL isExtension = (NSClassFromString (@" WKInterfaceDevice ")! = Zero);' –

0
  • To może być łatwe, jeśli dzwonisz wszelkie niestandardowe metody w swojej wspólnej klasy ramowej. Trzeba tylko dodać do metody dodatkowe parametry metody. A jeśli wywołujesz tę metodę z aplikacji iOS lub aplikacji Watchkit, dodaj odpowiednią parę słów do słownika parametrów. Porównaj to w swoich metodach.

  • Aby ustalić to z Init lub jakiejkolwiek innej metody następnie można jeszcze poznać przez ten kod,

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

Tak, trzeba przeanalizować ten ciąg i uzyskać odpowiednie nazwy docelowych. Jeśli zostanie wywołana przez aplikację na iOS, otrzymasz ciąg "UIKit", a z rozszerzenia aplikacji zestawu do zegarka otrzymasz "" YourPatch WatchKit Extension "ciąg gdzieś. Można również odnieść to SO odpowiedzieć parsowania ten ciąg i porównać go - https://stackoverflow.com/a/9603733/602997

8

W warunkowych docelowych istnieją pewne warunkowe, które mogą pomóc,

#if TARGET_OS_WATCH 
//do something for watch 
#else 
//do something for ios ==> assuming you only support two platforms 
#endif 
Powiązane problemy