iOS SDK 兼容性

http://www.shangxueba.com/jingyan/1845119.html

IOS SDK兼容性引導(dǎo)是本文要介紹的內(nèi)容,主要是基于IOS SDK基礎(chǔ)的開(kāi)發(fā)介紹說(shuō)明如何應(yīng)用于XCode工程的基于IOS SDK開(kāi)發(fā)的技術(shù)诈泼。

來(lái)看詳細(xì)內(nèi)容講解。

1岖赋、用(weakly linked)弱連接類(lèi)瓮孙、方法和函數(shù)來(lái)支持在不同版本之間的程序運(yùn)行

2、弱連接整個(gè)框架(framework)

3脸甘、為不同的IOS SDK選擇不同的編譯條件

4偏灿、在代碼中找出過(guò)時(shí)API的使用

5、確定在運(yùn)行時(shí)操作系統(tǒng)和框架(framework)的版本

一 翁垂、在IOS中使用弱連接類(lèi)

在工程中使用類(lèi)的弱連接的時(shí)候必須確保這些類(lèi)在運(yùn)行時(shí)的可用性,要不會(huì)引起動(dòng)態(tài)連接的錯(cuò)誤枚荣。

在IOS4.2以后的版本都是使用NSObject class的方法來(lái)檢測(cè)弱連接在運(yùn)行時(shí)態(tài)的可用性邢疙,這種簡(jiǎn)單高效的機(jī)制使用了NS_CLASS_AVAILABLE的可用性宏望薄。

檢測(cè)最近release的framework還不支持NS_CLASS_AVAILABLE的宏

在支持NS_CLASS_AVAILABLE的宏framework的條件編譯中呼畸,可以如下的使用

?.??if ([UIPrintInteractionController class]) {

?.????// Create an instance of the class and use it.

?.??} else {

?.????// Alternate code path to follow when the

?.????// class is not available.

?.??}

如果你在不確保是否已經(jīng)可以使用類(lèi)方法的時(shí)候你可以使用NSClassFromString 方法來(lái)判斷,使用方法如下:

?.??Class cls = NSClassFromString (@"NSRegularExpression");

?.??if (cls) {

?.????// Create an instance of the class and use it.

?.??} else {

?.????// Alternate code path to follow when the

?.????// class is not available.

?.??}

二卧须、在方法儒陨,函數(shù)和符號(hào)中使用弱連接

和使用類(lèi)的弱連接一樣,在使用它之前要確保方法函數(shù)和符號(hào)在運(yùn)行時(shí)的可用性蹦漠,要不在編譯的時(shí)候會(huì)報(bào)錯(cuò)動(dòng)態(tài)連接錯(cuò)誤,假設(shè)你想使用新版本IOS SDK的特性但是又想能夠運(yùn)行在低版本的SDK中隘击,那么就要對(duì)早期的版本設(shè)置相應(yīng)的開(kāi)發(fā)target研铆,在Object-c中 instancesRespondToSelector: 方法告訴我們所給的方法是否可用,例如:使用availableCaptureModesForCameraDevice:這個(gè)方法(在4.0以后才是可用的)凶赁,我們可以這樣使用它逆甜。

1、檢查一個(gè)Object-c方法的可用性

?.??if ([UIImagePickerController instancesRespondToSelector:

?.?????????@selector (availableCaptureModesForCameraDevice:)]) {

?.????// Method is available for use.

?.????// Your code can check if video capture is available and,

?.????// if it is, offer that option.

?.??} else {

?.????// Method is not available.

?.????// Alternate code to use only still image capture.

?.??}

判斷一個(gè)弱連接的C函數(shù)是否可用忆绰,只要判斷函數(shù)的地址是否返回為NULL,以CGColorCreateGenericCMYK 函數(shù)為例,我們可以像以下那樣使用缕粹。

2、檢查C方法的可用性

?.??if (CGColorCreateGenericCMYK != NULL) {

?.????CGColorCreateGenericCMYK (0.1,0.5.0.0,1.0,0.1);

?.??} else {

?.????// Function is not available.

?.????// Alternate code to create a color object with earlier technology

?.??}

要檢測(cè)一個(gè)C方法是否可用亚享,比較明確的為地址是否為NULL或零绘面。你不能使用反運(yùn)算符(!)來(lái)否定一個(gè)函數(shù)的可用性

檢測(cè)一個(gè) external(extern)常量或一個(gè)通知的名字應(yīng)當(dāng)比較它的地址(address)--而不是符號(hào)的名稱(chēng)侈沪, 判斷是否為NULL or nil

三晚凿、弱連接整個(gè)Framework

比如一個(gè)在高版本中才出現(xiàn)的Framework,想在低版本使用他的特性应役。那你就必須弱連接那個(gè)使用的Framework燥筷,詳見(jiàn)官方的圖解---(其實(shí)就是在添加進(jìn)去的Framework的 required 改成 optional)

?.??http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/XcodeProjectManagement/

?.??130-Files_in_Projects/project_files.html#//apple_ref/doc/uid/TP40002666-SW4

四、條件編譯for不同的SDK

如果你不止基于一個(gè)IOS SDK編譯袍祖,你就可能需要為base sdk使用條件化谢揪,可以使用在Availability.h中的定義。這個(gè).h文件存在于系統(tǒng)的文件夾/usr/include的文件夾下键耕,例如想在Mac OS X v10.5(而不是IOS)中使用函數(shù) CGColorCreateGenericCMYK

使用預(yù)處理指令for條件編譯

?.??#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED

?.????// code only compiled when targeting Mac OS X and not iOS

?.????// note use of 1050 instead of __MAC_10_5

?.??#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050

?.????if (CGColorCreateGenericCMYK != NULL) {

?.??????CGColorCreateGenericCMYK(0.1,0.5.0.0,1.0,0.1);

?.????} else {

?.??#endif

?.????// code to create a color object with earlier technology

?.??#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050

?.????}

?.??#endif

?.??#endif

?.??}

五屈雄、尋找出在程序中使用已經(jīng)過(guò)時(shí)的實(shí)例

在IOS或Mac OS中有時(shí)候API會(huì)過(guò)時(shí),但是過(guò)時(shí)不代表著那些就從Library或framework中刪除酒奶,但是在使用的過(guò)程中會(huì)報(bào)出warning,并且在不遠(yuǎn)的將來(lái)可能會(huì)被Apple從中移除杠氢。例如我們?cè)赾ode中使用了過(guò)時(shí)的函數(shù) HPurge那么就會(huì)報(bào)出如下

?.??'HPurge' is deprecated (declared at /Users/steve/MyProject/main.c:51)

所以我們應(yīng)當(dāng)在工程中查找出如下的警告并且修改另伍。

六、確定操作系統(tǒng)和Framework的版本

在運(yùn)行時(shí)檢查IOS的版本

?.??NSString *osVersion = [[UIDevice currentDevice] systemVersion];

在運(yùn)行時(shí)檢查Mac OS X用Gestalt function 和 系統(tǒng)版本常量

另外摆尝,對(duì)于許多的Framework你可以在運(yùn)行時(shí)檢查指定Framework的版本。

例如:Application Kit(NSApplication.h)定義了NSAppKitVersionNumber常量---可以用來(lái)檢查Application Kit Framework的版本

?.??APPKIT_EXTERN double NSAppKitVersionNumber;

?.??#define NSAppKitVersionNumber10_0 577

?.??#define NSAppKitVersionNumber10_1 620

?.??#define NSAppKitVersionNumber10_2 663

?.??#define NSAppKitVersionNumber10_2_3 663.6

?.??#define NSAppKitVersionNumber10_3 743

?.??#define NSAppKitVersionNumber10_3_2 743.14

?.??#define NSAppKitVersionNumber10_3_3 743.2

?.??#define NSAppKitVersionNumber10_3_5 743.24

?.??#define NSAppKitVersionNumber10_3_7 743.33

?.??#define NSAppKitVersionNumber10_3_9 743.36

?.??#define NSAppKitVersionNumber10_4 824

?.??#define NSAppKitVersionNumber10_4_1 824.1

?.??#define NSAppKitVersionNumber10_4_3 824.23

?.??#define NSAppKitVersionNumber10_4_4 824.33

?.??#define NSAppKitVersionNumber10_4_7 824.41

?.??#define NSAppKitVersionNumber10_5 949

?.??#define NSAppKitVersionNumber10_5_2 949.27

?.??#define NSAppKitVersionNumber10_5_3 949.33

所以我們可以像如下使用:

?.??if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_0) {

?.???/* On a 10.0.x or earlier system */

?.??} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_1) {

?.???/* On a 10.1 - 10.1.x system */

?.??} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_2) {

?.???/* On a 10.2 - 10.2.x system */

?.??} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_3) {

?.???/* On 10.3 - 10.3.x system */

?.??} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_4) {

?.???/* On a 10.4 - 10.4.x system */

?.??} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_5) {

?.???/* On a 10.5 - 10.5.x system */

?.??} else {?}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市琐鲁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌围段,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暴构,死亡現(xiàn)場(chǎng)離奇詭異段磨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)砾隅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)债蜜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寻定,你說(shuō)我怎么就攤上這事±撬伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵恼蓬,是天一觀的道長(zhǎng)僵芹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拇派,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任桐腌,我火速辦了婚禮苟径,結(jié)果婚禮上躬审,老公的妹妹穿的比我還像新娘蟆盐。我一直安慰自己遭殉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布痹愚。 她就那樣靜靜地躺著,像睡著了一般拯腮。 火紅的嫁衣襯著肌膚如雪蚁飒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天琼懊,我揣著相機(jī)與錄音爬早,去河邊找鬼。 笑死筛严,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脑漫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吨拍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼网杆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起队秩,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤昼浦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鸟蟹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乌妙,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藤韵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年熊经,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镐依。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馋吗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宏粤,到底是詐尸還是另有隱情,我是刑警寧澤来农,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布崇堰,位于F島的核電站,受9級(jí)特大地震影響海诲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜特幔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一蚯斯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拍嵌,春花似錦、人聲如沸横辆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炫惩。三九已至,卻和暖如春他嚷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卸耘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工粘咖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓮下。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓讽坏,卻偏偏與公主長(zhǎng)得像锭魔,于是被迫代替她去往敵國(guó)和親路呜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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