'CLLocationManager'没有可见的@interface声明select器'requestAlwaysAuthorization'

我们正在制作一个应用程序来兼容iOS 8,但同时,我们的一些开发人员还没有Xcode 6,所以他们在尝试调用时出现这个错误

[self.locationManager requestAlwaysAuthorization]; 

即使是在一个if里面

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

我们如何解决这个在Xcode 5上编译?

以下是处理这个问题的正确方法。 这假设你的应用程序有一个iOS 7.x或更低版本的“部署目标”,你需要为“Base 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 

接受的答案不适合我的特殊情况。 由于构build环境的限制(Phonegap / Cordova),我只能在iOS7 SDK上进行编译。

我实施了以下(如评论中所build议的):

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

它可能会显示编译器警告,但至less在这个特定的情况下工作。