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 ...
随机推荐
- Nginx解决post请求405问题
和工商银行的一个合作项目,对方客户端需要请求我们的一个静态页面,但是客户端发送过来的请求方法用的post,日志显示405错误(请求方法错误),正常一个静态页面直接用get请求就可以了,工行那边说写死了 ...
- intellij idea rearrange code
reformat code的时候,无法将filed放在method前边,很恶心. 那么先去
- Vue2.0 + ElementUI的+ PageHelper实现的表格分页
参考博客:http://blog.csdn.net/u012907049/article/details/70237457 借鉴1.controller层编写 2.vue中,axios的写法(总页数等 ...
- mybatis映射文件_select_resultMap
实体类: Employee.java类: package com.hand.mybatis.bean; public class Employee { private Integer e ...
- (转帖) 为Docker容器指定自定义网段的固定IP/静态IP地址
作者:雨水,日期:2016-04-09 CSDN博客: http://blog.csdn.net/gobitan 摘要:Docker容器运行的时候默认会自动分配一个默认网桥所在网段的IP地址.但很多 ...
- 监控控制台是否运行的bat
@echo offrem set secs=5set srvname="TRS.Export.Scheduler.exe" echo.echo ================== ...
- Springboot依赖注入笔记
结合Autowired和Service注解 public interface IUser { void say(); } @Service public class Student implement ...
- R-模式(mode)和类(class)
数据模式:mode函数显示任何对象的模式.常见的单个的对象模式是逻辑型(Logical).数值型(Numeric).字符型(Character). 常用到的数据模式是列表(list). 逻辑型:TRU ...
- spring mvc: 注解和JavaConfig实例
通过javaConfig来配置config,并能正常访问url. 先看图 访问地址:http://localhost:8080/gugua5/ http://localhost:8080/gugua5 ...
- git-----初始化配置添加用户名和密码
Git是分布式版本控制系统,GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心. 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实 ...
