2014-09-02 1 views
1

우리는 iOS 8과 호환되도록 앱을 만들고 있지만 동시에 일부 개발자는 아직 Xcode 6을 가지고 있지 않으므로 이'CLLocationManager'에 대한 @interface가 선택어 'requestAlwaysAuthorization'을 선언합니다

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

우리가 어떻게 엑스 코드 5에 컴파일이 해결할 수있는 경우 내부하더라도

[self.locationManager requestAlwaysAuthorization]; 

를 호출하려고이 오류?

+1

컴파일 할 수있게하려는 경우 performSelector : -> [self.locationManager performSelector : @selector (requestAlwaysAuthorization)]를 사용할 수 있습니다. (... && self.locationManager respondsToSelector : @selector (requestAlwaysAuthorization)) – mitrenegade

답변

7

다음은이 문제를 해결하는 적절한 방법입니다. 이 경우 앱에 iOS 7.x 이하의 "배포 타겟"이 있고 "Base SDK"(Xcode 6 및 iOS 7의 iOS 8, 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

추한 하드 코드 된 상수 80000이 필요하며 헤더 파일에서 #define 상수를 사용할 수 없다는 점에 유의하십시오. 그 이유는 더 낮은 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)]; 
}  

그것은 컴파일러 경고를 표시 할 수 있습니다,하지만이어야 그것은 특정 경우에 작동합니다.

관련 문제