iOS WatchKit – 如何确定您的代码是否在手表扩展程序或应用程序中运行

使用WatchKit,您可以在手机上运行您的应用程序,以及作为扩展程序运行的手表应用程序。

如果您创build了一个库,其中包含在手机应用程序和手表分机中都使用的通用代码,是否有办法确定代码是在手机应用程序还是手表分机中运行?

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

我已经通过检查包标识符来完成这个工作:

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

在目标条件中有一些条件可以帮助你,

 #if TARGET_OS_WATCH //do something for watch #else //do something for ios ==> assuming you only support two platforms #endif 
  • 如果您在公共框架类中调用任何自定义方法,这可能很容易。 你只需要添加额外的方法参数的方法。 如果您从iOS应用程序或Watchkit应用程序调用此方法,则将相应的键值对添加到字典中以获取参数。 并在你的框架方法比较这一点。

  • 要从init或其他方法来确定这个,那么你仍然可以通过这个代码知道,

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

所以,你需要parsing这个string并获取合适的目标名称。 如果它是由iOS应用程序调用,那么你会得到' UIKit 'string,从手表套件应用程序扩展你会得到' YourApp WatchKit扩展 'string的地方。 你也可以参考这个解答这个string的答案,并比较它 – https://stackoverflow.com/a/9603733/602997