此问题完全基于有关在iOS中引入应用程序扩展的公开发布的文档。
随着iOS 8中app extensions的推出,现在可以“在您的应用之外扩展自定义功能和内容,并在用户使用其他应用时将其提供给用户”。
在我的扩展程序的实现中,我在我的扩展程序(模型等)中包含了我的实际应用程序中的一些类。问题是这些类调用UIApplication
,这在app扩展中是不可用的,编译器告诉我。
我认为一个简单的解决方案就是在UIApplication
指令中包含对#if
的任何调用。
例如,如果我想在模拟器上运行时只包含代码,我会使用:
#if TARGET_IPHONE_SIMULATOR
// Code Here
#endif
当目标是应用程序扩展时,是否存在类似的定义宏?
答案 0 :(得分:16)
您可以定义自己的宏。
在项目设置中,使用顶部栏中的下拉菜单选择您的扩展程序目标:
然后:
- 点击
Build Settings
- 在
下查找(或搜索)Preprocessor Macros
Apple LLVM 6.0 - Preprocessing
- 在调试和发布部分中添加
醇>TARGET_IS_EXTENSION
或您选择的任何其他名称。
然后在你的代码中:
#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!
}