저는 최신 iPhone SDK (3.0)에서만 실행하고 싶은 코드가 있지만, 3.0을 대상으로하고 2.2.1 등을 무시하는 방법을 찾을 수없는 것 같습니다. ifdef 문이 있습니다. 하지만 그것은 단지 전체 아이폰을 커버하는 것 같습니다 :특정 iPhone 버전을 타겟팅하는 방법은 무엇입니까?
#if TARGET_OS_IPHONE
어떤 도움을 주시면 감사하겠습니다.
저는 최신 iPhone SDK (3.0)에서만 실행하고 싶은 코드가 있지만, 3.0을 대상으로하고 2.2.1 등을 무시하는 방법을 찾을 수없는 것 같습니다. ifdef 문이 있습니다. 하지만 그것은 단지 전체 아이폰을 커버하는 것 같습니다 :특정 iPhone 버전을 타겟팅하는 방법은 무엇입니까?
#if TARGET_OS_IPHONE
어떤 도움을 주시면 감사하겠습니다.
...
#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
}
Xcode의 빌드 옵션에 있습니다. 왼쪽 상단 모서리에 "myapp - 3.0 | Debug"와 같은 드롭 다운이 나타납니다. 원하는 빌드를 선택하고 완료하십시오.
그 방법의 문제점은 3.0.1에서 실행되는이 한 줄의 코드만으로 2.2.1에서도 내 앱을 작동하게하려는 것입니다. 당신의 방법은 2.2x에 대한 지원을 중단해야한다는 것을 의미합니다. – Oliver
지금 무슨 뜻인지 알지 못하지만 까다로운 점이 있지만 그때 정확한 위치를 확인할 수 있습니다. 헤더의 정의를 확인하십시오. –
this answer에서 OTHER_CFLAGS = "-g3 -save-temps -dD"를 추가하는 트릭을 사용하여 2.2.1을 대상으로하는 프로젝트에서 __IPHONE_OS_VERSION_MIN_REQUIRED 20000을 정의하는 것으로 나타났습니다. 아마도 그렇게 할 수 있을까요?
나는 OP에 대한 의견을 요약 한 것이 확실합니다. 당신은 할 수 없습니다. 컴파일 시간 지시문은 런타임 결정을 내릴 수 없기 때문에. Xcode에서 3.0을 타겟팅하면 2.2.1 전화에서 실행되지 않습니다. 2.2.1을 대상으로하면 3.0 특정 코드가 있으므로 컴파일되지 않습니다.
유일한 진정한 해결책은 앱 버전 두 가지입니다. 그 중 하나는 3.0 용으로 컴파일되고 다른 하나는 2.2.1 용입니다.
당신은 각각의 SDK에 대한 구축 무엇을 변경하려면이 #DEFINE을 사용할 수 있습니다첫 번째 : OP는 실제로 컴파일 타임 검사를 제외하지 않습니다. 2 : 주어진 규칙에 예외가 있습니다. 예를 들어, MPMoviePlayerController는 3.0 및 3.2에 있지만 3.2 (및 4.0)에서 다르게 작동합니다. 두 플랫폼에서 올바르게 지원하기 위해 런타임 버전을 사용하는 것이 편리합니다. 필자의 특별한 경우,이 체크를 생략하면 두 플랫폼 모두에서 적절한 빌드로 이어지지 만 3.2 이하에서는 충돌이 발생합니다. – Till
글쎄, 내 두 센트 :
최신 버전의 앱을 빌드하는 방법은 어떨까요? 새로운 & 멋진 API를 모두 활용하고 배포 대상을 가장 적게 지정하는 방법은 어떨까요? 당신이 지원하고자하는 버전이있어, 사람들이 기기를 업그레이드하기 위해 시간을 할애하지 않았기 때문에 앱을 실행할 수 있습니다. 이 경우 위와 같이 SDK의 최신 버전을 확인하고 응용 프로그램 역방향 호환을 위해 대체 기능을 제공해야합니다.
감사합니다, Hardik
이 기능은 iOS 3 이상에서만 코드 덩어리를 어떻게 실행합니까? –
당신은 또한 할 수있는 확신 :
#ifdef __IPHONE_3_0
// 3.0 code here
#endif
거기에가는 코드는 3.0 이상이 아니라 3.0 이상입니다. –
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 당신은 또한 할 수 있다고 말한다. :)
재단에서 정의 된 부분을 찾을 수 없습니다. 어디 있니? –
내가하는 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
}
내 시스템에서 위의 실행 때, 나는 값이 반환 된 발견, 내 조건문이 실행되지 않은 이유를 혼동
'3.2.00..005'는 여전히'doubleValue'에 문제가 있습니까? –
@ BenC.R.Leggiero해야합니다. 얼마나 많은 정밀도를 사용하든, 바이너리로 정확히 3.2를 표현하는 것은 불가능합니다. –
@ BrennanVincent 나는 IEEE float을 사용한다고 생각합니다. 왜냐하면 NSDecimalNumber를 사용하여 표현하는 것이 간단하기 때문입니다. –
나는 몰랐다. 감사! – Kriem
좋아요, 고맙습니다! – Oliver
한 가지주의해야 할 점은 시뮬레이터와 장치를 컴파일하는 것이 이러한 매크로에서 놀라운 변경을 초래할 수 있다는 것입니다. 시뮬레이터 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