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

时间:2013-11-25 06:41:06

标签: ios6 compilation ios7 xcode4.5 xcode5

我的应用程序以前在XCode 4.5中编码,现在用于iOS7兼容性,我将其编码为XCode 5.0,添加了一些代码,仅从iOS7开始支持。同时我需要在XCode 4.5上运行它,现在它将显示错误,因为iOS<中不可用的特定代码7.0。

E.g。

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
}

1 个答案:

答案 0 :(得分:5)

您可以使用条件编译来处理此类情况:

#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 = ...;