Xcode 7 - 有条件地排除iOS模拟器的框架和代码

时间:2016-05-06 14:38:10

标签: ios xcode ios-frameworks

我正在使用一个名为EyeVerify的框架,该框架仅为设备架构而构建,我想在iOS模拟器上运行我的应用程序时将其排除。我也不希望在iOS模拟器上运行应用程序时执行与框架相关的任何代码,因为可能会导致编译错误。

我已尝试在this SO topic发布的答案,但它对我不起作用;我收到与未找到的框架对象相关的编译错误。框架在Objective-C中,我的项目完全在Swift中。这是我尝试过的:

在我的桥接头中,我将条件中的import语句嵌套:

#if !(TARGET_OS_SIMULATOR)
    #import "EyeVerifyLoader.h"
    #import <EyeVerify/EyeVerify.h>
    #import <EyeVerify/EVLicense.h>
#endif

我排除了仅与框架一起使用的所有子类,如下所示:

#if !(TARGET_OS_SIMULATOR)
    class EnrollViewController : UIViewController, EVAuthSessionDelegate
    {
        let ev:EyeVerify! = EyeVerifyLoader.getEyeVerifyInstance()

        ...
    }
#endif

我排除了使用框架执行操作的所有代码片段,如下所示:

#if !(TARGET_OS_SIMULATOR)
    let eyeVerifyLoader:EyeVerifyLoader = EyeVerifyLoader()
    eyeVerifyLoader.loadEyeVerifyWithLicense("test")
#endif

我将框架设置为Xcode目标设置中的Optional(项目设置&gt;构建阶段&gt;链接二进制文件与库)。 “框架框架”部分中的两个框架显然都需要框架才能运行。

enter image description here

当我尝试编译时,会收到某些类型未声明的错误消息,例如EyeVerify中的EnrollViewController(见上文)。

我错过了什么?

事实证明TARGET_OS_SIMULATOR在Swift according to Apple中不可用作预处理器宏(向下滚动到预处理器指令部分)。我找到了this SO question,它为我提供了一个解决方案。我替换了这个宏的所有实例:

#if !(TARGET_OS_SIMULATOR)

用这个:

#if !((arch(i386) || arch(x86_64)) && os(iOS))

然后我从我的桥接头中删除了宏,因为它无法解释它。在那之后,一切都很好!

谢谢!

0 个答案:

没有答案