'CLLocationManager'没有可见的@interface声明选择器'requestAlwaysAuthorization'
问题描述:
我们正在制作一个应用程序以与iOS 8兼容,但同时,我们的一些开发人员还没有Xcode 6,所以他们正在获取试图调用'CLLocationManager'没有可见的@interface声明选择器'requestAlwaysAuthorization'
[self.locationManager requestAlwaysAuthorization];
即使是内部的,如果
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
[self.locationManager requestAlwaysAuthorization];
}
怎样才能解决这个编译在Xcode中5时,这个错误?
答
以下是处理此问题的正确方法。这假设您的应用程序具有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
答
接受的答案对我的特殊情况无效。由于构建环境的限制(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它在特定的情况下工作。
如果你只是想让它变得可编译,你可以使用performSelector: - > [self.locationManager performSelector:@selector(requestAlwaysAuthorization)]。为了安全起见,你也可以做if(... && self.locationManagerrespondsToSelector:@selector(requestAlwaysAuthorization)) – mitrenegade 2014-09-02 15:31:45