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

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

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

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

这是我的代码:

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

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

  1. 仅在 IF 最终目标是原生 iOS 应用而非小部件时运行/编译。
  2. 检查该 API 在目标平台上是否可用,如果可用则使用它?

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

最佳答案

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

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

  1. 在 today 扩展的项目设置中,在“其他 cflags”下,添加您自己的自定义编译器宏。对于名为 TODAY_EXTENSION 的宏,添加 -DTODAY_EXTENSION:

enter image description here

  1. 在您的代码中,使用类似的方法检查此宏

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

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

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

关于ios - 检测运行目标是App Extension还是iOS App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29605094/

相关文章:

ios - 我的 NSManagedObjectID 保存后仍然是临时的。但为什么?

objective-c - 如何检查 UITextField 中的文本是否与特定模式匹配?

iphone - 如何在 collectionView 中重新加载补充 View

iphone - 在设置我的物理 iPod 进行测试后,让 Xcode 在 iPhone 模拟器上构建我的 iPhone 应用程序?

java - 检查目标中的 ant 文件属性

ios - 无法将目标添加到 UIButton

ios - 在少数用户之间快速同步数据的最佳方法是什么?

ios - 在 UISplitViewController 之上显示 Modal?

iphone - 来自文件问题的UIImage

objective-c - ARC 会告诉我什么时候必须使用 __block 吗?