iOS如何限制使用SDK的版本? 解决iOS项目的版本兼容问题
最近,在做项目时,因为某种原因,突然要“适配”iOS6(也是醉了。。。),保证极少数的iOS6用户可以“用上”新的版本。哪怕界面上有瑕疵,只要功能正常就行。于是就只好花几天时间对iOS6进行紧急适配(心中一万头驼羊奔跑而过。。。) 本文总结了一些常规的,和“非常规”的iOS项目向老版本兼容的办法,结合了宏定义、Category和Runtime,大家看着消遣一下就好哈~ 重点概念首先强调一些概念。 Deployment Target 和 Base SDKDeployment Target Base SDK 区分 所以并不是说,能编译通过的,就一定能运行成功!还要在运行时检查!简单来说,就是如下图:
宏只在编译时生效!宏定义只是纯粹的文本替换,只在编译时起作用。如下代码:
被宏定义包起来的代码是否会执行,在编译时就决定好了,无论你是用什么系统运行,宏定义再也没有什么卵用=。= 编译时检查SDK版本,运行时检查系统版本这个是最基本的适配手段。 用到的宏如下:
运行时检查系统版本:
假如我们现在想用iOS8新的UIAlertController来显示提示框,应该如下判断:
总的来说就是编译时、运行时的判断均不能少。 Weakly Linked - 运行时检查类、方法是否可用除了用宏、系统版本检测,还可以用Weakly Linked特性做运行时的检查。 对于iOS4.2以上的,有NS_CLASS_AVAILABLE标示的类,可以如下判断是否可用:
也可以如下判断:
对于方法,如下判断:
至于用哪种方法,统一一下即可。 用Method Swizzling做兼容有关Runtime、Method Swizzling的资料很多,各位自行阅读哈~ 在
|
1 |
// 创建Category |
运行时添加“Dummy”方法,减少代码改动
Dummy,意思是“假的、假动作、假人”,在这里指的是为旧版本不存在的方法提供一个“假的”替代方法,防止因新API找不到而导致的Crash。
以UITableViewCell的“setSeparatorInset:”方法为例,在iOS6中,压根就不存在separatorInset,但是现有的代码里面大量的调用了这个方法,怎么办?难道一个一个的去加上判断条件?代价太大。
这个时候就可以用Runtime的手段,在运行时添加一个Dummy方法,去“代替接收”setSeparatorInset消息,防止在iOS6上的Crash。
代码如下:
1 |
@implementation UITableViewCell (TTGCompatibility)
+ (void)load {
|
总结
在适配旧版本时,除了基本的宏定义、[UIDevice currentDevice].systemVersion判断,适当的用Runtime,可以大大减少对现有代码的“干涉”,多种方法相结合才是最好的。
嗯,还在用iOS6的用户,升个级呗=。=
参考
不能“强制用户”。即使能,也不要这样做。苹果非常鼓励开发者尽快适配新的系统,并抛弃老的系统。倒是可以用旧版本的 SDK 编译打包,如果你一直不升级 Xcode 的话。 可能会有问题,取决于你用的 API 和类。如果你用的 API 或类标明是NS_ENUM_AVAILABLE_IOS(8_0),那么在 7.0、7.1 系统上就会crash。为了同时适配这两个系统,你可以判断一下系统版本,或者用respondsToSelector:@selector(……) 判断应该使用新 or 老 API。 如果不加 LaunchScreen,会进入兼容模式,直接拉伸。效果肯定是不完美的,就是字号、图片全都拉大了,但也凑合能看。最好专门做适配。如果加了 LaunchScreen,则能否适配就看你的实现方式了。 不要想了。以新系统为主,兼容旧系统为辅。
iOS如何限制使用SDK的版本? 解决iOS项目的版本兼容问题的更多相关文章
- 解决低版本Xcode不支持高版本iOS真机调试的问题
1.现象截图 Could not locate device support files. This iPhone 6s is running iOS 11.1 (15B93), which may ...
- iOS 9的新的改变 iOS SDK Release Notes for iOS 9 说了些改变
iOS 9的新的改变 iOS SDK Release Notes for iOS 9 说了些改变 看了下还算能理解!!!有兴趣可以看看哈!!!不喜勿喷!!后面的对于废除的方法什么有用感觉!!! ...
- iOS SDK Release Notes for iOS 9 iOS9 SDK 版本更新说明
Important: This is a preliminary document for an API or technology in development. Apple is supplyin ...
- [iOS 开发] Xcode常见报错及解决办法
报错一: 在iOS7的真机运行时,弹出错误:App installation failed. There was an internal API error. 如图 解决办法: 在Xcode -> ...
- 解决IOS safari在input focus弹出输入法时不支持position fixed的问题
该文章为转载 我们在做移动web应用的时候,常常习惯于使用position:fixed把一个input框作为提问或者搜索框固定在页面底部.但在IOS的safari和webview中,对position ...
- iOS 中系统与 SDK 版本检测
一.编译时检测 1. 判断 SDK 是否是某个版本或更高版本 ifdef __IPHONE_11_0 2.判断当前需要支持的最低版本 __IPHONE_OS_VERSION_MIN_REQUIRED ...
- Android SDK Manager 下载SDK失败的解决办法
摘要:本文记录了无法使用Android SDK Manager下载SDK开发包的解决办法. 最近需要进行android应用程序的开发工作,在android官网下载了adt-bundle-linux- ...
- SDK接入(3)之iOS内支付(In-App Purchase)接入
SDK接入(3)之iOS内支付(In-App Purchase)接入 继整理了Android平台的SDK接入过程.再来分享下iOS平台的内支付(In-App Purchase)接入,作为笔者在游戏开发 ...
- 移动端上传照片 预览+Draw on Canvas's Demo(解决 iOS 等设备照片旋转 90 度的 bug)
背景: 本人的一个移动端H5项目,需求如下: 需求一:手机相册选取或拍摄照片后在页面上预览 需求二:然后绘制在canvas画布上 这里,我们先看一个demo(http://jsfiddle.net/q ...
随机推荐
- linux之kali系统ssh服务开启
1.修改sshd_config文件,命令为:vi /etc/ssh/sshd_config 2.将#PasswordAuthentication no的注释去掉,并且将NO修改为YES //我的ka ...
- 斜率优化dp学习
用了一堂半的课才彻底搞懂.其他神犇写的博客或多或少有点小bug,所以orzzz不才斗胆重新写一个. 里面大量穿用其他神犇的原话,就不逐一标明出处了. 引用资料 Accept的博客 MathonL的博客 ...
- 回文树 Palindromic Tree
回文树 Palindromic Tree 嗯..回文树是个什么东西呢. 回文树(或者说是回文自动机)每个节点代表一个本质不同的回文串. 首先它类似字典树,每个节点有SIGMA个儿子,表示对应的字母. ...
- /nagios/cgi-bin/cmd.cgi无法打开
原因分析,nginx不支持post. 解决方法,重新编译nagios 1.vi /nagios-4.0.8/cgi/cmd.c 找到printf("<form method='post ...
- Android DB那些事-数据库加密
说到数据库加密,目前最好且唯一的方案就是SqlCipher对sqlite3整体加密,微信也用的它.开源,且支持很多平台. 单就Android来说,集成不算太麻烦,1个jar包,3个so库,1个zip. ...
- 理解django的多对多ManyToManyField
转自:http://luozhaoyu.iteye.com/blog/1510635 对于第一次碰到django这样类activerecord的ORM,初学者可能比较疑惑的是ManyToManyFie ...
- Performance js
转贴:https://10up.github.io/Engineering-Best-Practices/javascript/#performance Performance Writing per ...
- git-----初始化配置添加用户名和密码
Git是分布式版本控制系统,GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心. 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实 ...
- http://blog.csdn.net/milton2017/article/details/54406482
转自:python 把几个DataFrame合并成一个DataFrame——merge,append,join,conca http://blog.csdn.net/zutsoft/article/d ...
- 二十七 Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP
设置代理ip只需要,自定义一个中间件,重写process_request方法, request.meta['proxy'] = "http://185.82.203.146:1080&quo ...
