开发适应iphone/ipad及多ios版本程序的技巧
来源:互联网 发布:linux 查询路由表 编辑:程序博客网 时间:2024/06/05 05:40
本篇译自:Matt Gallagher的blog-http://cocoawithlove.com
原文:http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html
这篇日志会告诉你在ios编程中如何判断不同的版本的ios系统。
1,让项目/Target支持不同版本的iOS
要让一个程序可以在多个版本的ios上运行相当简单:
2,使用新iOS功能,同时支持老版本
如果你想在iOS4中启动一个后台任务,同时要支持老版本,就要像下面这样写:
Objective-C
上面代码有编译期判断和运行时check。要做两个判断,写法麻烦。我们要把两个check合并到一起:
Objective-C
Objective-C
Objective-C
Objective-C
比使用宏更好的方式是使用一个简单的函数。
比如下面的代码:
Objective-C
Objective-C
Objective-C
Apple没有让支持老版本的sdk非常简单。因为他们想让每个人一直使用新的系统,或者买新的设备。但这对开发人者来说很不现实,我们不能期待软件的用户一直使用新系统或新设备。
写适用多版本的程序关键点是写尽量少的if判断。你肯定不想为了对应多版本的问题,让自己的程序有很多的分支,因为每一个分支都意味着要进行测试。
如果你发现需要写很多的if判断,还可以为每个os版本写一个子类。用不同实现类实现功能。
原文:http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html
这篇日志会告诉你在ios编程中如何判断不同的版本的ios系统。
1,让项目/Target支持不同版本的iOS
要让一个程序可以在多个版本的ios上运行相当简单:
- 在Project Settings中,将BaseSDK设置为最新的版本。
- 再将【iPhone OS Deployment Target】设置为最老的版本。
2,使用新iOS功能,同时支持老版本
如果你想在iOS4中启动一个后台任务,同时要支持老版本,就要像下面这样写:
Objective-C
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 if ([[UIApplication sharedApplication] respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]) { UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]; // Perform work that should be allowed to continue in background [[UIApplication sharedApplication] endBackgroundTask:bgTask]; }#endif代码分为三个部分:
- #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 这是编译时期的条件判断。如果我们选择的BaseSDK小于4.0,不会导致编译错误。
- UIApplication的beginBackgroundTaskWithExpirationHandler方法在运行时做的check。
- check中间的功能代码。
上面代码有编译期判断和运行时check。要做两个判断,写法麻烦。我们要把两个check合并到一起:
Objective-C
IF_IOS4_OR_GREATER( UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]; // Perform work that should be allowed to continue in background [[UIApplication sharedApplication] endBackgroundTask:bgTask];);可以像下面这样实现宏:
Objective-C
#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_4_0#define kCFCoreFoundationVersionNumber_iPhoneOS_4_0 550.32 #endif#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000#define IF_IOS4_OR_GREATER(...) \ if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_4_0) \ { \ __VA_ARGS__ \ }#else#define IF_IOS4_OR_GREATER(...)#endif如果想要检查早于某一个sdk版本,可以像下面这样写:
Objective-C
#define IF_PRE_IOS4(...) \ if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_4_0) \ { \ __VA_ARGS__ \ }关于上面写的宏:
- 这里使用的是kCFCoreFoundationVersionNumber在运行时判断iOS的版本。有很多例子用的是[[UIDevice currentDevice] systemVersion]。后者需要字符串比较,没有double型的比较直接。
- 没有使用do { x } while (0) ;来包装宏。
- 宏使用了变量参数列表,加多少个变量都没有关系,用逗号隔开就行。
Objective-C
#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_2_0#define kCFCoreFoundationVersionNumber_iPhoneOS_2_0 478.23 #endif#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_2_1#define kCFCoreFoundationVersionNumber_iPhoneOS_2_1 478.26 #endif#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_2_2#define kCFCoreFoundationVersionNumber_iPhoneOS_2_2 478.29 #endif#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_3_0#define kCFCoreFoundationVersionNumber_iPhoneOS_3_0 478.47 #endif#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_3_1#define kCFCoreFoundationVersionNumber_iPhoneOS_3_1 478.52 #endif#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_3_2#define kCFCoreFoundationVersionNumber_iPhoneOS_3_2 478.61 #endif#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_4_0#define kCFCoreFoundationVersionNumber_iPhoneOS_4_0 550.32 #endif4,更好的解决方案
比使用宏更好的方式是使用一个简单的函数。
比如下面的代码:
Objective-C
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] && [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { // iPad specific layout changes } else#endif { // iPhone layout }可以使用IF_IOS4_OR_GREATER来改写,但更好的方法是下面的代码:
Objective-C
if (isIPad()){ // iPad specific layout changes}else{ // iPhone layout}关于isIPad()方法:
Objective-C
BOOL isIPad(){ IF_3_2_OR_GREATER ( if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { return YES; } ); return NO;}5,结论:
Apple没有让支持老版本的sdk非常简单。因为他们想让每个人一直使用新的系统,或者买新的设备。但这对开发人者来说很不现实,我们不能期待软件的用户一直使用新系统或新设备。
写适用多版本的程序关键点是写尽量少的if判断。你肯定不想为了对应多版本的问题,让自己的程序有很多的分支,因为每一个分支都意味着要进行测试。
如果你发现需要写很多的if判断,还可以为每个os版本写一个子类。用不同实现类实现功能。
#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED// code only compiled when targeting Mac OS X and not iOS// note use of 1050 instead of __MAC_10_5#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050if (CGColorCreateGenericCMYK != NULL) {CGColorCreateGenericCMYK(0.1,0.5.0.0,1.0,0.1);} else {#endif// code to create a color object with earlier technology#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050}#endif#endif}
- 开发适应iphone/ipad及多ios版本程序的技巧
- 开发适应iphone/ipad及多ios版本程序的技巧
- iphone/ipad前端开发技巧
- iPad/iPhone及Universal程序开发心得总结
- iPad/iPhone及Universal程序开发心得总结
- ios 开发 iphone和ipad程序中使用google地图的方法
- iOS程序开发对iPhone和iPad兼容性的规划方法
- iOS 判断iphone ipad 系统版本
- iOS 判断iphone ipad 系统版本
- iOS 判断iphone ipad 系统版本
- [IOS开发]IPhone,IPad的icon图片大小和命名
- iOS开发iPad和iPhone的启动画面设置
- ios-day25-01(iPad和iPhone开发的异同)
- iphone、ipad Web开发小技巧(知识)
- iphone/ipad网站开发技巧整理
- [ios]howto - IPAD运行IPHONE程序全屏
- 斯坦福大学公开课 iOS应用开发教程学习笔记(第七课)UIToolbar、iPad 和iPhone的通用程序
- iOS(iPhone,iPad))开发(Obje…
- 如何理解照片后期处理
- C++实现单例模式
- JNA : A fatal error has been detected by the Java Runtime Environment
- Tian Ji -- The Horse Racing hdu1052 贪心算法
- oracle常用函数
- 开发适应iphone/ipad及多ios版本程序的技巧
- 【算法导论】 插入排序实现
- Keil C中startup.a51的作用
- ubuntu下载的软件存放位置
- C++中的操作符重载
- 常量中有换行符错误提示解决
- GetMessage和PeekMessage
- asp.net url 重写解决方案
- 自定义FusionCharts图表的工具提示