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

时间:2015-03-30 19:50:17

标签: ios watchkit

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

如果您创建的库包含要在手机应用和手表扩展程序中使用的公共代码,是否有办法判断代码是在手机应用程序还是手表扩展程序中运行?

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


- (BOOL)isRunningInWatchExtension {
    ???
}

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:4)

我通过检查包标识符来完成此操作:

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

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

    // Running in extension
}

答案 2 :(得分:0)

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

  • 要从init或任何其他方法确定这一点,您仍然可以通过此代码了解

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

因此,您需要解析此字符串并获取适当的目标名称。如果它被iOS应用程序调用,那么您将获得“ UIKit ”字符串,并且从监视工具包应用程序扩展中,您将在某处获得“ YourApp WatchKit扩展”字符串。您也可以参考此SO答案来解析此字符串并进行比较 - https://stackoverflow.com/a/9603733/602997