2014-09-02 77 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它在特定的情况下工作。

相关问题