iOS-版本适配

1. 框架的可用性检查

 弱链接某框架(方法:targets--Bulid Phases--Link Binary With Libraries,在需要使用弱链接的框架上,把默认的Required,改成Optional)

2. 类的可用性检查

 id myObj = [[NSClassFromString(@"NSLayoutManager") alloc] init];  // 在iOS6上运行,myObj是nil

 id myObj = [[NSLayoutManager alloc] init];  // 在iOS6上编译会出错

3. 方法的可用性检查

if ([self.view respondsToSelector:@selector(setTintColor:)]) {

// to do

}

  注:如果检查的方法是C全局函数,应该像下面这样

    if (CFunction != NULL){

      CFunction(a);zs

    }

  不能隐式的假定CFunction指针为nil或NULL,也就是说不能像下面这样

    if (CFunction){

      CFunction(a);

    }

  也不能使用带圆括号的CFunction,也就是说不能像下面这样 

    if ( CFunction() != NULL){

      CFunction(a);

    }

4. 检查设备功能

不要通过设备类型或设备型号去判断设备功能(麦克风,摄像头等等)

4.1 UIDevice+Additions.h

#import <UIKit/UIKit.h>

@interface UIDevice (Additions)

/**

*  麦克风可不可用

*/

- (BOOL)add_microphoneAvailable;

/**

*  控制器的ViewDidload里实现下面方法,即可监听插入麦克风的事件

*

*  @param then 监听到麦克风插入事件的回调方法

*/

- (void)add_externalMicrophoneAndThen:(void(^)())then;

/**

*  检查摄像头可不可用

*/

- (BOOL)add_cameraAvailable;

/**

*  检查前置摄像头可不可用

*/

- (BOOL)add_frontCameraAvailable;

/**

*  检查摄像头支不支持视频录制

*/

- (BOOL)add_videoCameraAvailable;

/**

*  检查相册是否为空

*/

- (BOOL)add_emptyPhotoLibrary;

/**

*  检查闪光灯可不可用

*/

- (BOOL)add_cameraFlashAvailable;

/**

*  检查陀螺仪可不可用

*/

- (BOOL)add_gyroscopeAvailable;

/**

*  检查指南针可不可用

*/

- (BOOL)add_compassAvailable;

/**

*  检查是不是retina屏幕

*/

- (BOOL)add_retinaDisplayCapable;

/**

*  震动1:在iphone上震动,在ipad、ipod上发出"哔哔"的响声

*/

- (void)add_vibrateType1;

/**

*  震动2:在iphone上震动,在ipad、ipod上什么也不做

*/

- (void)add_vibrateType2;

/**

*  检查能不能打电话

*/

- (BOOL)add_canMakePhoneCalls;

/**

*  检查能不能发短信

*/

- (BOOL)add_canSendText;

/**

*  检查能不能发邮件

*/

- (BOOL)add_canSendMail;

@end

4.2 UIDevice+Additions.m

#import "UIDevice+Additions.h"

#import <AVFoundation/AVFoundation.h>

#import <CoreMotion/CoreMotion.h>

#import <CoreLocation/CoreLocation.h>

#import <AudioToolbox/AudioToolbox.h>

#import <MessageUI/MessageUI.h>

#import <MobileCoreServices/MobileCoreServices.h>

#import <objc/runtime.h>

@implementation UIDevice (Additions)

- (BOOL)add_microphoneAvailable

{

return [[AVAudioSession sharedInstance] isInputAvailable];

}

static char thenBlockKey;

- (void (^)())thenBlock

{

return objc_getAssociatedObject(self, &thenBlockKey);

}

- (void)setThenBlock:(void(^)())thenBlock

{

objc_setAssociatedObject(self, &thenBlockKey, thenBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);

}

static id mySelf;

- (void)add_externalMicrophoneAndThen:(void(^)())then

{

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable,audioInputPropertyListener,nil);

if(then != nil){

self.thenBlock = then;

}

}

void audioInputPropertyListener(void *inClientData,AudioSessionPropertyID inID,UInt32 inDataSize,const void *inData)

{

UInt32 isAvailable = *(UInt32 *)inData;

BOOL micAvailable = (isAvailable > 0);

// 怎么让block在这里被调用 ?

}

- (BOOL)add_cameraAvailable

{

return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];

}

- (BOOL)add_frontCameraAvailable

{

#ifdef __IPHONE_4_0

return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];

#else

return NO;

#endif

}

- (BOOL)add_videoCameraAvailable

{

if (![self add_cameraAvailable]) {

return NO;

}

NSArray *sourceTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

if (![sourceTypes containsObject:(NSString *)kUTTypeMovie]) {

return NO;

}

return YES;

}

- (BOOL)add_emptyPhotoLibrary

{

return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];

}

- (BOOL)add_cameraFlashAvailable

{

return [UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceRear];

}

- (BOOL)add_gyroscopeAvailable

{

CMMotionManager *mgr = [[CMMotionManager alloc]init];

BOOL gyroscopeAvailable = mgr.gyroAvailable;

return gyroscopeAvailable;

}

- (BOOL)add_compassAvailable

{

return [CLLocationManager headingAvailable];

}

- (BOOL)add_retinaDisplayCapable

{

int scale = 1.0;

UIScreen *screen = [UIScreen mainScreen];

if ([screen respondsToSelector:@selector(scale)]) {

scale = screen.scale;

if (scale == 2.0f) {

return YES;

} else {

return NO;

}

}

return NO;

}

/**

*  在iphone上震动,在ipad、ipod上发出"哔哔"的响声

*/

- (void)add_vibrateType1

{

AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

}

/**

*  在iphone上震动,在ipad、ipod上什么也不做

*/

- (void)add_vibrateType2

{

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

}

- (BOOL)add_canMakePhoneCalls

{

return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://10086"]];

}

- (BOOL)add_canSendText

{

return [MFMessageComposeViewController canSendText];

}

- (BOOL)add_canSendMail

{

return [MFMailComposeViewController canSendMail];

}

@end

单个VC的iOS版本适配:

xcode5 中的界面布局 根据sdk 分成ios7.0 and Later 和 ios6.1 and Earlier 两种,那如何xib同时支持 ios6 和ios7 的界面呢

方法如下:

在xcode5 中分别创建两个 xib文件 和对应的ViewControl关联, 这两个xib文件一个支持ios6 一个支持ios7

在跳转本界面时,在代码里面实现如下:

    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0)
    {
        AboutUSView *aboutUSView= [[[AboutUSView alloc] initWithNibName:@"AboutUSView1" bundle:nil] autorelease];
        [self.navigationController pushViewController:aboutUSView animated:TRUE];
    }
    else
    {
        AboutUSView *aboutUSView= [[[AboutUSView alloc] initWithNibName:@"AboutUSView" bundle:nil] autorelease];
        [self.navigationController pushViewController:aboutUSView animated:TRUE];
    }
时间: 2024-11-05 05:34:54

iOS-版本适配的相关文章

IOS版本和IPHONE5适配总结

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

不同iOS版本做代码适配__IPHONE_OS_VERSION_MAX_ALLOWED 和 __IPHONE_8_0等专业术语

目前开发只想最低版本支持iOS8了,iOS8以前的就不管了,然后现在iOS9和iOS10出来以后,有些新的API,也有些弃用的API,为了兼容,有时候代码里面需要编写判断不同iOS版本,或者只允许指定的iOS版本才可以编译或者执行. 需要用到以下方式,以下方式只针对OC(Swift的写法暂时还不清楚,等需要的时候在补充): 示例: //ios8.0以后用此方法替代willRotateToInterfaceOrientation:duration:这个方法 #if __IPHONE_OS_VERS

iOS开发 适配iOS10以及Xcode8

iOS开发 适配iOS10以及Xcode8 现在在苹果的官网上,我们已经可以下载到Xcode8的GM版本了,加上9.14日凌晨,苹果就要正式推出iOS10系统的推送了,在此之际,iOS10的适配已经迫在眉睫啦,不知道Xcode8 beat版本,童鞋们有木有下载过来试试呢?就我的使用来说,总体觉得苹果还是坑不断,但是也在一直进步的啦.下面我就来说说,iOS10的适配以及Xcode8使用上的一些注意点. 一.证书管理 用Xcode8打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自

iOS - 屏幕适配-之自动适配

最近把xcode升级到7,然后就是各种蛋疼的问题,出现,期中有一个就是屏幕适配的问题,由于 我的项目比较老,所以,一直没怎么注意过屏幕适配,都是ios 自动适配,这在ios8 之前都没有问题,但是在ios9后,这个问题就出现了,启动程序后,,出现上下边黑屏,找了些资料,弄明白: 从Xcode6 GM版本开始,模拟器新增了iPhone6和iPhone6 Plus两种,如果旧的工程直接跑到这两个模拟器中时,默认是"兼容模式",即系统会简单的把内容等比例放大,显示效果有些模糊但尚可接受.此时

iOS开发 适配iOS10

iOS开发 适配iOS10----------------------- 转载自"鸿鹄当高远" 的博客园 2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非

iOS 9 适配中出现的坑

整理 iOS 9 适配中出现的坑(图文) 2015-10-22 iOS开发 库克表示:“现在在中国有150多万的开发者在iOS当中开发应用程序,我们鼓励更多的人开发应用程序,也鼓励更多的创业加入.” 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级iOS9,也就逐渐的衍生出了一系列的问题,笔者也在赶忙为自己维护的App做适配,本文写的一些坑基本都

Android最佳实践之SystemBar状态栏全版本适配方案

前言 自从MD设计规范出来后,关于系统状态栏的适配越受到关注,因为MD在5.0以后把系统状态栏的颜色改为可由开发者配置的,而在5.0之前则无法指定状态栏的颜色,所以这篇就说说使用Toolbar对系统状态栏的适配策略 主流App的适配效果 手Q在这方面适配非常好,将标题栏和状态栏合为一起了,和iOS效果一模一样,如下: 4.4.5.0+ 4.4以下版本 4.4以下版本则是系统默认的黑色状态栏,因为4.4以下没办法对状态栏进行改变和配置. 关于手Q的适配,对4.4以上所有版本都保留着一致的UI效果,

iOS屏幕适配(尺寸适配)

屏幕适配在用Masonry.或者其他的感觉有点用不习惯,屏幕尺寸适配是我在前辈哪儿雪来的,简单分享一下我的写法,不成熟之处望多多指教,仅供参考:建议跟着代码敲一遍,以后自己用者熟悉方便,原理也很简单:废话有点多了,上 创建项目-创建PCH文件:若要创建.pch , 在other里选择 PCH file,并需要修改一下设置.在build settings 里设置 Precompile Prefix Header的值为YES,并设置Prefix Header的路径. 创建一个扩展文件UIView+C

iOS:界面适配--iPhone不同机型适配 6/6plus

iOS:界面适配--iPhone不同机型适配 6/6plus        机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系,比如1:1或1:2等: ppi:代表屏幕物理大小到图片大小的比例值,如果ppi不变,则坐标和像素的比例不会变: iPhone 4以前 iPhone.iPhone3/3G机型未采用retina,坐标是320 x 480,屏幕像素320 x 480 ,他们一一对应,1:1关系.即一个坐标对应1个像素.

IOS界面适配二: Auto Layout的使用(上)

上一篇讲了IOS中基础的距离单位,链接为 IOS界面适配一: Pt与Px的关系 ,使用距离单位可以定义我们程序中View的大小,但是,仅仅使用Pt定义大小是远远不够的. 比如,我们想让一个button距离手机左边界为20pt,右边界为20pt,距上为30pt,高度自身为20pt,如果在iphone5中(为320pt*568pt),我们要在代码中这么定义 以下代码写在ViewController中的viewDidLoad方法中: UIButton * button = [[UIButton all