手动安装xcode多种对应版本的iOS SDK

每次Xcode升级,以前的iOS SDK都会被覆盖掉;这是许多人碰到并头疼的问题—-如果想用旧版本的SDK编译就没有办法了。
这里就介绍一下Xcode与多个SDK版本并存的方法。针对Xcode的安装顺序总结了两种方法 :
安装新版Xcode时备份旧版SDK
这是最简单的方法 —- 每当安装新版的Xcode时,备份之前旧的SDK安装Xcode之后,回复到指定目录下即可。
备份SDK路径
  1. iOS 设备用
  2. $ /Developer/Platforms/iPhoneOS.platform/Developer/SDKs

  3. iPhone 模拟器用
  4. $ /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs
复制代码

简单起见,在安装新版Xcode之前,可以把这两个目录下的需要备份的SDK版本move到其他目录下,安装完Xcode之后再move回来即可。
在Xcode内安装旧版的SDK
已经安装好的Xcode上,想安装旧版的SDK也是可以的,只是需要一些准备。下面从安装新版Xcode开始,再到之后安装旧版SDK做一个简要说明。
首先我们删除之前已安装的Xcode
  1. $ sudo /Developer/Library/uninstall-devtools --mode=all
复制代码
然后,安装从Apple Developer上下载的最新Xcode dmg安装包。完成Xcode的安装
接下来,从iPhone Software Development: Old versions of iPhone SDK上下载你所需要的旧版SDK版本;
打开下载的旧版dmg文件的Packages目录后,会看到许多的pkg文件。
 
接下来,根据你的需要,选择具体的iPhoneSDK$(ver).pkg文件,并双击安装。这里注意一点 —- 你选择的SDK版本最好是dmg文件中正式附带的版本;在某个dmg会附带当前最新的版本,和之前版本的pkg文件。如果是选择之前pkg文件的话,有可能缺省的安装路径是不一样的。
比如xcode_3.2.4_and_ios_sdk_4.1.dmg,就选择iPhoneSDK4_1.pkg安装,不要选择比它小的版本号。
安装的时候,需要需要选择正确的安装路径
选择[Installation Type]的[Change Install Location...]
 
然后选择[Developer]目录。
 
确认好后,点击[Continue]。
 
安装完后,我们可以确认一下下面的路径是否有你需要的SDK
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(ver).sdk
同样的,你可以安装iPhoneSimulatorSDK$(ver).pkg

虽然说Xcode可以支持多种版本的SDK并存,但是一般情况下按照下面的原则去编译你的程序应该是是最安全的。
用最新的Base SDK编译,Deployment Target尽量选择最低的。

由于编译SDK版本不同而引起的编译/运行期错误处理
由于SDK版本变化,或多或少会有一些莫名的编译错误出现;有的时候是链接出错,譬如找出到-lcrt,有的时候是压根编译时就找不到头文件。
譬如下面找不到-lcrt的问题
 
这个时候,我们可以试试更改编译选项中Mac OS X的Deployment Target。
 
如果还是不能解决,可以试试更改编译器(比如GCC 4.2 或者是 LLVM GCC 4.2)。
还有一种问题的原因可能是原先SDK中的Framework与新版中的SDK不匹配,引起编译失败
这个时候,需要重新选择新版本中的Framework到工程文件中。
如果是旧的iOS环境中没有包含的必要的Framework,也会出现类似于下面的动态链接错误(即在高版本的OS中才有的新增功能,想在低版本的OS中依然能够运行)
  1. dyld: Library not loaded: /System/Library/Frameworks/iAd.framework/iAd
  2.   Referenced from: /var/mobile/Applications/71E4CD8F-4E9E-4FC1-A7B9-6AE975E9C2B0/Test.app/Test
  3.   Reason: image not found
复制代码
这时,就需要与新版SDK的Framework建立Weak Link。
如下图所示,在「Target」>「执行文件」点击左边的三角,并选择「链接库文件」。只要将需要Weak Link的库的Required变为 Weak 即可。
 
最后,针对对新库中调用的部分,我们还需要在代码中加入对版本判断和控制的逻辑。(如果不这样做,我们的程序在低版本OS的设备中必定崩溃)
1. iOS版本确认
  1. [color=rgb(17, 0, 0)][font=Tahoma][size=12px]- (void)viewDidLoad {
  2.     [super viewDidLoad];

  3.     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
  4.         bannerView = [[ADBannerView alloc] init];
  5.         bannerView.delegate = self;
  6.         [self.view addSubview:bannerView];
  7.     }[/size][/font][/color]
复制代码
 
2. 新类是否存在
  1. [color=rgb(17, 0, 0)][font=Tahoma][size=12px]Class clazz = NSClassFromString(@"ADBannerView");
  2. if (clazz) {
  3.     bannerView = [[ADBannerView alloc] init];
  4.     bannerView.delegate = self;
  5.     [self.view addSubview:bannerView];
  6. }[/size][/font][/color]
复制代码

3. 新接口是否存在
  
  1. [color=rgb(17, 0, 0)][font=Tahoma][size=12px]if (UIGraphicsBeginImageContextWithOptions != NULL) {
  2.     bannerView = [[ADBannerView alloc] init];
  3.     bannerView.delegate = self;
  4.     [self.view addSubview:bannerView];
  5. }[/size][/font][/color]
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值