2015-03-30 4 views
6

Mit WatchKit haben Sie Ihre App, die auf dem Telefon läuft, und die Watch-App, die als Erweiterung läuft.iOS WatchKit - wie Sie feststellen, ob Ihr Code in der Watch-Erweiterung oder der App läuft

Wenn Sie eine Bibliothek erstellen, die gemeinsamen Code enthält, der sowohl in der Telefon-App als auch in der Überwachungserweiterung verwendet werden soll, gibt es eine Möglichkeit zu ermitteln, ob der Code in der Telefon-App oder der Wache-Erweiterung ausgeführt wird?

I.e.

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


- (BOOL)isRunningInWatchExtension { 
    ??? 
} 

Antwort

4

Ich habe dies erreicht, indem die Bündelkennung Überprüfung:

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

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

    // Running in extension 
} 
+0

Dies funktioniert für die gestellte Frage. Ich habe die Frage nicht richtig formuliert, um meine Bedürfnisse zu erfüllen. In meinem Fall entwickle ich eine Bibliothek, die von anderen Anwendungen verwendet werden kann, sowohl in der Watch-Erweiterung als auch in der Haupt-App. Ich kann mich nicht auf Bündel-Identifikatoren verlassen, da die Entwickler sie benennen können, was immer sie wollen. –

+0

Vielleicht etwas, das überprüft, ob eine eindeutige Klasse existiert? Wie 'BOOL isExtension = (NSClassFromString (@" WKInterfaceDevice ")! = Nil);' –

0
  • Dies kann einfach sein, wenn Sie in Ihrem gemeinsamen Rahmen Klasse alle benutzerdefinierten Methoden aufrufen. Sie müssen der Methode nur zusätzliche Methodenparameter hinzufügen. Und wenn Sie diese Methode von der iOS-App oder der Watchkit-App aus aufrufen, fügen Sie das entsprechende Schlüssel/Wert-Paar dem Wörterbuch für die Parameter hinzu. Und vergleichen Sie dies in Ihren Framework-Methoden.

  • Um dies von init oder jede andere Methode zu bestimmen, dann können Sie immer noch durch diesen Code kennen lernen,

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

So müssen Sie diese Zeichenfolge analysieren und entsprechende Zielnamen zu erhalten. Wenn es von iOS-App aufgerufen wird, dann erhalten Sie 'UIKit' String und von Watch Kit App-Erweiterung erhalten Sie 'YourApp WatchKit Erweiterung' Zeichenfolge irgendwo. Sie können auch diese Zeichenfolge beziehen sich diese Frage beantworten SO zum Parsen und vergleichen sie - https://stackoverflow.com/a/9603733/602997

8

In Ziel conditionals gibt es einige conditionals die Ihnen helfen können,

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