ios

iOS版本判断

2017-07-01  本文已影响677人  子瑜愚

♪ Xcode中版本相关的配置项

1. Base SDK

2. Deployment Target

3. 在Xcode 8以上适配iOS 7

记得当我终于找到iOS 7的设备,兴奋ヾ(o◕∀◕)ノヾ地连到Xcode上的时候,居然弹窗报错Could not loacte device support files,excuse me???原来Xcode 8开始,默认最低支持的iOS版本为iOS 8,你可以在Deployment Target的列表中看到,app最低只能支持到iOS 8。

既然app最低只能支持到iOS 8,那就连iOS 8下的bebug都无法调试了。具体解决方法:iOS开发-Xcode8兼容iOS7手记

一些需要掌握的知识:

♪ 编译时检查SDK版本,运行时检查系统版本

1. 编译时检查SDK版本

1.1 系统预设的宏定义
#define __IPHONE_8_0      80000
#define __IPHONE_8_1      80100
#define __IPHONE_8_2      80200
#define __IPHONE_8_3      80300
#define __IPHONE_8_4      80400
#define __IPHONE_9_0      90000
#define __IPHONE_9_1      90100
#define __IPHONE_9_2      90200
#define __IPHONE_9_3      90300
#define __IPHONE_10_0    100000
#define __IPHONE_10_1    100100
#define __IPHONE_10_2    100200
/* __IPHONE_NA is not defined to a value but is uses as a token by macros to indicate that the API is unavailable */
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
    /* make sure a default max version is set */
    #ifndef __IPHONE_OS_VERSION_MAX_ALLOWED
        #define __IPHONE_OS_VERSION_MAX_ALLOWED     __IPHONE_10_2
    #endif
    ...
#endif
1.2 在编译时检测SDK版本
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
//minimum deployment target is 8.0, so it’s safe to use iOS 8-only code 当前SDK最小支持的设备系统,即8.0,所以在iOS 8.0设备上是安全的
#else
//you can use iOS8 APIs, but the code will need to be backwards //compatible or it will crash when run on an iOS 7 device 你仍然可以使用iOS 8的API,但是在iOS 7的设备上可能会crash. #endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
//you can use iOS 10 APIs here because the SDK supports them //but the code may still crash if run on an iOS 8 device 可以使用最新的iOS 10的API,开始支持的新功能。但是仍然可能会在iOS 8的设备上crash。
#else
//this code can’t use iOS 10 APIs as the SDK version doesn’t support them 不能使用iOS 10的API,只能使用iOS 10之前的。 #endif
#ifdef __IPHONE_10_0
// 如果预定义了__IPHONE_10_0这个宏,表示最高支持的版本在10.0以上,包括10.1
#endif
// 除此之外类似的用法还有
#ifdef NSFoundationVersionNumber_iOS_7_1
// 如果NSFoundation的版本在7.1之上,包括7.1
#endif

2. 运行时检查系统版本

2.1 UIDevice
[[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame
2.2 判断NSFoudation或者CFCoreFoudation版本号

♪ iOS 8新API NSProcessInfo

♪ 高效地进行版本判断

♪ 其他一些跟版本相关的宏

1. weakly linked 弱连接(有NS_CLASS_AVAILABLE标示的类)

// 普通的判断方式
Class class = NSClassFromString (@"UIAlertController");
if (class) {
    // 使用UIAlertController...
} else {
    // 使用旧的方案...
}
// Weakly Linked判断
if ([UIAlertController class]) {
    // 使用UIAlertController...
} else {
    // 使用旧的方案...
}

2. NS_CLASS_DEPRECATED_IOS

#define NS_CLASS_DEPRECATED_IOS(_iosIntro, _iosDep, ...) NS_CLASS_DEPRECATED(NA, NA, _iosIntro, _iosDep, __VA_ARGS__)
// 在某个版本开始引进一个方法,但是在某个版本之后废弃了
// NA表示从未支持过
// 第三个参数是编译警告的提示语

具体参考


上一篇下一篇

猜你喜欢

热点阅读