在不同版本的 XCode 上编译和运行相同的代码以针对不同的 iOS 版本

Posted

技术标签:

【中文标题】在不同版本的 XCode 上编译和运行相同的代码以针对不同的 iOS 版本【英文标题】:Compile and run same code on different versions of XCode to target different iOS versions 【发布时间】:2013-11-25 06:41:06 【问题描述】:

我的应用程序以前在 XCode 4.5 中编码,现在为了兼容 ios7,我将它编码到 XCode 5.0 中,添加了一些代码,仅从 iOS7 开始支持。同时我需要在 XCode 4.5 上重新运行它,现在这里会显示错误,因为该特定代码在 iOS

例如

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

我用 XCode 5.0 编译没有问题,但在 XCode 4.5 编译时显示错误,我知道原因 -- 即 UIStatusBarStyleLightContent 仅适用于 iOS7,iOS7 从 XCode 5.0 开始支持,但我想要一个解决方案,如果它不支持特定的 iOS 目标,这段代码不会影响?

类似的,

if(NOT_SUPPORTED_IOS) 
   //NO NEED TO COMPILE THIS LINE or THIS LINE WONT EXECUTE

【问题讨论】:

您使用 xCode 4.5 的原因是为了支持 iOS 7 之前的 iOS 版本吗?还是有其他原因? 【参考方案1】:

您可以使用条件编译来处理这种情况:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported
  // iOS 7 code here
#else
  // Pre-iOS 7 code here
#endif

当您在 Xcode 5 下编译时,您将针对 iOS 7 SDK 进行编译:在这种情况下,将使用第一个分支。当您在 Xcode 4.5 下编译时,您将使用较旧的 SDK 版本,并且将使用第二个分支。

注意使用预编译器#if/#endif:这将有效地使代码对编译器可见或不可见。

这只会在编译时解决问题。但是你还有另一个问题需要考虑:当你的 Xcode 5 构建的应用程序将在例如 iOS 6 设备上运行时。在这种情况下,您的应用程序将崩溃,因为使用了仅限 iOS 7 的功能。所以你还需要一个运行时守卫,比如:

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

在你的情况下,这将给出:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
      [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    else
#endif
      [UIApplication sharedApplication].statusBarStyle = ...;

【讨论】:

以上是关于在不同版本的 XCode 上编译和运行相同的代码以针对不同的 iOS 版本的主要内容,如果未能解决你的问题,请参考以下文章

尽管在 macBookPro 上编译和运行完美,但在 Mac mini 上编译项目的桥接头问题

尽管在 macBookPro 上编译和运行完美,但在 Mac mini 上编译项目的桥接头问题

C++/LapackE 代码在 Windows 上编译良好,但相同的代码在 Linux 上编译失败

在 Linux 服务器上编译代码似乎以不同的方式运行 [关闭]

Go语言编译器TinyGo,基于LLVM,在微控制器和小系统上编译和运行

XCode 卡在“复制符号文件”