iOS, Mac 앱 개발시 하위 호환성 유지

맥OS에서 개발할때, 최신 버전의 SDK를 사용하면 최신 기능들을 이용해서 더 멋진 어플리케이션을 손쉽게 개발 할 수 있다. 하지만 결국 하위 호환성(backward compatibility)을 고려하지 않으면 이전 버전의 OS에서 제대로 작동하지 않는 사태가 종종 발생한다. 이러한 상황은 MacOS 뿐 아니라 iOS에서도 동일하게 적용된다.

현재 필자의 개발환경은 다음과 같다.

  • MacOS 10.7 (Lion)
  • XCode 4.6.2 with MacOS SDK 10.8 (Mountain Lion)

하지만 다음 링크에서 볼 수 있듯이 http://chitika.com/os-x-version-distribution 아직도 10.6(Snow leopard)가 점유율이 가장 높아서, 현재 개발중인 어플리케이션은 최소 스노우 레오파드를 타겟으로 개발을 하기로 마음을 먹었다. 이런 상황에서 호환성을 유지하려면 어떤 점들이 고려되어야 하는지 살펴보도록 하자.

배포 타겟과 실제 정상 작동 여부의 관계

하위 호환성을 고려하기 위해 프로젝트 환경 설정에서 배포 타겟(Deployment target)을 10.6으로 셋팅하는 것만 으로는 충분하지 않다. 배포 타겟을 10.6으로 설정했음에도 불구하고, Xcode에 연동되어있는 Base SDK는 10.8이다보니 최신SDK에 기반한 새로운 라이브러리들을 사용하더라도 전혀 에러없이 컴파일이 되어버린다.

예를들어 10.7버전 부터 지원하기 시작한 View-based NSTableView를 적용하여 컴파일해도 아무런 에러메시지도 출력하지 않는다. 하지만 이 어플리케이션을 10.6에서 실행해보면 정상적인 동작이 되지 않는다. Objective-C의 언어 특성상, unrecognized selector에 대해 exception정도만 발생하지 완전히 크래쉬나지 않는 경을수도 있기 때문에 더 버그를 찾기 힘들 수도 있다.

결국 배포 타겟은 해당 어플리케이션이 패키징될 때 최소 지원사항을 표기하기 위한 단순 ‘확인’용 정보일 뿐이며 실제 앱의 정상 작동 여부와는 아무 관계도 없다는 이야기다. 따라서 항상 특정 프레임워크/라이브러리의 기능을 사용할 때 그 기능이 새로운 추가된 것일 경우 이전 버전의 OS에서 동작하는지 여부를 항상 체크하는 습관을 들일 필요가 있다.

애플에서 제공하는 레퍼런스 문서에서 Availability 항목을 통해서 이를 체크 할 수 있다.

Availability
Available in Mac OS X v10.6 and later.

Weak linking1

weak linking 이란 사용하려는 클래스 또는 함수의 존재 여부를 런타임에서 확인하여 그에 따라 다른 코드를 실행 할 수 있게 해주는 방법을 말한다. 이를 통해 새로운 기능은 새로운 기능대로 지원하면서도 구버전에서도 잘 동작하는 어플리케이션 개발이 가능해진다.

다음과 같은 방법을 통해 클래스의 사용가능 여부를 확인 후 원하는 대로 대처가능하다.

if ([UIPrintInteractionController class]) {
    // Create an instance of the class and use it.
} else {
    // Alternate code path to follow when the
    // class is not available.
}

다음은 메서드가 있는지 여부를 확인하는 예제이다.

if ([UIImagePickerController instancesRespondToSelector:
              @selector (availableCaptureModesForCameraDevice:)]) {
    // Method is available for use.
    // Your code can check if video capture is available and,
    // if it is, offer that option.
} else {
    // Method is not available.
    // Alternate code to use only still image capture.
}

이 외에도 프레임워크 자체를 weak link 할 수있는 방법 또한 존재하는데 자세한 내용은 레퍼런스 문서를 참조하도록 하자.

구버전 SDK를 이용한 테스트

하위호환성을 테스트하기 가장 좋은 방법은 구버전 SDK를 구해서 이를 이용해 어플리케이션을 컴파일 하는 것이다. 이 방법을 사용하면, 구버전SDK에 없는 기능 사용시 바로 컴파일 에러가 발생하기때문에 오류를 발견하기가 쉽다.
애플 개발자 계정이 있다면 예전 버전의 XCode를 다운로드 받을 수 있다. 하지만 애플에서 오래된 버전들은 다운로드가 불가능하게 링크를 계속 없애는 추세라 원하는 버전을 구하는 것이 쉽지는 않다. 만약 구버전 SDK들을 구했다면, 다음 스크립트를 이용하여 여러 버전의 SDK를 스위칭 하는것이 가능하다. https://gist.github.com/rnapier/3370649

이를 위해 다음부터는 Xcode를 업그레이드하기 전에 항상 기존 버전들을 보관해 둘 필요도 있을 것 같다.

가상 머신을 이용한 테스트

10.6 서버 버전, 10.7이상의 경우는 일반 버전에 대해서 가상 머신(Virtual machine)을 통해 OS구동을 하는것이 가능하다. 이것에 대해서는 구글링 해보면 더 많은 정보들이 나온다.

Updated: 2013-10-18, 패럴럴스에 스노우레오파드 설치하는 방법을 새로 포스팅했으니 참조바란다.
패럴럴스에 스노우 레오파드 설치하기


  1. https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW6