zoukankan      html  css  js  c++  java
  • 解决多版本sdk兼容问题

    使用Xcode开发iPhone APP的时候, 为了保证代码的向下兼容, 有时候可能需要用到条件编译。 譬如有些代码只在4.0及以后版本中可用, 如MFMessageComposeViewController

        #define __IPHONE_2_0     20000
        #define __IPHONE_2_1     20100
        #define __IPHONE_2_2     20200
        #define __IPHONE_3_0     30000
        #define __IPHONE_3_1     30100
        #define __IPHONE_3_2     30200
        #define __IPHONE_4_0     40000
        #define __IPHONE_NA      99999  /* not available */
       

    上面的代码预定义在iPhone SDK 4中,当我们查看SDK3。x版本的定义时,发现其中没有定义__IPHONE_4_0, 故我们可以通过判断是否定义__IPHONE_4_0来确定是否为4。x的版本。

    #ifdef __IPHONE_4_0
    #import ...
    #endif
       
    3



    编译App的时候,可以指定App所使用的SDK,这样可以让App在多个OS版本上运行。比如:
    1> 向上兼容(forward-compatibility):为某一OS做优化,同时还可以在以后的更高的OS版本上运行。
    2> 向下兼容(backward-compatibility):让App在老的OS版本上也能运行。
    为实现此功能,需要指定各个OS的头文件和相应的库(headers and libs),还要指定最小版本。这些由Xcode设置里的Base SDK和Deployment OS version决定。
    Deployment OS version决定了你可以无条件使用的所有函数和系统调用;Base SDK决定了你可以挑选的一些功能。
    如果你想在App中使用连Base SDK都不支持的函数,那会产生一个编译错误。
    如果你使用了在文档中标明了在Base SDK中是deprecated的函数,那会产生一个编译警告。
    如果你使用了Base SDK里的可选函数,然后编译出App。可是安装到低SDK版本的iPhone上,该函数只是一个空指针。

    随着frameworks逐代演化,很多API引入,同时很多API被废弃,现存的API也会有变化。苹果为了消除API的不兼容,会提供备选项。在这种时候,程序员需要根据framework版本的不同使用不同的API。苹果的framework也会自动检测用户iPhone上的SDK版本,然后做相应调整。(前提是framework可以发现这些不兼容)

    这些不兼容的API都会在framework release notes里标明。所以,release note是相当重要的东西。

    如果想知道如何根据不同的SDK进行条件编译,如何在程序运行时判断SDK,如何查找deprecated函数,请参照:
    http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW6


    下面是两种常用的方法,简单有效。
    条件编译:
    #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2
    // iPhone 3.0 code here
    #endif

    动态区分:
    float version = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (version >= 3.0)
    {
    // iPhone 3.0 code here
    }
  • 相关阅读:
    jquery获取网页在浏览器中可见宽度与高度
    mysql子查询
    ffmpeg 转码并截图的命令分析
    mysql find_in_set 与 in 的用法与区别,mysql范围搜索,mysql范围查询
    CSS一行显示,显示不下的用省略号显示
    js如何通过变量调用函数,函数名在变量里面
    jq自定义下拉菜单,在点击非当前下拉菜单区域时,关闭下拉菜单(点击事件的对象不是目标元素本身)
    解决JS浮点数(小数)计算加减乘除的BUG
    php裁剪图片
    百度蜘蛛ip段代表的不同含义
  • 原文地址:https://www.cnblogs.com/ligun123/p/2758955.html
Copyright © 2011-2022 走看看