2015-03-30 52 views
6

使用WatchKit,您的应用程序可以在手机上运行,​​而手表应用程序以扩展模式运行。iOS WatchKit - 如何确定您的代码是在手表扩展模块还是应用程序中运行

如果您创建的库包含用于手机应用程序和手表扩展中的通用代码,是否有方法可以确定代码是在手机应用程序还是手表扩展中运行?

I.e.

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


- (BOOL)isRunningInWatchExtension { 
    ??? 
} 

回答

4

我已经通过检查包标识符来实现这一点:

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

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

    // Running in extension 
} 
+0

这适用于所问的问题。我没有正确地说出正确的问题来满足我的需求。在我的情况下,我正在开发一个可供其他应用程序使用的库,可用于手表扩展和主应用程序。我不能依赖包标识符,因为开发者可以根据需要命名它们。 – 2015-03-31 22:01:47

+0

也许是检查一个独特的类是否存在的东西?像'BOOL isExtension =(NSClassFromString(@“WKInterfaceDevice”)!= nil);' – 2015-04-01 04:39:25

0
  • 如果要调用在共同的框架类的任何自定义方法这可能是容易的。您只需要为方法添加其他方法参数。如果您从iOS应用程序或Watchkit应用程序调用此方法,则将相应的键值对添加到字典中以获取参数。并在你的框架方法中比较这一点。

  • 从init或任何其他方法确定这点,你仍然可以通过这个代码就知道了,

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

所以,你需要分析这个字符串,并获得相应的目标名称。如果它被iOS应用程序调用,那么您将获得'UIKit'字符串,并且从手表套件应用程序扩展中,您将获得'YourApp WatchKit Extension'字符串。您也可以参考这个苏答案解析这个字符串和比较它 - https://stackoverflow.com/a/9603733/602997

8

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

#if TARGET_OS_WATCH 
//do something for watch 
#else 
//do something for ios ==> assuming you only support two platforms 
#endif 
相关问题