前言
在iOS開發(fā)中,我們有時(shí)會遇到不同的系統(tǒng)有些方法或者屬性是不同的,甚至是沒有的,這個(gè)時(shí)候一般我們就需要針對不同的系統(tǒng)來作兼容。
一個(gè)例子引起的思考
下面我們來看一個(gè)對于注冊推送的熟悉例子:
- (void)registerRemoteNotification:(UIApplication *)application {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
if (XXX_HIGHT_ThAN_IOS8()) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert)categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}
#else
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif
}
問題來了,請問這段代碼真的沒有什么問題嗎 ?
首先我們需要了解這個(gè)系統(tǒng)的宏__IPHONE_OS_VERSION_MAX_ALLOWED(與其對應(yīng)的是'__IPHONE_OS_VERSION_MIN_REQUIRED ')
,它其實(shí)針對的是編譯器,在不同版本的編譯器Xcode
里,宏__IPHONE_OS_VERSION_MAX_ALLOWED
對應(yīng)不同的版本,目前我的Mac安裝的Xcode8.3.3
版本,__IPHONE_OS_VERSION_MAX_ALLOWED
宏定義:
所以,注意這個(gè)紅框標(biāo)注的部分:
看到這里,再根據(jù)上面的解釋,就應(yīng)該知道這部分代碼的問題在哪里了吧。
是的,對于這里推送的注冊代碼邏輯沒錯(cuò),只是代碼出現(xiàn)了冗余,就是紅框標(biāo)注的部分其實(shí)是沒必要的;一般情況下,這樣的代碼邏輯適用于我們接入的三方SDK
,我們有時(shí)看到在接入的三方SDK
里會用到這樣的宏,這樣做的目的主要是來兼容高低 Xcode
版本,保證其最新的SDK
不會在低版本的Xcode
上出現(xiàn)編譯的BUG錯(cuò)誤,所以對于自己的工程這樣的宏其實(shí)是沒必要的。
下面(判斷系統(tǒng)是否是iOS7)簡單說下在開發(fā)中對于這樣的場景怎么來兼容
- 我們常見的就是下面這個(gè):
static inline BOOL XXX_IS_HIGHT_ThAN_IOS7 (){
return ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7.0) ? YES: NO;
}
static inline BOOL XXX_IS_LOW_THAN_IOS7 (){
return ([[[UIDevice currentDevice] systemVersion] doubleValue] < 7.0) ? YES: NO;
}
- 比較字符串,相對來說精確率較上面第一種會更好,效率也會很快
static inline BOOL XXX_IS_HIGHT_ThAN_IOS7 (){
return ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] == NSOrderedSame || [[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] == NSOrderedDescending) ? YES : NO;
}
static inline BOOL XXX_IS_LOW_THAN_IOS7 () {
return [[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] == NSOrderedAscending ? YES : NO;
}
- 利用系統(tǒng)庫
Foundation
框架或者CoreFoundation
框架,它不需要調(diào)用任何的其它方法,所以效率是最高的
"Foundation"框架:
static inline BOOL XXX_IS_HIGHT_ThAN_IOS7 (){
return NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0 ? YES : NO;
}
或者
static inline BOOL XXX_IS_HIGHT_ThAN_IOS7 (){
return NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1 ? YES : NO;
}
static inline BOOL XXX_IS_LOW_THAN_IOS7 () {
return NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_7_0 ? YES : NO;
}
"CoreFoundation"框架:
static inline BOOL XXX_IS_HIGHT_ThAN_IOS7 (){
return kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0 ? YES : NO;
}
或者
static inline BOOL XXX_IS_HIGHT_ThAN_IOS7 (){
return kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iOS_6_1 ? YES : NO;
}
static inline BOOL XXX_IS_LOW_THAN_IOS7 () {
return kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0 ? YES : NO;
}
其對應(yīng)框架的API如圖示:
結(jié)論
寫了這么多,以后在開發(fā)中建議還是用第三種,它是采用了API底層來實(shí)現(xiàn),效率是最高的,好久沒來簡書了,希望以后還是可以堅(jiān)持下去,零點(diǎn)已過,晚安咯。