什么是预处理器宏来测试是否正在构建应用程序扩展?

时间:2014-06-03 14:55:00

标签: ios preprocessor ios8 ios-app-extension

此问题完全基于有关在iOS中引入应用程序扩展的公开发布的文档。

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

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

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

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

#if TARGET_IPHONE_SIMULATOR
    // Code Here
#endif

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

3 个答案:

答案 0 :(得分:16)

您可以定义自己的宏。

在项目设置中,使用顶部栏中的下拉菜单选择您的扩展程序目标: enter image description here

然后:

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

然后在你的代码中:

#ifndef TARGET_IS_EXTENSION
    // Do your calls to UIApplication
#endif

答案 1 :(得分:1)

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

#if !(defined(__has_feature) && __has_feature(attribute_availability_app_extension))
  //Not in the extension
#else
  //In extension
#end

答案 2 :(得分:0)

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

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

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

示例:

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

或使用# - 表示法but probably not):

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

    return storedInputViewController!
}