標籤:
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]; }
iOS-版本適配