检测运行目标是App Extension还是iOS App

时间:2015-04-13 12:16:30

标签: ios objective-c target ios-app-extension ios8-today-widget

我有一个简单的应用程序,它也有iOS 8 Today Extension(或小部件)。我正在做的一件事是在我的应用程序和我的小部件之间共享代码类,因为这显然使我不必拥有相同代码的多个副本。除了我遇到的一个问题之外,这一切都很好用,其中一个API UIApplication sharedApplication会出现错误,因为你无法在iOS 8 Widgets上使用它。

所以我想到的是,有一个简单的if语句,用于检查最终目标是否是本机应用程序,或者它是否是iOS 8小部件,然后根据需要添加代码。那会有用吗?

这是我的代码:

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

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

  1. 仅运行/编译 IF 结束目标是本机iOS应用而非小部件。
  2. 检查该API是否在目标平台上可用,如果是,则使用它?
  3. 我希望我的问题有道理,感谢你的时间,Dan。

2 个答案:

答案 0 :(得分:31)

运行时检查已经结束,因为Xcode不允许您编译使用sharedApplication的扩展代码。它必须是编译时检查。

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

  1. 在今日扩展程序的项目设置中,在"其他C标志"下,添加您自己的自定义编译器宏。对于名为TODAY_EXTENSION的宏,请添加-DTODAY_EXTENSION
  2. enter image description here

    1. 在您的代码中,使用

      之类的内容检查此宏
      #ifndef TODAY_EXTENSION
      ... app-only code here ...
      #endif
      

      相反,扩展程序中应该的代码看起来像

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

答案 1 :(得分:4)

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

#define TODAY_EXTENSION YES

我个人更喜欢这种方法,因为你可以命令点击宏,无论它在哪里用于查看它的定义。