iPad 애플리케이션을 개발하는 방법에는 크게 두 가지로 나눌 수 있습니다. 프로젝트 생성시부터 독립된 iPad 전용 프로그램을 개발하는 방식과 하나의 애플리케이션에서 디바이스에 따라 다르게 동작하는 유니버셜 프로그램 방식이 있습니다. 첫번째 방식은 iPad 전용 프로그램과 뷰어를 개발하기 때문에 유니버셜에 비해 프로그램이 간결해지고 디버깅이 용이하며 실행파일 크기가 작습니다. 두 번째 방식은 새 프로젝트를 생성할 때 의도적으로 유니버셜을 만들거나 기존에 만들어진 iPhone 프로젝트를 재사용하기 위해 유니버셜 업그레이드(universal upgrade)를 적용하게 됩니다. 하지만, 유니버셜 프로그램을 하게 되면 디바이스에 따라 다르게 동작하게 하기 위한 조건코딩이 들어가게 되고, 디버깅과 복잡도에 따라 개발 시간이 상대적으로 더 걸릴 수 있으며 버전과 디바이스에 따라 시스템이 깨지는 현상도 발생할 수 있습니다.
이미 iPhone 애플리케이션을 만드는데 친숙한 개발자라면 iPad를 개발하는 데도 매우 친숙함을 느낄 것입니다. 그 이유는 모든 iPhone과 iPad 장치는 같은 기술과 기법을 사용하는 iPhone OS로 운영되기 때문입니다. iPhone 애플리케이션 개발에 대한 기반 기술에 미숙하다고 판단되면 iPhone Application Programmin Guide를 먼저 읽기 바랍니다. iPhone과 iPad의 두 장치간에 가장 큰 차이점은 화면크기입니다. iPad는 1024×768 픽셀 크기의 아이폰보다 큰 화면을 가지고 있기 때문에 더 많은 컨텐츠를 표시하고 상세하게 나타낼 수 있습니다.
새 프로젝트 만들기
새로운 프로젝트를 만들 때 어떤 디바이스에 기반한 애플리케션 인터페이스를 만들지 <그림1>의 Product 부분에서 선택해 결정합니다.

<그림1 프로젝트 생성 화면>
Navigation-based Application : 아이폰
OpenGL ES Application : 아이폰/ 아이패드
Split View-based Application : 아이패드
Tab Bar Application : 아이폰/아이패드
Utility Application : 아이폰
View-Based Application : 아이폰/아이패드
Window-based Application : 아이폰/아이패드/유니버셜
Universal Application
유니버셜 프로그램은 하나의 애플리케이션에서 조건코딩을 통하여 iPhone, iPod touch, iPad 디바이스 모두에서 작동할 수 있게 지원하는 방식입니다.
유니버셜 애플리케이션에는 두 가지 방식이 있으며, 첫 번째는 새 프로젝트를 생성할 때 “Window-based application” 인터페이스와 Product를 universal로 선택 후 진행 하는 방법입니다. 그러면 프로젝트의 물리적 디렉토리에 iPhone과 iPad용 디렉토리가 생성되고 별개의 파일들이 생성됩니다. 두 번째는 기존 iPhone 프로젝트를 유니버셜로 업그레이드하는 방법입니다. 이 방법에는 두 가지 방식이 있는데 “One Universal application”과 “Two device-specific applications” 입니다. One Universal 방법은 Resouce-iPad와 MainWindows-iPad.xib 파일만 만들어지고 모든 프로그래밍을 하나의 iPhone 소스에서 iPhone과 iPad 디바이스에 맞게 조건코딩을 합니다. 반면에 Two device-specific 방법은 Resource-iPad와 Targets 항목 밑에 “프로젝트명-iPad”가 만들어지고 iPhone에서 사용하는 모든 xib 파일이 복사되며, “프로젝트명-iPad”에는 iPhone의 헤더파일을 제외한 모든 m과 xib 확장자 파일이 복사됩니다. 하지만, 복사가 되었다고 해서 물리적인 디렉토리가 생기는 것이 아니므로 iPhone의 소스 파일을 수정하면 iPad의 소스파일에도 똑같이 수정된 결과가 나타나게 됩니다. 이는 조건코딩을 통해 하나의 소스 파일이 실행되고 iPhone과 iPad의 코드 영역을 쉽게 구분 지으며 별도의 xib파일을 가지고 있기 때문에 디버깅을 용이하게 합니다.
유니버셜로 업그레이드하는 방법은 Xcode 왼쪽 사이드바 “Groups & Files” 아래의 “Targets” 항목에서 프로젝트명을 선택하고 오른쪽 버튼을 누르거나 메뉴의 프로젝트에서 “Upgrade Current Target for iPad”를 선택하면 “One Universal application”과 “Two device-specific applications”이 나타나고 원하는 방식으로 진행할 수 있습니다<그림 2, 3>.
유니버셜 업그레이드(universal upgrade)시 Build 부분에서 주요 변경은 다음과 같습니다. Targeted Device Family는 iPhone/iPad로 설정되고 Base SDK는 iPhone Device 3.2로 변경됩니다. iPad를 개발하기 위해서는 반드시 3.2 SDK로 개발해야 하고 deployment target는 SDK가 3.1.3이거나 그 이전 버전으로 유지하고 있어야지만 iPhoner과 iPod이 잘 작동합니다.
iPhone OS 3.1.3이나 그 이전 버전으로 애플리케이션이 작동하고 있으면 iPhone OS 3.2에서 소개된 클래스는 사용하지 말아야 합니다. 예를 들어 iPhone OS 3.1을 사용하고 있는 애플리케이션에서 UISplitViewController 클래스를 사용할려고 하면 사용할 수 없는 심볼이기 때문에 애플리케이션이 깨지게 됩니다. 이를 방지하기 위해서는 심볼을 사용전에 사용할 수 있는지 반드시 런타임 체크를 수행해야 합니다.
<그림2 Targets에 추가된 iPhone-iPad 화면>
<그림3 Resourc-iPad가 추가된 화면>
Conditional Coding
조건코딩은 런타임(run time) 때 디바이스 정보를 얻어서 디바이스에 맞는 해당 코드가 실행되게 합니다. 조건코딩하는 방법에는 model 메서드로 디바이스 구분, 해당 클래스가 사용가능한지를 널로 체크, SDK 버전에 따른 구별 등이 있습니다.
[UIDevice currentDevice] model] 메서드를 사용하면 디바이스 정보를 얻을 수 있습니다. iPad는 iPad, iPod는 iPod touch라고 출력되고 iPhone은 장비가 없어서 못 해봤지만 시뮬레이터에서 실행해 봤을 때 iPhone simulator라고 출력되는 것으로 봐서 iPhone일 것 같습니다. 이 메서드를 사용해 디바이스 별로 코드를 다르게 적용하면 됩니다.
split view와 PDF 클래스가 널이 아닐 때 사용가능합니다.
Class splitVCClass = NSClassFromString(@"UISplitViewController");
if (splitVCCClass)
{
UISplitViewController* mySplitViewController = [[splitVCClass alloc] init];
// Configure the split view controller.
}
if (UIGraphicsBeginPDFPage != NULL)
{
UIGraphicsBeginPDFPage();
}
UI_USER_INTERFACE_IDIOM 매크로는 iPhone과 iPad를 구분하는데 사용합니다.
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
// The device is an iPad running iPhone 3.2 or later.
}
else
{
// The device is an iPhone or iPod touch.
}

This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 2.0 Korea License.


아이폰앱을 아이패드용으로 만들려고 하는데요,
upgrade current target for ipad 이 버튼을 누르고나면 resources-ipad 폴더가 생기고
그 안에 MainWindow-iPad.xib 파일이 생기네요. 하지만 IB에서 window를 보면
이 화면이 작게 나옵니다. 아이폰 화면과 크기가 같지요.
물론 터치를 인식하는범위도 왼쪽 위 기준으로 (0,0) 에서 (320,480) 영역만 인식이 가능하구요,
원래 upgrade current target for ipad 이 버튼만으로는 아이패드 버전을 만들수 없는겁니까?
원인이 무엇인지 아시면 메일부탁드립니다.
(참고로, 새로운 ipad용 IB 파일을 만들어 각각 view 연결하고 덮어씌우니 되기는 하네요..)
안녕하세요
기존의 아이폰 어플을 아이패드로 전환하려고 합니다
아이폰 어플은 Navigation-based Applicatio 구조로 되어 있는데 아이패드에서는 Navigation-based Applicatio
구조가 지원되지 않는 것 같습니다
혹시 아이패드에서도 Navigation-based Applicatio로 구조를 잡고 싶은데 혹 방법이 있을까요?
염치 불구하고 글을 남깁니다
수고하십시요