17

这个问题纯粹基于公开发布的关于在 iOS 中引入应用程序扩展的文档。

随着 iOS 8 中应用程序扩展的引入,现在可以“将自定义功能和内容扩展到您的应用程序之外,并在用户使用其他应用程序时提供给用户”。

在我的扩展实现中,我在我的扩展中包含了一些来自我的实际应用程序的类(模型等)。问题是这些类调用了UIApplication,这在应用程序扩展中是不可用的,编译器告诉我是这样的。

我认为一个简单的解决方案是将任何调用都包含UIApplication#if指令中。

例如,如果我只想在模拟器上运行时包含代码,我会使用:

#if TARGET_IPHONE_SIMULATOR
    // Code Here
#endif

当目标是应用程序扩展时,是否有类似的定义宏?

4

3 回答 3

20

您可以定义自己的宏。

在项目设置中,使用顶部栏中的下拉菜单选择您的扩展目标: 在此处输入图像描述

然后:

  1. 点击Build Settings
  2. Preprocessor Macros在下查找(或搜索)Apple LLVM 6.0 - Preprocessing
  3. 在调试和发布部分添加TARGET_IS_EXTENSION或您选择的任何其他名称。

然后在您的代码中:

#ifndef TARGET_IS_EXTENSION
    // Do your calls to UIApplication
#endif
于 2014-07-30T23:15:40.227 回答
0

您可以使用与 Apple 用于引发编译错误的相同技术。

#if !(defined(__has_feature) && __has_feature(attribute_availability_app_extension))
  //Not in the extension
#else
  //In extension
#end
于 2015-03-16T11:50:11.893 回答
0

更新:不幸的是,它实际上不起作用,因为它以 __has_feature(attribute_availability_app_extension)-feature 方式工作。伤心。

实际上并没有被问到,但应该注意的是:

如果您使用的是 Swift,那么您有@available(iOSApplicationExtension)属性!它实际上不是预处理器的功能,而是一种编译时功能。

例子:

@available(iOSApplicationExtension, message="It is meaningless outside keyboard extension")
public var rootInputViewController: UIInputViewController {
    return storedInputViewController
}

或使用#-notation但可能不是):

public static var rootInputViewController: UIInputViewController! {
    guard #available(iOSApplicationExtension 8, *) else {
        return nil
    }

    return storedInputViewController!
}
于 2016-05-17T19:03:55.380 回答