iOS多版本多设备适配的问题

好吧,能找到这文章的,一般是接到了如下需求: 

我是从raywenderlich抽了点内容出来做日记,另外,本文说的不是布局的适配,而是因为ios的升级带来的各版本代码上的不兼容。

Deployment Target vs. Base SDK

总的来说,Base SDK表示你愿意支持的最高版本,位于你要设置的Target的属性页的Build Settings > Architectures,一般就选择Latest iOS即可,比如我写这篇日志的时候已经是8.0了 
而Deployment Target则表示了你愿意支持的最低版本,位于同样的Build Setting下的Deployment一节里面,你可以找到iOS Deployment Target

发现兼容问题

这个简单:

运行老旧系统的真机

你有那么多机器的话

运行模拟器

你有装那么多SDK的话,当然这个也不是不可能啦

苹果的文档

Header Files

原文如下,但是我真没发现Command-click后跳转的有 NS_AVAILABLE_IOS() and NS_CLASS_AVAILABLE_IOS()这两个宏,这不能说明就没有兼容性问题吧?。。。
Sometimes the best documentation of methods and classes is contained right in the source code.
Simply Command-click the symbol you want to inspect, and Xcode will take you to its header file, where you will find the information you need along with the parameters of the preprocessor macros NS_AVAILABLE_IOS() and NS_CLASS_AVAILABLE_IOS(). If a class or method declaration doesn’t use either of those availability macros, you can assume that they won’t cause any compatibility issues.

Note: ALT + click on a method will display a popover that contains these same details along with other information about the method.

苹果提供的Apid Diffs

这个应该是最全的了
https://developer.apple.com/library/ios/releasenotes/General/iOS60APIDiffs/
https://developer.apple.com/library/ios/releasenotes/General/iOS70APIDiffs/
依次类推,
当然预览状态的就是如下了:
https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS80APIDiffs/

Deploymate

这是一个付费服务,简单来说,花钱外包了。油条帮上的演示视频deploymate,自行翻墙

MJGAvailability

一个示例头文件,来自MJGFoundation,会欺骗编译器某些api已经deprecated了,从而触发警告,用法在文件头已经说得很清楚了,自己可以试试。

解决兼容问题

新版本会引入新的框架、类、方法、常量以及枚举,分别如下

frameworks

Build Phases -> Link Binary With Libraries,将特定框架从Required改为Optional,这将会weak link你选定的框架

classes

目标版本可能不支持的类,文章提供的是iOS4.2的写法,严重怀疑现在有了新的写法,或者已经不支持了,希望有人留个言:

if ([SLComposeViewController class]) {
    //Safe to use SLComposeViewController
} else {
    //Fail gracefully
}

methods

if ([self.image respondsToSelector:@selector(resizableImageWithCapInsets:resizingMode:)]) {
    //Safe to use this way of creating resizable images
} else {
    //Fail gracefully
}

如果是类方法,用类而不是实例即可:

if ([UIView respondsToSelector:@selector(requiresConstraintBasedLayout)]) {
    //Safe to use this method
} else {
    //Fail gracefully
}

同样的方法可以探测类是否支持某个属性,比如UILabel是否有attributedText,可以用@selector(setAttributedText)

constants/C functions

一般表现为extern NSString *或C语言的方法,比如一个iOS6引入的c方法ABAddressBookCreateWithOptions(...),在iOS5中想不挂掉可以这么判断:

if (ABAddressBookCreateWithOptions != NULL) {
    //Safe to use
}
else {
    //Fail gracefully
}

常量也一样:

if (&UIApplicationWillEnterForegroundNotification) {
    //Safe to assume multitasking support
}
else {
    //Fail gracefully
}

enumeration values

请看原文
Checking for the existence of enumeration or bit mask values — the kind that you would find inside an NS_ENUM or NS_OPTIONS declaration — is incredibly difficult to check at runtime. Why?
Under the hood, an enumeration is just a method of giving names to numeric constants. An enum is replaced with an int when compiled, which always exists!
If you’re faced with the situation of needing to see if a certain enumeration exists, all you can do is either explicitly check the OS version (which isn’t recommended) or alternatively check against another API element that was introduced at the same time as the new enumeration value.

Note: Whichever way you do this, be sure to add adequate comments to any such code and consider wrapping the code in a dedicated compatibility helper.

显式版本检测

NSString *osVersion = [[UIDevice currentDevice] systemVersion];, 但作者不推荐。。。

最后,水果官方的兼容性指南:SDK Compatibility Guide

iOS多版本多设备适配的问题

时间: 2024-11-06 09:55:47

iOS多版本多设备适配的问题的相关文章

获取iOS系统版本和设备的电量

获取iOS系统版本 --- UIDevice的使用 UIDevice类是一个单例,其唯一的实例( [UIDevice currentDevice] ) 代表了当前使用的设备. 通过这个实例,可以获得设备的相关信息(包括系统名称,版本号,设备模式等等). 也可以使用使用该实例来监测设备的特征(比如物理方向). NSString *strName = [[UIDevice currentDevice] name]; // 设备名称 NSString *strId = [[UIDevice curre

IOS版本和IPHONE5适配总结

今天花了一天的时间对IOS6和IPHONE5进行适配 [由于自己用的机器是IPHONE5,所以没出什么问题,但是在IPHONE4上就出问题了,都是IOS7版本,还有一台IPOD是IOS6版本,也出问题- 哎,一开始没注意适配,现在得花这精力去修改-  特总结一下,防止以后犯错误,提高工作效率,加油!] 由于习惯问题,都在视图控制器下的viewDidLoad去创建自定义的UI元素,因为IOS版本问题,所以self.view.frame也会不同,如果要实现相同的UI布局,用代码进行测试,发现以下4种

iPhone 屏幕适配判断 和 iOS系统版本判断

? 1 2 3 4 5 6 7 8 9 if([[[UIDevicecurrentDevice]systemVersion]floatValue]>=7.0) {     // iOS7.0及以上版本系统适配 } if([UIScreen mainScreen].bounds.size.height == 568) {     // iPhone 屏幕适配 } 可以写成宏定义放在pch文件中, ? 1 2 3 4 // 判断是否为iPhone5 #define iPhone5 ([UIScree

iOS不同版本适配问题(#ifdef __IPHONE_7_0)

部分参考http://www.cnblogs.com/ios8/p/ios-version-com.html 下面举个简单的例子来说明在iOS7.0和iOS6.1(以及更低版本)之间的适配问题(用的是xcode5.0,里边有6.1和7.0两个版本的sdk) 新建一个工程,默认的development target,base sdk以及模拟器的版本都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法里写下 self.window.tintColor

iOS开发UI篇—屏幕适配autoResizing autoLayout和sizeClass图文详解

1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iOS6之前完全可以胜任了,因为苹果手机只有3.5寸的屏幕,在加上手机app很少支持横屏,所以iOS开发者基本不用怎么适配布局,所有的ui控件只要相对父控件布局就可以了,没错autoResizing就是一个相对于父控件的布局解决方法:注意:它只能相对父控件布局:***在xcode中可以通过可视化的界面调整也可以通过代码去控制 在用autoResizing的时候需要关闭autoLayout和sizeclas

移动端开发多设备适配

一.移动端多设备适配 参考了手机淘宝: 针对安卓所有设备,devicePixelRatio(简称dpr),统一当作"1"处理,即一倍屏:然后viewport的宽度就等于device-width,但是淘宝的做法是没有对viewport的width做明确指定,仅指定了scale值:因为浏览器实际上会根据scale来设置viewport的宽度: 针对ios,则存在2倍,3倍屏: 最终就是根据dpr来确定html根元素的字体大小,所有元素的宽高以rem单位来展示: 这里有一个基准值,就是设计稿

iOS视网膜(Retina)屏幕的适配方法

本文链接:http://www.penddy.com/mobile-client-knowledge-processing-1-ios-retinal-adaptation-of-the-retina-screen.html 在产品中良好的支持Retina屏幕. 一.支持视网膜(retina)屏幕的设备 设备 分辨率 屏幕尺寸 长宽比 解析度 iPod Touch 4 640×960 3.5" 3:2 326ppi iPhone 4 640×960 3.5" 3:2 326ppi iP

【Android应用开发技术:用户界面】设备适配

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 由于Android平台的丰富性和多样性,全世界的Android设备有着各种各样的尺寸和大小,而为了能够推广我们的应用给各种各样的用户,设备适配是一件很重要的工作. 一 语言适配 把UI中的字符串存储在外部文件,通过代码提取,这是一种很好的做法.Android可以通过工程中的资源

【ios开发】 判断设备屏幕尺寸、分辨率

IOS 设备现有的分辨率如下:iPhone/iPod Touch普通屏                          320像素 x 480像素       iPhone 1.3G.3GS,iPod Touch 1.2.33:2 Retina 屏           640像素 x 960像素        iPhone 4.4S,iPod Touch 416:9 Retina 屏               640像素 x 1136像素      iPhone 5,iPod Touch 5