2011-10-11 2 views
8

iOS5 및 iOS4.3 버전의 라이브러리를 사용하려고합니다. 나는 올바른 버전을 받고 데 문제 즉, 조건부 포함 : iOS5를위한iOS 버전에 따라 조건부로 헤더 포함

:

#include ios5stuff.h 
@implementation 
    // do stuff 
@end 

#include ios4stuff.h 
@implementation 
    // do stuff 
@end 

iOS4

를 들어 내가 조건부 클래스의 내 물건을 포함하는 방법을 볼 수 있습니다 구현 블록에 있지만이 외부는 아닙니다. 누구든지이 일을하는 가장 좋은 방법을 제안 할 수 있습니까? 이 재단의 헤더를 보면

+0

가능한 복제본 : http://stackoverflow.com/questions/1864114/how-to-detect-iphone-os-version-using-macros – IronMensan

답변

17

에 대한 정의는이 작업을 수행 할 수 있어야합니다도있다 있습니다 (안된) :

#import <Availability.h> 

#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0 
#import "my_header_for_io5_and_above.h" 
#elif defined(__IPHONE_4_3) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_3 
#import "my_header_for_ios4.3.h" 
#else 
#error Your SDK is too old ! Need at least 4.3. 
#endif 
+0

감사합니다 - 아름답게 작동하는 것 같습니다! – TimD

+0

정의 된 (__ IPHONE_5_0) 또는 __IPHONE_OS_VERSION_MAX_ALLOWED을 (를) 사용할 정보는 어디에서 찾을 수 있습니까? –

1

(있는 NSString,을 NSData ...)

#if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED 
/* ... */ 
#endif 

많이 있습니다

__IPHONE_OS_VERSION_MIN_REQUIRED 
+2

다음은 컴파일 타임 지침입니다. 따라서 iOS 5 SDK로 컴파일하는 경우 포함되어 있습니다. – rckoenes

0

당신은 this 방법 또는 DarkDust가 말하는 하나를 사용하여 IOS SDK의 버전을 확인할 수 있습니다 컴파일 할 때 사용자가 장치를 업데이트 한 다음 마술처럼 새로운 기능을 채택하거나 더 나은 OS 통합을 얻을 수 있기 때문에 런타임에이 내용 중 일부를 처리하는 것이 일반적으로 더 좋습니다.

이렇게하는 데는 몇 가지 방법이 있습니다. 최신 SDKS에는 NS_CLASS_AVAILABLE이 있어야합니다. 그러나 이전 SDK를 계속 지원하는 경우에는 사용하지 못할 수도 있습니다. 하지만이 목표 - C, 그래서 행운은 우리 편이다 : 클래스가없는 경우는 null를 돌려, 사용할 수있는 경우 이것이 작동

Class cls = NSClassFromString (@"NSRegularExpression"); 
if (cls) { 
    // Create an instance of the class and use it. 
} else { 
    // Alternate code path to follow when the 
    // class is not available. 
} 

기본적으로 방법은 형식 시스템을 요구한다. 이것은 문자열이고 컴파일되기 때문에 테스트되지 않은 채로 남겨두면 다소 위험합니다.하지만 처리 할 수 ​​있어야합니다.

는 두 곳 모두에 존재하는 클래스가 있다면, 당신은 다음과 같이 런타임에 선택 가능 여부를 테스트 할 수 있습니다

if([TheAppleClass instancesRespondToSelector:@selector(aMethod:)]) { 
    // invoke the inherited method 
    [myInstance aMethod:parameter]; 
} 

reference1reference2

를이 여전히 OS4를 지원하는 빌드를 제공 할 수함으로써. 2 명의 사용자가 트윗 시트를 만들었지 만 업그레이 드를하면 자동으로 OS 트위터가 통합됩니다. 그러나 이전 OS 사용자와의 소통을 시작하기 전에 시장의 90 %가 업데이트 될 때까지 기다리지 않고도 필요할 때 언제든지 배포 할 수있는 단일 빌드로 모든 것을 계속 사용할 수 있습니다.

+1

Poster는 링크 된 SDK에 따라 다른 헤더를 가져와야한다고 말했습니다. 그래서 런타임 솔루션은 분명히 너무 늦었습니다 .-) – DarkDust

+0

그래, 나는 그가 무엇을 요구했는지 안다. 그리고 네가 그 질문에 대한 진정한 대답이다. 나는 그 필요에 도전하고있다. – slf

+0

불행하게도 나는 다른 헤더를 가져올 필요가있다.하지만 이는 런타임시 사물의 상태를 확인하는 데 매우 유용한 요약이다. – TimD

관련 문제