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

Hem*_*ang 1 compilation ios6 xcode4.5 ios7 xcode5

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

例如

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
}
Run Code Online (Sandbox Code Playgroud)

当我用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
}
Run Code Online (Sandbox Code Playgroud)

ser*_*gio 5

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

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported
  // iOS 7 code here
#else
  // Pre-iOS 7 code here
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

这只会在编译时解决问题.但是你仍然需要考虑另一个问题:当你的Xcode 5构建应用程序将在例如iOS 6设备上运行时.在这种情况下,由于使用仅限iOS 7的功能,您的应用程序将崩溃.所以你还需要一个运行时保护,如:

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
Run Code Online (Sandbox Code Playgroud)

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

#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 = ...;
Run Code Online (Sandbox Code Playgroud)