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 ...
随机推荐
- [Deep Learning] 神经网络基础【转】
本文转载自:http://www.cnblogs.com/maybe2030/p/5597716.html 阅读目录 1. 神经元模型 2. 感知机和神经网络 3. 误差逆传播算法 4. 常见的神经网 ...
- # fabirc 配置多组服务器 密码与密钥一起使用 key_filename的设置
环境说明 myv myv2 是配置在/etc/hosts 的两台 虚拟机 虚拟机ip. 参考英文文档 官方文档的例子不是给的很详细.. http://docs.fabfile.org/en/1.13/ ...
- CentOS7下安装VLC
用最新的CentOS7发现没有视频播放器,于是在http://pkgs.org/上查找,发现了nux dextop仓库上有,于是到他的官网上http://li.nux.ro/repos.html查了下 ...
- 【pytorch】pytorch基础学习
目录 1. 前言 # 2. Deep Learning with PyTorch: A 60 Minute Blitz 2.1 base operations 2.2 train a classifi ...
- mysql 索引相关问题
mysql中key .primary key .unique key 与index区别 https://blog.csdn.net/nanamasuda/article/details/5254317 ...
- Springboot依赖注入 Service类中使用静态变量
@Component public class ServerHandler extends IoHandlerAdapter { @Autowired protected HealthDataServ ...
- ubuntu install git vim Plug manage
在UBUNTU采用163或是阿里云来更新源,最新的更新源地址可以在网上查阅, 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restric ...
- jmeter-time函数
别人写的一个详解置顶 http://www.cnblogs.com/MasterMonkInTemple/p/3442770.html 新建beanshell,time函数格式${_time(YYYY ...
- [Vue]使用axios实现ajax请求
1.定义myAjax export const myAjax=function createHttpClient(ajaxConfig) { let httpClient = null; if ...
- ubuntu 16.04网速监控脚本
#!/bin/bashif [ $# -ne 1 ];thendev="enp2s0"elsedev=$1fi while :doRX1=`/sbin/ifconfig $dev ...
