2014-09-02 100 views
1

我們正在製作一個應用程序以與iOS 8兼容,但同時,我們的一些開發人員還沒有Xcode 6,所以他們正在獲取試圖調用'CLLocationManager'沒有可見的@interface聲明選擇器'requestAlwaysAuthorization'

[self.locationManager requestAlwaysAuthorization]; 

即使是內部的,如果

if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) { 
    [self.locationManager requestAlwaysAuthorization]; 
} 

怎樣才能解決這個編譯在Xcode中5時,這個錯誤?

+1

如果你只是想讓它變得可編譯,你可以使用performSelector: - > [self.locationManager performSelector:@selector(requestAlwaysAuthorization)]。爲了安全起見,你也可以做if(... && self.locationManagerrespondsToSelector:@selector(requestAlwaysAuthorization)) – mitrenegade 2014-09-02 15:31:45

回答

7

以下是處理此問題的正確方法。這假設您的應用程序具有iOS 7.x或更低版本的「部署目標」,並且您需要爲「基礎SDK」(例如Xcode 6下的iOS 8和Xcode 5下的iOS 7)編譯具有不同值的項目:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 
    // Being compiled with a Base SDK of iOS 8 or later 
    // Now do a runtime check to be sure the method is supported 
    if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
     [self.locationManager requestAlwaysAuthorization]; 
    } else { 
     // No such method on this device - do something else as needed 
    } 
#else 
    // Being compiled with a Base SDK of iOS 7.x or earlier 
    // No such method - do something else as needed 
#endif 
+1

請注意,你需要一個醜陋的硬編碼常量80000,並且不能在頭文件中使用#defined常量,因爲使用較低的SDK進行編譯時,該常量不會存在。 – gnasher729 2014-09-02 15:45:48

2

接受的答案對我的特殊情況無效。由於構建環境的限制(Phonegap/Cordova),我只能針對iOS7 SDK進行編譯。

我實現了以下內容(如評論建議):

if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
    // Use performSelector: so compiler won't blow up on this 
    [self.locationManager performSelector:@selector(requestAlwaysAuthorization)]; 
}  

這可能表明編譯器警告,但ATLEAST它在特定的情況下工作。

相關問題