下面举个简单的例子来说明在iOS7.0和iOS6.1(以及更低版本)之间的适配问题(用的是xcode5.0,里边有6.1和7.0两个版本的sdk)
// 当前系统支持的最小版本 min
__IPHONE_OS_VERSION_MIN_REQUIRED
// 当前系统支持的最大版本 max
__IPHONE_OS_VERSION_MAX_ALLOWED
min的取值来自于你项目的deployment target, 即你的app愿意支持的最低版本
max的取值来自于你的sdk的版本, 比如现在我的是xcode6.1, sdk版本是iOS 8.1, 那么这个宏的值永远是80100,
先抛出一个问题 如何在iOS低版本(<8.0) 使用UIAlertViewController(ios8+)
新建一个工程,默认的development target,base sdk以及模拟器的版本都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法里写下
self.window.tintColor = [UIColor redColor];
然后运行,这样是没有任何错误的。接下来将development target,base sdk以及模拟器的版本都改成6.1(注意默认的xcode是没有6.1的sdk的,需要自己另外导入)。然后运行,就会报错:
也就是说tintColor属性在iOS6.1中根本就没有,在编译时候就会出错。这时候如下加上判断语句也是没有用的,照样报错(预处理,编译,运行的问题这里不再废话)
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
self.window.tintColor = [UIColor redColor];
}
遇见这种情况只能加上预处理语句,这样写:
#ifdef __IPHONE_7_0
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
self.window.tintColor = [UIColor redColor];
}
#endif
或者
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
self.window.tintColor = [UIColor redColor];
}
#endif
在使用framework或者.a的时候需要注意
因为在编译framework或者.a的时候是依赖当时编译的环境决定的,如使用iOS6的sdk可以将framework或者.a顺利编译通过,但是在真正生成app的时候需要保证编译app时的sdk和编译framework或者.a的sdk是一致的,且同时需要加入运行时判断([[[UIDevice currentDevice] systemVersion] floatValue]那个)
说明:
1、如果是使用低版本sdk编译的(如iOS6),将最终的应用安装至高版本的设备上(iOS7的系统),此时应该不会出现问题,因为iOS7兼容iOS6,但是无法使用iOS7特有的新功能,因为代码被屏蔽了。
2、如果是使用高版本sdk编译的(如iOS7),将最终的应用安装至低版本的设备上(iOS6的系统),此时如果不加入运行时判断就会出现问题(可能是crash)。因为应用本身是用iOS7编译的,并使用iOS7才有的新功能,而设备并不支持iOS7。
__IPHONE_OS_VERSION_MAX_ALLOWED编译环境判断,判断当前开发时使用的sdk的版本。
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000
// 所使用的sdk为5.0以上的版本,在此的代码在编译时不会保存,但是允许在低版本ios系统的设备上运行就会崩溃的
// 例如:你使用xcode6.1开发,SDK版本为8.1来开发项目,并使用新API的新功能,在编译时没有问题,但是允许ios7系统的设备上就会崩溃
#else
//不能使用该API的代码编写
#endif
所以不能使用它来判断你的项目是否支持低版本ios系统的设备
综合以上,如要实现使用 ios8新的 UIAlertCtrl 的例子:
- 先判断编译环境, 以避免低版本SDK不认识高版本SDK的api, 造成编译错误
- 在高版本SDK的条件内, 自行开始判断SDK版本, 或responedToSelector都可以,来判断是否使用高版本的api
- 在低版本条件内, 直接用低版本的api
// 编译时判断:检查SDK版本
#if __IPHONE_OS_VERSION_MAX_ALLOWED > 80000
// 运行时判断:检查当前系统版本
if ([UIDevice currentDevice].systemVersion.floatValue > 8.0f) {
//这里写UIAlertController
} else {
// 用旧的代替 UIAlertView
}
#else
// ...
#endif