2009-05-04 7 views
36

저는 최신 iPhone SDK (3.0)에서만 실행하고 싶은 코드가 있지만, 3.0을 대상으로하고 2.2.1 등을 무시하는 방법을 찾을 수없는 것 같습니다. ifdef 문이 있습니다. 하지만 그것은 단지 전체 아이폰을 커버하는 것 같습니다 :특정 iPhone 버전을 타겟팅하는 방법은 무엇입니까?

#if TARGET_OS_IPHONE 

어떤 도움을 주시면 감사하겠습니다.

답변

89

...

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2 
// iPhone 3.0 code here 
#endif 

그리고 3.0과 위의 코드를 실행하는 런타임에서이 작업을 수행 :

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
if (version >= 3.0) 
    { 
    // iPhone 3.0 code here 
    } 
+0

나는 몰랐다. 감사! – Kriem

+0

좋아요, 고맙습니다! – Oliver

+10

한 가지주의해야 할 점은 시뮬레이터와 장치를 컴파일하는 것이 이러한 매크로에서 놀라운 변경을 초래할 수 있다는 것입니다. 시뮬레이터 SDK 2.2.1 용으로 컴파일 할 때 __IPHONE_OS_VERSION_MIN_REQUIRED = 20000이됩니다. 그러나 장치 용으로 컴파일 할 때 위에 정의한 조건을 위반하는 __IPHONE_OS_VERSION_MIN_REQUIRED = 20201이 나타납니다. 현재 3.0 이상에서만 작동하는 코드를 분리하기 위해 일반 "#ifdef __IPHONE_3_0"을 사용하고 있습니다. 이 매크로는 3.0 SDK까지 정의되지 않았기 때문에 작동합니다. – n8gray

0

Xcode의 빌드 옵션에 있습니다. 왼쪽 상단 모서리에 "myapp - 3.0 | Debug"와 같은 드롭 다운이 나타납니다. 원하는 빌드를 선택하고 완료하십시오.

+0

그 방법의 문제점은 3.0.1에서 실행되는이 한 줄의 코드만으로 2.2.1에서도 내 앱을 작동하게하려는 것입니다. 당신의 방법은 2.2x에 대한 지원을 중단해야한다는 것을 의미합니다. – Oliver

+0

지금 무슨 뜻인지 알지 못하지만 까다로운 점이 있지만 그때 정확한 위치를 확인할 수 있습니다. 헤더의 정의를 확인하십시오. –

0

this answer에서 OTHER_CFLAGS = "-g3 -save-temps -dD"를 추가하는 트릭을 사용하여 2.2.1을 대상으로하는 프로젝트에서 __IPHONE_OS_VERSION_MIN_REQUIRED 20000을 정의하는 것으로 나타났습니다. 아마도 그렇게 할 수 있을까요?

0

나는 OP에 대한 의견을 요약 한 것이 확실합니다. 당신은 할 수 없습니다. 컴파일 시간 지시문은 런타임 결정을 내릴 수 없기 때문에. Xcode에서 3.0을 타겟팅하면 2.2.1 전화에서 실행되지 않습니다. 2.2.1을 대상으로하면 3.0 특정 코드가 있으므로 컴파일되지 않습니다.

유일한 진정한 해결책은 앱 버전 두 가지입니다. 그 중 하나는 3.0 용으로 컴파일되고 다른 하나는 2.2.1 용입니다.

당신은 각각의 SDK에 대한 구축 무엇을 변경하려면이 #DEFINE을 사용할 수 있습니다
+0

첫 번째 : OP는 실제로 컴파일 타임 검사를 제외하지 않습니다. 2 : 주어진 규칙에 예외가 있습니다. 예를 들어, MPMoviePlayerController는 3.0 및 3.2에 있지만 3.2 (및 4.0)에서 다르게 작동합니다. 두 플랫폼에서 올바르게 지원하기 위해 런타임 버전을 사용하는 것이 편리합니다. 필자의 특별한 경우,이 체크를 생략하면 두 플랫폼 모두에서 적절한 빌드로 이어지지 만 3.2 이하에서는 충돌이 발생합니다. – Till

-2

글쎄, 내 두 센트 :

최신 버전의 앱을 빌드하는 방법은 어떨까요? 새로운 & 멋진 API를 모두 활용하고 배포 대상을 가장 적게 지정하는 방법은 어떨까요? 당신이 지원하고자하는 버전이있어, 사람들이 기기를 업그레이드하기 위해 시간을 할애하지 않았기 때문에 앱을 실행할 수 있습니다. 이 경우 위와 같이 SDK의 최신 버전을 확인하고 응용 프로그램 역방향 호환을 위해 대체 기능을 제공해야합니다.

감사합니다, Hardik

+0

이 기능은 iOS 3 이상에서만 코드 덩어리를 어떻게 실행합니까? –

4

당신은 또한 할 수있는 확신 :

#ifdef __IPHONE_3_0 
// 3.0 code here 
#endif 
+0

거기에가는 코드는 3.0 이상이 아니라 3.0 이상입니다. –

6

UPDATE를 아이폰에서 실행 &을 구축 할 때 (4.3.1) 엑스 코드 4를 사용하여,이 더 이상 작동하는 것 같다 나를. 또한 __IPHONE_OS_VERSION_MIN_REQUIRED = 30200이 나옵니다. 나를 위해 작동하는 것 같다,

#ifdef _USE_OS_4_OR_LATER 
    // code to compile for 4.0 or later 
#else 
    // code to compile for pre-4.0 
#endif 

을 그리고 :

The iPhone Developer's Cookbook 당신은 또한 할 수 있다고 말한다. :)

+0

재단에서 정의 된 부분을 찾을 수 없습니다. 어디 있니? –

19

내가하는 FloatValue 반환 결과에주의 것 :

[[[UIDevice currentDevice] systemVersion] floatValue] 

어떤 수레와 마찬가지로, 그것은 정확하게 당신이 무엇을 기대하지 않을 수 있습니다.

3.20000005 

여기에 대신 솔루션을 추천 : How to check iOS version?

발췌 :

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch]; 
if (order == NSOrderedSame || order == NSOrderedDescending) { 
    // OS version >= 3.1.3 
} else { 
    // OS version < 3.1.3 
} 
내 시스템에서 위의 실행 때, 나는 값이 반환 된 발견, 내 조건문이 실행되지 않은 이유를 혼동
+0

'3.2.00..005'는 여전히'doubleValue'에 문제가 있습니까? –

+0

@ BenC.R.Leggiero해야합니다. 얼마나 많은 정밀도를 사용하든, 바이너리로 정확히 3.2를 표현하는 것은 불가능합니다. –

+0

@ BrennanVincent 나는 IEEE float을 사용한다고 생각합니다. 왜냐하면 NSDecimalNumber를 사용하여 표현하는 것이 간단하기 때문입니다. –

관련 문제