检测运行目标是应用程序扩展还是iOS应用程序

我有一个简单的应用程序,也有一个iOS 8的今天扩展(或小工具)。 我正在做的事情之一是在我的应用程序和我的小部件之间共享代码类,因为显然这使我不必拥有相同代码的多个副本。 这一切工作得很好,除了我有一个问题,其中一个API UIApplication sharedApplication提出了一个错误,因为你不能使用iOS 8的Widgets。

所以我在想的是有一个简单的if语句来检查最终目标是本地应用程序还是iOS 8窗口小部件,然后根据需要添加代码。 这会工作吗?

这是我的代码:

 if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { CGSize ssz = sz; sz = CGSizeMake(ssz.height, ssz.width); } 

如何更改此代码,以便可以执行下列操作之一:

  1. 只有运行/编译如果最终目标是本机iOS应用程序,而不是一个小部件。
  2. 或者检查该API是否在目标平台上可用,如果是,则使用它?

我希望我的问题对你的时间有意义和感谢,Dan。

运行时检查已经结束,因为Xcode不会让你编译使用sharedApplication扩展代码。 它必须是一个编译时检查。

不幸的是,这个检查不是内置的,你必须添加它。 您需要执行以下操作:

  1. 在今天扩展的项目设置中,在“其他C标志”下,添加您自己的自定义编译器macros。 对于名为TODAY_EXTENSION的macros,添加-DTODAY_EXTENSION

在这里输入图像说明

  1. 在你的代码中,使用类似的东西来检查这个macros

     #ifndef TODAY_EXTENSION ... app-only code here ... #endif 

    相反, 只能在扩展中存在的代码看起来像

     #ifdef TODAY_EXTENSION ... extension-only code here ... #endif 

汤姆的回答是正确的。 另一种方法是为prefix扩展目标在prefix.pch文件中定义macros,假设您为每个目标使用单独的前缀文件。

 #define TODAY_EXTENSION YES 

我个人比较喜欢这个方法,因为你可以通过命令点击macros到​​任何地方看看它的定义。