遵循以下几种法则:
1,如果没有用到高版本的API, 那你直接设置Target为低版本就行啦, 并不是一定要低版本SDK来编译,用最新版本xcode可以发布任何以前版本的程序
2,在配置文件里改iOS Deployment Target为3。0就可以了。
此外,要注意有些sdk函数是要求在ios3。0以上的,必须在代码里判断处理。
3,如果有用到新版ios中的API而且又不能在旧ios中找到替换函数,那么就没有办法,这样就不能兼容老版本了。
代码示例:如果试ios6.0以上的跑n某个api,如果是以下的跑某个api,这样就可以兼容6.0以下的版本。
// Begin 6.0
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) {
self.window.rootViewController = myRootViewConroller;
}
else
{
[self.window addSubview:myRootViewConroller.view];
}
// End 6.0
/////////////////////////////////////////////////////////
背景介绍:
接的别人的项目。
然后旧版本的Xcode编译的可以在任何设备上跑。
用新版本的Xcode编译不能在iOS6上跑。
BUG已经解决了,但是我感觉这是一个自己的盲点吧,所以有以下几个疑问
疑问:
1.旧版本Xcode编译的程序(比如BaseSDK为5.0)在iOS6的系统里面为什么能跑?运行的时候用的具体代码是5.0的版本还是6.0的?
2.新版本Xcode编译的程序为何在旧的iOS系统中能跑?运行的时候用的具体代码是旧的IOS的系统代码还是6.0的?
3.是否编译的时候会根据BaseSDK的不同,往生成的iPA里面放入相应BaseSDK的执行代码呢?然后在运行的时候,其实是自己创建一个虚拟的对应版本的iOS系统的环境?
之前yoyoyo大的一个面试题目有类似的题目,说新版本SDK里面特有的类在旧版本上无法运行之类的,但我没仔细去思考这个问题...
解答:
1、旧版本之所以能在新版本中跑,是因为新版本的sdk有全部的旧版本的程序所需的接口。只要接口名称、参数不变,实现相同功能的代码可能改变。
2、新版本编译的程序使用的接口能在旧版本中找到(也就是说旧版本的接口没有被弃用,在新版本中新加入的接口没有在该程序中使用),当然是可以在就的ios系统中跑的。
3、我们调用的api都是public的。如果编译的时候选中了目标运行环境(如编译用的是ios6,但是目标选择了ios4)。那么编译的时候应该是会相应选择低版本的接口给我们程序中的接口调用的。
不然你把ios6新添加的接口放到ios5上的设备中一运行就报错。找不到接口。