可以检测我的框架是作为主应用程序还是扩展程序的一部分运行?

Dou*_*oug 5 iphone frameworks objective-c ios watchkit

在包含其应用程序和应用程序扩展的公共代码的iOS或OS X Framework中,有没有办法检测代码是在主应用程序或其扩展程序之一下运行?具体来说,我想检测框架是否被用作WatchKit扩展的一部分而不是App的iPhone部分.

UIDevice.currentDevice总是返回iPhone,就像运行代码一样.我相信我可以检查是否WKInterfaceDevice存在,但这似乎并不太优雅.

Dun*_*age 4

一种选择是检查当前目标的文件扩展名。这样做的优点是它可以在共享库和框架中工作,而其他选项通常只能在目标本身中工作:

+ (BOOL) isAppExtension
{
    return [[[NSBundle mainBundle] executablePath] containsString:@".appex/"];
}
Run Code Online (Sandbox Code Playgroud)

这个答案是通过这个问题和答案得知的。这些答案还概述了如何设置预处理器宏,在某些情况下这将是另一个不错的选择,尽管无法从您的框架访问。

然而,我没有将这个问题标记为该问题的重复项,因为这些选项对于所有应用程序扩展都是通用的,两者都不是特别优雅,并且可能有特定于 WatchKit 的选项来实现您想要实现的目标。