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

Detect whether run target is App Extension or iOS App

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

所以我想的是有一个简单的 if 语句,它检查最终目标是本机应用程序还是 iOS 8 小部件,然后在适当的地方添加代码。那行得通吗?

这是我的代码:

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

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

  1. 只有 run/compile IF 最终目标是本机 iOS 应用程序而不是小部件。
  2. 检查API 在目标平台上是否可用,如果可用就使用它?

我希望我的问题是有道理的,感谢你抽出时间,Dan。

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

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

  1. 在 today 扩展的项目设置中,在 "Other C Flags" 下添加您自己的自定义编译器宏。对于名为 TODAY_EXTENSION 的宏,添加 -DTODAY_EXTENSION:

  1. 在您的代码中,使用类似

    的方式检查此宏
    #ifndef TODAY_EXTENSION
    ... app-only code here ...
    #endif
    

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

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

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

#define TODAY_EXTENSION YES

我个人更喜欢这种方法,因为您可以在使用宏的任何地方单击命令以查看宏的定义位置。

对于 Swift 项目,您应该将其添加到 Swift Compiler - Custom Flags > Active Compilation Conditions 下目标的构建设置中。

更好的是,我将它放在我的 xcconfig 文件中以便于维护:

SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) iOS_EXTENSION