iOS不同版本適配問題(轉(zhuǎn))

下面舉個(gè)簡(jiǎn)單的例子來(lái)說明在iOS7.0和iOS6.1(以及更低版本)之間的適配問題(用的是xcode5.0,里邊有6.1和7.0兩個(gè)版本的sdk)

// 當(dāng)前系統(tǒng)支持的最小版本 min
__IPHONE_OS_VERSION_MIN_REQUIRED
// 當(dāng)前系統(tǒng)支持的最大版本 max
__IPHONE_OS_VERSION_MAX_ALLOWED

min的取值來(lái)自于你項(xiàng)目的deployment target, 即你的app愿意支持的最低版本

max的取值來(lái)自于你的sdk的版本, 比如現(xiàn)在我的是xcode6.1, sdk版本是iOS 8.1, 那么這個(gè)宏的值永遠(yuǎn)是80100,
先拋出一個(gè)問題 如何在iOS低版本(<8.0) 使用UIAlertViewController(ios8+)

新建一個(gè)工程,默認(rèn)的development target渐北,base sdk以及模擬器的版本都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法里寫下

self.window.tintColor = [UIColor redColor];    

然后運(yùn)行范删,這樣是沒有任何錯(cuò)誤的矾利。接下來(lái)將development target,base sdk以及模擬器的版本都改成6.1(注意默認(rèn)的xcode是沒有6.1的sdk的信粮,需要自己另外導(dǎo)入)黔攒。然后運(yùn)行,就會(huì)報(bào)錯(cuò):
也就是說tintColor屬性在iOS6.1中根本就沒有强缘,在編譯時(shí)候就會(huì)出錯(cuò)亏钩。這時(shí)候如下加上判斷語(yǔ)句也是沒有用的,照樣報(bào)錯(cuò)(預(yù)處理欺旧,編譯姑丑,運(yùn)行的問題這里不再?gòu)U話)

 
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {    
    self.window.tintColor = [UIColor redColor];    
} 

遇見這種情況只能加上預(yù)處理語(yǔ)句,這樣寫:

#ifdef __IPHONE_7_0    
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {    
        self.window.tintColor = [UIColor redColor];    
    }    
#endif

或者

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000  
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {    
        self.window.tintColor = [UIColor redColor];    
    }    
#endif 

在使用framework或者.a的時(shí)候需要注意
因?yàn)樵诰幾gframework或者.a的時(shí)候是依賴當(dāng)時(shí)編譯的環(huán)境決定的辞友,如使用iOS6的sdk可以將framework或者.a順利編譯通過栅哀,但是在真正生成app的時(shí)候需要保證編譯app時(shí)的sdk和編譯framework或者.a的sdk是一致的,且同時(shí)需要加入運(yùn)行時(shí)判斷([[[UIDevice currentDevice] systemVersion] floatValue]那個(gè))
說明:
1称龙、如果是使用低版本sdk編譯的(如iOS6)留拾,將最終的應(yīng)用安裝至高版本的設(shè)備上(iOS7的系統(tǒng)),此時(shí)應(yīng)該不會(huì)出現(xiàn)問題鲫尊,因?yàn)閕OS7兼容iOS6痴柔,但是無(wú)法使用iOS7特有的新功能,因?yàn)榇a被屏蔽了疫向。
2咳蔚、如果是使用高版本sdk編譯的(如iOS7),將最終的應(yīng)用安裝至低版本的設(shè)備上(iOS6的系統(tǒng))搔驼,此時(shí)如果不加入運(yùn)行時(shí)判斷就會(huì)出現(xiàn)問題(可能是crash)谈火。因?yàn)閼?yīng)用本身是用iOS7編譯的,并使用iOS7才有的新功能舌涨,而設(shè)備并不支持iOS7糯耍。

__IPHONE_OS_VERSION_MAX_ALLOWED編譯環(huán)境判斷,判斷當(dāng)前開發(fā)時(shí)使用的sdk的版本囊嘉。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000
   // 所使用的sdk為5.0以上的版本温技,在此的代碼在編譯時(shí)不會(huì)保存,但是允許在低版本ios系統(tǒng)的設(shè)備上運(yùn)行就會(huì)崩潰的

   // 例如:你使用xcode6.1開發(fā)扭粱,SDK版本為8.1來(lái)開發(fā)項(xiàng)目舵鳞,并使用新API的新功能,在編譯時(shí)沒有問題焊刹,但是允許ios7系統(tǒng)的設(shè)備上就會(huì)崩潰
#else

    //不能使用該API的代碼編寫
#endif

所以不能使用它來(lái)判斷你的項(xiàng)目是否支持低版本ios系統(tǒng)的設(shè)備

綜合以上系任,如要實(shí)現(xiàn)使用 ios8新的 UIAlertCtrl 的例子:

  1. 先判斷編譯環(huán)境, 以避免低版本SDK不認(rèn)識(shí)高版本SDK的api, 造成編譯錯(cuò)誤
  2. 在高版本SDK的條件內(nèi), 自行開始判斷SDK版本, 或responedToSelector都可以,來(lái)判斷是否使用高版本的api
  3. 在低版本條件內(nèi), 直接用低版本的api

// 編譯時(shí)判斷:檢查SDK版本
#if __IPHONE_OS_VERSION_MAX_ALLOWED > 80000
    // 運(yùn)行時(shí)判斷:檢查當(dāng)前系統(tǒng)版本
    if ([UIDevice currentDevice].systemVersion.floatValue > 8.0f) {
//這里寫UIAlertController
    } else {
        // 用舊的代替 UIAlertView
    }
#else
    // ...
#endif

原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恳蹲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俩滥,更是在濱河造成了極大的恐慌嘉蕾,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜旧,死亡現(xiàn)場(chǎng)離奇詭異错忱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挂据,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門以清,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人崎逃,你說我怎么就攤上這事掷倔。” “怎么了个绍?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵勒葱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我巴柿,道長(zhǎng)凛虽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任广恢,我火速辦了婚禮凯旋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好踪蹬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睡蟋,像睡著了一般踏幻。 火紅的嫁衣襯著肌膚如雪枷颊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天该面,我揣著相機(jī)與錄音夭苗,去河邊找鬼。 笑死隔缀,一個(gè)胖子當(dāng)著我的面吹牛题造,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猾瘸,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼界赔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丢习!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起淮悼,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咐低,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后袜腥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體见擦,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年羹令,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲤屡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡福侈,死狀恐怖酒来,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肪凛,我是刑警寧澤役首,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站显拜,受9級(jí)特大地震影響衡奥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜远荠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一矮固、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧譬淳,春花似錦档址、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浦妄,卻和暖如春尼摹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剂娄。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蠢涝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阅懦。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓和二,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耳胎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惯吕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容