Tips Xcode 配置理解

1.Base SDK

指的是当前编译用的SDK版本。简单来说就是表示当前使用的Xcode所支持的最高的SDK的版本,比如现在是用iOS 11来编译程序,那么最高的SDK也就是11

2.Deployment Target

指的是编译出的程序将在哪个系统版本上运行,它控制着运行应用需要的最低操作系统版本。简单来说是当前的设置的Target所支持的最低的iOS的版本,比如现在设置的8.0,那么最低运行适配版本就是8.0,再低可能就炸了

版本兼容面对的问题

1.若你想要体验最新的iOS 11的功能,又要兼容iOS 8.0版本,Base SDK设置为最新的iOS 11(默认即可)。Deployment Target设置为iOS 8.0。当然,你用到的iOS 11 的API,要确保它们不会在iOS 8.0上不会crash。
2.团队开发,如果你比较猎奇,你已经升级了最新的Xcode9,那么你就能编译最新的SDK,支持iOS 11,但是你的同事比较保守,没有升级,还是停留在Xcode 8,那么最高支持也就是iOS 10.3,当你提交了代码,如果不做好不同版本之间的条件编译,会导致用旧版本Xcode同事报错无法编译

解决思路一:静态检查编译SDK阶段

静态检查,即在编译时段就检查当前SDK编译与构建应用是否能使用某个API或已经不支持某个API
1.__IPHONE_OS_VERSION_MIN_REQUIRED
值等于Deployment Target,检查支持的最小系统版本。

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 80000//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

2.__IPHONE_OS_VERSION_MAX_ALLOWED
值等于Base SDK,即用于检查SDK版本的

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0//you can use iOS 11 APIs here because the SDK supports them//but the code may still crash if run on an iOS 8 device可以使用最新的iOS 11的API,开始支持的新功能。但是仍然可能会在iOS 8的设备上crash。
#else//this code can’t use iOS 10 APIs as the SDK version doesn’t support them不能使用iOS 11的API,只能使用iOS 11之前的。
#endif

通过系统预设的宏定义进行条件编译
1.每次发布新版本SDK的时候,都会伴随新的API供大家使用,因此为了做兼容,低版本还是用低版本方法,而新版本可以用高版本API来进行兼容
2.宏只在编译阶段生效,只是纯粹的文本替换,被宏包起来的代码,在编译阶段已经决定是否运行了,如果已经运行到系统上,那么宏就已经没什么卵用,已经在编译阶段判定好使用哪段代码了
3.那么问题来了,不同版本的Xcode要进行宏定义的条件编译不同适配的代码,才能保证SDK的兼容问题

#ifndef __IPHONE_11_0
#define __IPHONE_11_0 110000
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0
#else
#endif

这样只是保证了不同SDK之间的兼容问题,保证编译的时候不存在问题,那么跑进系统之后如何保证高版本API在低系统运行时也能兼容,那么就需要运行时检查系统版本

解决思路二:运行时检查系统版本

这里从StackOverFlow上搜集了一些判断当前系统版本的几个方法
1.Xcode 9新方法
if (@available(iOS 11, *)) {} 如果要看available语法的介绍可以自行百度,一大把
2.NSFoundationVersionNumber
iphone版本感觉10之前都可以用,貌似10之后有点问题了,稍微知道下就好了,反正我不用

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {// here you go with iOS 7
}

3.UIDevice

if ([[ [UIDevice currentDevice] systemVersion] floatValue] >= 11.0) {
}

该方法对于整数,float计算出来就不会有问题,那么当如果你的系统是11.2.1和11.2.2这个时候就会出现精度问题,毕竟float存在的精度问题随时会出现,这种简单的判断适用于整数大版本,小版本就无法精确判断了

4.NSOperatingSystemVersion

    NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];NSLog(@"major--->%ld,minjor--->%ld,patch--->%ld",version.majorVersion,version.minorVersion,version.patchVersion);NSOperatingSystemVersion v = (NSOperatingSystemVersion){9,0,0};// 判断操作系统是否大于等于v版本BOOL isRight = [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:v];if (isRight) {NSLog(@"当前版本大于指定版本");}else{NSLog(@"当前版本小于指定版本");}
//    2017-09-27 15:43:01.540690+0800 测试Icon[28898:915470] major--->11,minjor--->0,patch--->0
//    2017-09-27 15:43:01.540811+0800 测试Icon[28898:915470] 当前版本大于指定版本

这种方法是iOS 8之后才有的,目前为止的话可以用了,毕竟已经最低支持iOS 8了,不用担心7了

5.字符串比较

/**  System Versioning Preprocessor Macros*/ #define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)/**  Usage*/ if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {...
}if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {...
}

我用的就是这种方式
但是需要注意的是,如果你系统版本是11.0,你指定的版本是11.0.0,这种情况下,你要知道11.0.0是比11.0版本大的,也就是说你用SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"11.0.0") 返回的是NO

针对上面的方法举个例子

#ifndef __IPHONE_8_0
#define __IPHONE_8_0      80000
#endif// 编译时判断:检查SDK版本 兼容Xcode版本
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0// 运行时判断:检查当前系统版本if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {UIAlertController *alertController =[UIAlertController alertControllerWithTitle:@"Warning"message:@"Compatibility"preferredStyle:UIAlertControllerStyleAlert];[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"style:UIAlertActionStyleCancelhandler:^(UIAlertAction *action) {NSLog(@"Cancel");}]];[self presentViewController:alertController animated:YES completion:nil];} else {// 用旧的代替UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Warning"message:@"Compatibility"delegate:nilcancelButtonTitle:@"Cancel"otherButtonTitles:nil];[alertView show];}
#else// ...
#endif
}

针对上面提到的知识点总结,这里老外有一个简单的回答

总结来说:编译时检查SDK版本(兼容Xcode),运行时检查系统版本(兼容系统)

iOS 11适配

适配详情可以参考如下链接
iOS 11适配详解

下面都是我个人的感觉和做法

iPhone X 变化最大的是头部 & 底部
非iPhone X :
StatusBar 高20px,NavigationBar 高44px,底部TabBar高49px
iPhone X:
StatusBar 高44px,NavigationBar 高44px,底部TabBar高83p

来来来,一句话搞定适配,把下面的代码放着这个下面
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

#ifndef __IPHONE_11_0
#define __IPHONE_11_0    110000
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0
//    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"11.0")) {if (@available(iOS 11.0, *)) {UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;UITableView.appearance.estimatedRowHeight = 0;UITableView.appearance.estimatedSectionFooterHeight = 0;UITableView.appearance.estimatedSectionHeaderHeight = 0;} else {// Fallback on earlier versions}
//    }
#endif

个人的一些知识点记录,如果对于上面提到的有任何问题,各位大神请留言指点,谢谢了~~~

参考链接
How to check iOS version?
版本兼容
解决iOS项目的版本兼容问题-结合宏、Category和Runtime

iOS版本兼容以及部分iOS 11适配相关推荐

  1. 苹果iOS 15正式版发布,iOS 15 兼容所有运行 iOS 14 的 iPhone

    Apple 的新iOS 15操作系统兼容所有能够运行iOS 14的iPhone,包括最初的iPhone SE.iPhone 6s 和 ?iPhone? 6s Plus. Apple 的兼容设备列表确认 ...

  2. 山海经鸿蒙手游iOS 版本,山海经鸿蒙异兽iOS版

    山海经鸿蒙异兽iOS版是一款非常好玩的玄幻武侠游戏,游戏里加入了更多的远古巨兽,玩家们可以驯服来做自己的神宠,游戏的战斗场面非常的热血刺激,远古巨兽之争,到底谁是最后的王者?山海经鸿蒙异兽最新版给你一 ...

  3. ios版本 线控 Android,iOS 耳机线控

    最近适配耳机线控,记录一下问题 首先,耳机线控三要素: 1.开启接受耳机线控 ---- [[UIApplication sharedApplication] beginReceivingRemoteC ...

  4. 如何将 iOS 15 Beta 降级到 iOS 14.x

    升级到iOS15系统测试版后,很多人想要降级到原来的iOS14系统.iOS15系统怎么降级到iOS14?下面就演示操作步骤. 降级 iOS 15 Beta / iPadOS 15 Beta 的要求 在 ...

  5. 谷歌暗示android wear未来或兼容ios系统!腾讯,传谷歌今年5月将推出iOS版本Android Wear...

    导读:真是如此的话,不远的将来,iPhone 6就能够支持Moto 360. 腾讯科技讯 3月4日,来自法国科技网站01net的报道称,在今年5月举行的谷歌(微博)年度开发者大会中,谷歌将会发布iOS ...

  6. React Native 模仿网易云音乐手机客户端,兼容安卓和IOS两个平台

    React Native 模仿网易云音乐手机客户端,兼容安卓和IOS两个平台. GitHub 完整源码地址https://github.com/yezihaohao/NeteaseCloudMusic ...

  7. Emoji表情符号兼容方案(适用ios,android,wp等平台)

    http://blog.csdn.net/qdkfriend/article/details/7576524 Emoji表情符号兼容方案 一 什么是Emoji emoji就是表情符号:词义来自日语(え ...

  8. iOS 开发 : 14个技巧助你适配 iOS10

    iOS 开发 : 14个技巧助你适配 iOS10 1.Notification(通知) 自从 Notification 被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 1 ...

  9. iOS 的 APP 在系统中如何适配不同的屏幕的尺寸

    iOS 的 APP 在系统中如何适配不同的屏幕的尺寸 标签: 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone ...

  10. ios14测试版兼容软件,苹果iOS 14兼容设备公布:iPhone 6S以上可升级,Beta开发测试版上线...

    苹果iOS 14兼容设备公布:iPhone 6S以上可升级,Beta开发测试版上线 2020-06-23 15:07:41 21点赞 85收藏 145评论 直达链接 苹果今晨公布了全新的iOS 14系 ...

最新文章

  1. 一、常见损失函数的用法
  2. java中普通代码块,构造代码块,静态代码块的区别及代码示例
  3. DRV8834用于驱动双电机
  4. Android View 事件分发机制详解
  5. 面试题整理10 最小的k个数
  6. java常见_Java 常用类
  7. Shiro过滤器源码
  8. ***某知名网络安全公司
  9. JavaScript 常用内置对象(字符串属性、Math对象、Array数组对象)
  10. c 语言与数据库技术基础教程答案,2016计算机三级《数据库技术》备考习题与答案...
  11. 计算机学模型,计算机数学模型.pdf
  12. python vba excel课程_Excel办公自动化—VBA 及编程入门指南
  13. 让css旋转字体图标
  14. excel单元格斜线_如何在Excel中使用斜线,并在表格的标题中使用单斜线或双斜线...
  15. mysql 锁机制与原理详解
  16. 高等数学基础概念的Python开发实现
  17. Servlet 01
  18. java_异常_练习题:处理输入非数字异常和除数为0的异常。
  19. 对不起,我要去大厂了!
  20. 各种PLC通讯介质和协议介绍

热门文章

  1. cad墙线打断lisp_cad相切命令(cad相交线自动打断)
  2. oracle时分秒修改值_oracle优化(一) oracle数据库使用 TIMESTAMP(6)类型保存年月日时分秒...
  3. STM32USB鼠标+键盘串口控制
  4. 加拿大银行为加密货币公司开设保险箱
  5. mysql 减去一月_sql – 如何从日期列中减去一个月
  6. 华为智慧屏V55升级鸿蒙2,华为智慧屏s55和v55对比参数_华为智慧屏s55和v55哪个好...
  7. VUE项目中调用高德地图
  8. 爬虫问题,内容应该如何解码,base64解码技巧,从哪里开始分析
  9. Lucene.Net的简单练习
  10. google身份验证器,java服务端实现 GoogleAuthenticator