2009-08-14 3 views
2

현재 앱 스토어에는 버전 2.2.1로 빌드 된 앱이 있습니다. 즉, Base SDK와 배포 타겟이 모두 2.2.1로 설정된 앱이 있습니다. 그 응용 프로그램이 잘 실행됩니다. 그 이후로 XCode 버전을 3.1.3으로 업그레이드했으며 Base SDK를 3.0으로 설정하고 배포 대상을 2.2.1로 설정하여 앱을 업데이트하려고합니다. 이것은 OS 3.0을 실행하는 테스트 아이폰 장치에서 정상적으로 작동합니다. 문제는 2.2.1에서 테스트 할 장치가 없어서 시뮬레이터를 사용하고 특정 UI 요소가 현재 빌드에서 (주로 이미지로) 표시되지 않는다는 것입니다. 이상한 부분은 시뮬레이터에서 현재 버전의 XCode가있는 앱 스토어에있는 이전 버전의 앱을 테스트 할 때 동일한 UI 문제가 사라진다는 것입니다. 같은 빌드가 어떻게 다른 결과를 낼 수 있습니까? Xcode에서 어떤 변화가 있었습니까? 무슨 일 이니?iPhone OS 2.2.1과의 하위 호환성 유지

감사합니다.

+0

저는 이것이 Apple 측에서 일종의 버그 일 수 있다고 생각하기 시작했습니다. Apple에 제출 한 빌드 (2.2.1에 빌드 됨)를 작성하고 3.0 디바이스에서 실행하는 코드를 가져 가면 작동하지 않습니다 (UI 오류가 발생 함). 하지만 앱 스토어에서 다운로드 한 것과 동일한 빌드가 정상적으로 작동합니다. 여기에 뭔가가 있습니다. –

답변

2

일부 메서드는 몇 가지 UI 메서드 (UITableViewCell의 initWithStyle:이 다소 쉽게 마음에 들었음)를 포함하여 2.2.1-> 3.0 변경에서 더 이상 사용되지 않습니다. UI 객체에 대한 모든 호출이 3.0 호환이되는지, 특히 사라지는 객체를 구성하거나 표시하는 영역에서 호출되는지 확인합니다.

+0

예, 사용되지 않는 메소드 및 속성 (예 : UITableViewCell의 'image'속성)을 사용하고 있으며 이러한 요소는 표시되지 않습니다. 하지만 해결 방법은 무엇입니까? 새 메서드 및 속성은 OS 3.0에서만 지원됩니다. 왜 더 이상 사용되지 않는 메소드가 이전 버전의 OS에서 작동하지 않고 더 새로운 버전에서도 계속 작동합니까? –

+0

몇 가지 시도해 볼 수 있습니다. 먼저 Base SDK를 다시 2.2.1로 변경하십시오. 이전 OS 용으로 프로그램을 빌드하는 경우 3.0에서 deprecated 메소드가 계속 작동해야합니다. 그래도 작동하지 않는다면 소스 파일에서'# ifdef'를 실험 해보고 OS별로 적절한 코드를 실행할 수 있습니다. 프리 프로세서 심볼'__IPHONE_3_0'은 3.0+ 시스템에 정의되어 있으며 <2.2.1에 있지 않습니다. – Tim

+0

이전 버전의 Base SDK는 이미 2.2.1로 설정되어 있으며 작동하지 않는 버전입니다. 나는 시뮬레이터가 2.2.1에서 돌아가고 있는지 확인했다.내가 사용하고있는 빌드는 Subversion에서 태그를 지정하고 Apple에 전송하여 문제가 없어야합니다. –

3

2.2.1 iPhone 시뮬레이터에서 작동하지 않는 앱 : 앱이 실행 중일 때 '하드웨어'> '버전'메뉴에서 시뮬레이터의 하드웨어 버전을 확인하십시오. 정확하게 똑같은 문제는 아니지만 올바른 시뮬레이터 버전을 자동으로 선택하는 데 문제가 있습니다. See question#388298a related article (see Open Questions). 2.2.1로 설정되어 있지 않으면 수동으로 디버거를 설정하고 디버거없이 앱을 실행할 수 있습니다.

일반적으로 이전 버전과의 호환성을 유지하기 위해 : Here을 쓰는 것이 좋습니다. 런타임에에서 버전을 확인해야하며 컴파일 시간이 인 이 아니라 이진 파일에서 이전 버전과의 호환 코드를 제거하기 때문에 버전을 확인해야합니다. 또한 약한 링크 MapKit 및 GameKit과 같은 3.0 전용 프레임 워크를 잊지 마세요. The article above에서는이를 수행하는 방법을 보여줍니다.

참고 : 사용되지 않는 속성은 respondsToSelector:으로 확인할 수 있습니다. 그것은 조금 복잡하지만 점점 속성을 설정하면 그래서, 단지 구문 설탕입니다입니다 : 또한

cell.image; 
cell.image = anImage; 
// corresponds to 
if ([cell respondsToSelector:@selector(image)]) { 
    [cell image]; 
    [cell setImage:anImage]; 
} 

, 당신이 그들 사이를 쉽게 전환 할 수 있도록 각각의 다른 버전에 대해 서로 다른 목표를 유지하는 것이 도움이 될 수 있습니다.

+0

링크를 가져 주셔서 감사합니다,하지만 난 여전히 같은 문제가 있습니다. 이전 버전의 앱을 실행했을 때 Simulator에서 버전 2.2.1이 실행 중이며 아이콘이 여전히 표시되지 않음을 확인했습니다. 나는 3.0 라이브러리 (Foundation, UIKit, CoreGraphics, sqlite)를 사용하지 않고있다. 3.0 버전이 작동하지 않는다면 놀라지 않을 것입니다. 그러나 2.2.1 버전에서 갑자기 App Store에있는 동일한 코드가 더 이상 작동하지 않는 이유를 짐작할 수 없습니다. –