在iOS或OS X Framework中,包含其应用程序和应用扩展程序的公共代码,有没有办法检测代码是在主应用程序或其扩展程序之一下运行?具体来说,我想检测框架是否被用作WatchKit扩展的一部分而不是App的iPhone部分。
UIDevice.currentDevice
总是返回iPhone,就像运行代码一样。我相信我可以检查WKInterfaceDevice
是否存在,但这似乎并不太优雅。
答案 0 :(得分:4)
一种选择是检查当前目标的文件扩展名。这样做的好处是它可以在共享库和框架中工作,而其他选项通常只能在目标本身内工作:
+ (BOOL) isAppExtension
{
return [[[NSBundle mainBundle] executablePath] containsString:@".appex/"];
}
this question and answer通知了这个答案。这些答案还概述了如何设置预处理器宏,在某些情况下这将是另一个好的选择,尽管无法从您的框架中访问。
然而,我没有将此问题标记为该问题的副本,因为这些选项对于所有App扩展都是通用的,也不是特别优雅,并且可能有WatchKit特定选项用于您要实现的目标
答案 1 :(得分:3)
特别是对于WatchKit,我想出了以下内容:
[[[NSBundle mainBundle] bundleIdentifier] hasSuffix:@"watchkitextension"];
或者在Swift中:
NSBundle.mainBundle().bundleIdentifier?.hasSuffix("watchkitextension")
这取决于WatchKit扩展必须具有以watchkitextension结尾的包ID的事实。