2014-09-02 4 views
1

Мы создаем приложение для совместимости с iOS 8, но в то же время некоторые из наших разработчиков еще не имеют Xcode 6, поэтому они получают эта ошибка при попытке вызоваНет видимого @interface для «CLLocationManager» объявляет селектор «requestAlwaysAuthorization»

[self.locationManager requestAlwaysAuthorization]; 

Даже если внутри если

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

Как мы можем решить эту проблему, чтобы собрать на Xcode 5?

+1

Если вы пытаетесь сделать его компилируемым, вы можете использовать performSelector: -> [self.locationManager выполнитьSelector: @selector (requestAlwaysAuthorization)]. Чтобы сделать это безопасным, вы также можете сделать, если (... && self.locationManager отвечаетSoSelector: @selector (requestAlwaysAuthorization)) – mitrenegade

ответ

7

Ниже приведен правильный способ справиться с этим. Это предполагает, что ваше приложение имеет «цель развертывания» iOS 7.x или более ранней версии, и вам нужно скомпилировать проект с разными значениями для «базового SDK» (например, iOS 8 под Xcode 6 и iOS 7 в Xcode 5):

#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

Обратите внимание, что вы _need_ уродливая жестко закодированная константа 80000 и не может использовать #defined константу из файла заголовка, потому что эта константа не будет присутствовать при компиляции с более низким SDK. – gnasher729

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)]; 
}  

Это может показать предупреждения компилятора, но по крайней мере он работает в этом конкретном случае.

Смежные вопросы