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

It is possible to detect if my framework is running as part of the main app or an extension?

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

UIDevice.currentDevice 总是 returns iPhone 因为这就是 运行 代码。我相信我可以检查 WKInterfaceDevice 是否存在,但这似乎不太优雅。

一个选项是检查当前目标的文件扩展名。这具有在共享库和框架中工作的优势,而其他选项通常只在目标本身中工作:

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

此答案由 this question and answer 告知。这些答案还概述了如何设置预处理器宏,这在某些情况下是另一个不错的选择,尽管您的框架无法访问它。

我没有将这个问题标记为那个问题的重复,但是,因为这些选项对所有应用程序扩展都是通用的,也不是特别优雅,并且可能有针对您正在尝试的 WatchKit 特定选项实现。

我特别针对 WatchKit 提出了以下建议:

[[[NSBundle mainBundle] bundleIdentifier] hasSuffix:@"watchkitextension"];

或在Swift中:

NSBundle.mainBundle().bundleIdentifier?.hasSuffix("watchkitextension")

这取决于 WatchKit 扩展 必须 具有以 watchkitextension 结尾的包 ID。