2012-09-27 28 views
0

我想讓我們的應用與iOS6的MKDirectionsRequest(Transit Directions方法)兼容。蘋果指出要做到這一點的最好辦法是:即使您的應用與iOS5兼容,也可以使用iOS6處理MKDirectionsRequest

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    if ([MKDirectionsRequest isDirectionsRequestURL:url]){ 
     } 
} 

但是,什麼是保證這個代碼時,應用程序在運行iOS6的,而不是iOS5的只是運行的最好方法?該應用程序必須與iOS5兼容,但我的MKDirectionsRequest是iOS6。

我不能使用編譯器指令,如:

#ifdefine iOS5 

或任何東西。

這是最好的方法嗎?

BOOL atLeastIOS6 = [[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0; 

然後:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
    { 

     if (atLeastIOS6) 
     { 
      if ([MKDirectionsRequest isDirectionsRequestURL:url]){ 
      } 
     } 
    } 

我只是想確保用於openURLs

回答

1

我已經看到了使用該系統版本字符串氣餒無數的帖子檢查時,我不上iOS5的崩潰。它可能需要將6.0.1轉換爲浮點數,但不確定。

首選的方法似乎是測試出現在特定版本中的選擇器。因此,我使用這兩種方法分別測試iOS 5或6。

+ (BOOL)isOS5Capable { 

    return ([UINavigationBar respondsToSelector:@selector(appearance)]); 

} 

+ (BOOL)isOS6Capable { 

    return ([UIView respondsToSelector:@selector(requiresConstraintBasedLayout)]); 

} 

如果你通過在Apple框架的頭,你會看到,有相當指定的選擇出現了什麼版本的一些NS_AVAILABLE宏。爲了在iOS 6中創建這個功能,我花了幾分鐘尋找一個靜態方法來簡化檢查(所以我不必分配一個類)。按照這種做法,您應該能夠確保您的應用程序在未來的更新中是版本安全的。

2

您可以測試類MKDirectionsRequest可用:

if ([MKDirectionsRequest class]) { 
... 
} 
+0

這將始終返回true,或編譯錯誤,因爲MKDirectionsRequest類不存在,所以你不能把它的消息。 –

+2

@Scott不對。 NSClassFromString僅在使用較舊的SDK時才需要。我的代碼將使用iOS6 SDK進行編譯,並且在iOS5上運行時它的計算結果將爲false。 – Felix

+0

啊,很高興知道! NSClassFromString仍然是首選的解決方案,以確保與舊SDK的兼容性? –

4

不要依賴IOS版本。檢查是否使用NSClassFromString存在類:

Class directionsRequestClass = NSClassFromString(@"MKDirectionsRequest"); 

if (directionsRequestClass) 
    // it exists, so you can use it 
else 
    // doesn't exist, do something else 
+1

使用'NSClassFromString()'和等價的方法是正確的。 –

相關問題