iOS-版本適配

來源:互聯網
上載者:User

標籤:

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-版本適配

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.