检测 运行 目标是 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);
}
如何更改此代码以便执行以下操作之一:
- 只有 run/compile IF 最终目标是本机 iOS 应用程序而不是小部件。
- 或 检查API 在目标平台上是否可用,如果可用就使用它?
我希望我的问题是有道理的,感谢你抽出时间,Dan。
运行 时间检查已经结束,因为 Xcode 不会让您编译使用 sharedApplication
的扩展代码。它必须是编译时检查。
很遗憾,此检查不是内置的,您必须添加它。您需要执行以下操作:
- 在 today 扩展的项目设置中,在 "Other C Flags" 下添加您自己的自定义编译器宏。对于名为
TODAY_EXTENSION
的宏,添加 -DTODAY_EXTENSION
:
在您的代码中,使用类似
的方式检查此宏
#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
我有一个简单的应用程序,它还有一个 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);
}
如何更改此代码以便执行以下操作之一:
- 只有 run/compile IF 最终目标是本机 iOS 应用程序而不是小部件。
- 或 检查API 在目标平台上是否可用,如果可用就使用它?
我希望我的问题是有道理的,感谢你抽出时间,Dan。
运行 时间检查已经结束,因为 Xcode 不会让您编译使用 sharedApplication
的扩展代码。它必须是编译时检查。
很遗憾,此检查不是内置的,您必须添加它。您需要执行以下操作:
- 在 today 扩展的项目设置中,在 "Other C Flags" 下添加您自己的自定义编译器宏。对于名为
TODAY_EXTENSION
的宏,添加-DTODAY_EXTENSION
:
在您的代码中,使用类似
的方式检查此宏#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