• 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

  • 相关阅读:
    python框架之Django(2)-简单的CRUD
    python框架之Django(1)-第一个Django项目
    实习进度13
    实习进度12
    实习进度11
    实习进度10
    学习进度08
    毕设进度07
    毕设进度06
    毕设进度05
  • 原文地址:https://www.cnblogs.com/oumygade/p/4526172.html
Copyright © 2020-2023  润新知