在不同版本的 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 服务器上编译代码似乎以不同的方式运行 [关闭]