제공 :
한빛 네트워크
저자 : Jonathan A. Zdziarski
역자 : 이호민
원문 :
The iPhone SDK: APIs Apple Didn"t Want You to Know About
저자 노트: 오픈 소스 툴 체인이 아이폰 v2.0을 지원하도록 개선하는데 지대한 공헌을 한 제이 프리먼(Saurik)에게 특별히 감사드립니다.
아이폰 애플리케이션 개발하기 위한 애플의 SDK가 릴리즈되자 처음에는 많은 사람들이 완전히 새롭고 혁신적인 것들을 탐험하며 새로운 것을 발견하는 것에 격양되어 이 새로운 플랫폼을 보기 위해 모여 들었다. 아이폰을 둘러싼 에너지는 작년 6월의 아이폰 출시 때부터 지속적으로 유지되고 있었으며 애플의 초기 “베타” 버전의 SDK는 개발자들을 이 플랫폼에 참여하게 이끄는 많은 툴들을 제공했다. 하지만 금방 그 커뮤니티는 여러 면에서 벽에 부딪혔고, 개발자들에게 부가된 많은 제한사항들로 인해 이 플랫폼에 대한 환상은 깨졌다. 애플은 그 SDK가 애플 내부에서 소프트웨어를 만들기 위해 사용된 것과 동일하다고 주장했지만 개발자들은 자신들이 아이폰과 동일한 수준의 저-수준 함수들에 접근할 수 없다는 것을 발견했다. 그것들은 애플리케이션을 백그라운드로 실행시키는 것, 제대로 된 오브젝트를 만드는 것 그리고, 그래픽과 사운드 컴포넌트에 직접 접근하도록 하는 CoreSurface, Celestial, LayerKit과 같은 저-수준 프레임워크들로, 이것들을 함께 다른 여러 기능들이 애플에서 만들어진 애플리케이션에서는 발견되었지만 SDK에서는 찾아볼 수 없었다.
이 사태를 완전히 이해하기 위해서는 역사를 조금 되짚어 볼 필요가 있다. 2007년 6월 이래로 오픈 소스 커뮤니티는 아이폰을 해킹하고 있었고 (대략 시장의 40%에 달하는) 엄청난 수의 사용자들을 모았다. 곧이어 한 무리의 해커들이 오픈 소스 소프트웨어를 실행하기 위한 자유로운 아이폰 운영체제를 개발해 나갔고, 그들만의 커뮤니티 SDK(software development kit)를 빌드 하는데 성공했다. 그 후 아이폰과 관계되는 개발 커뮤니티들은 적지 않게 자라났고 수백에 달하는 훌륭한 애플리케이션들이 만들어 졌으며, 유명한 커뮤니티 소프트웨어 인스톨러를 통해 자유롭게 사용할 수 있었습니다. 그 인스톨러는 “인터넷 도서관” 같은 종류의 서비스를 제공하는 애플리케이션으로 이를 사용해 아이튠(iTune)이나 심지어 데스크톱을 사용하지 않고도 누구나 (무선망을 통해) 프로그램을 다운로드하고 인스톨 할 수 있다.
2007년 가을이 되자 나머지 아이폰 커뮤니티들도 동참했다. 유명한 웹사이트 jailbreakme.com의 저자인 니콜라스 펜리는 백만이 넘는 아이폰 사용자들이 그들의 장치에 서드파티 애플리케이션을 사용할 수 있도록 하기 위해 그 사이트를 이용하고 있다고 발표했다. 그 발표가 있은 후 지금은 2백만이 넘는 아이폰 사용자들이, 아이폰의 공용 소프트웨어에 전체에 완전히 접근할 수 있게 만들어 주는, 서드파티 “인스롤러” 애플리케이션을 사용하고 있다. 오픈 소스 개발은 매우 대중화 되었다. 사실, 최근 오라일리는 나에게 이 API들 중 많은 부분을 문서화하고, 아이폰을 위한 애플리케이션을 작성하는 방법을 개발자에게 가르쳐 준 책, “아이폰 오픈 소스 애플리케이션 개발(iPhone Open Application Development)”을 저술하고 출판한 것에 대한 커미션을 제공했다.
2008년 3월로 넘어와 보면, 애플은 마침내 서드파티 개발자들을 무시함으로 인해 엄청난 금전적 기회를 놓치고 있다는 것을 알아차렸다. 그리고 오픈 소스 커뮤니티에서 거의 일년 가량 사용하고 있었던 것과 같은 일을 하는 애플 버전의 SDK(애플 SDK)와 애플리케이션 배포 체인(아이튠 AppStore)을 릴리즈 하기로 결정했다. 이 지연으로 인해 애플은 오픈 소스 커뮤니티에 비해 놀랄 만큼 뒤쳐지게 되었고, 아이러니하게도 오픈 소스 커뮤니티가 상업 소프트웨어의 성과를 따라 하려고 애쓰는 대신, 오늘날까지 -부끄럽게도- 애플이 오프소스 커뮤니티를 따라 하려고 노력하고 있다.
애플 SDK가 소개되자 개발자들은 이것의 기능들을 작년 8월에 배포된 비공식의 오픈 소스 SDK와 비교해 보았다. 이 사용자들이 만든 아이폰용 오픈 소스 컴파일러를 만들어 가는 도중에 개발자 커뮤니티는 많은 저-수준 API(application programming interfaces)들을 공개했다. 개발자들은 class-dump, nm 같은 도구들을 사용하고, 구식의 단순한 해 보고 오류 찾기 등의 방법을 통해 아이폰의 프레임워크에 완전하게 깊히 접근을 할 수 있었다. 이 방법들을 사용해 애플의 기본 탑재 소프트웨어들과 동일하게 보이고, 동작하는 애플리케이션을 만들 수 있었다. 애플이 그들의 SDK가 "동일한 툴 모음"이라고 발표했기 때문에 대부분의 사람들은 오픈 소스 툴 체인과 닮아 있을 것으로 기대했으며, 매우 일부의 사람들은 그 공식 SDK에 많은 제한 사랑들이 있을 것으로 예상했다. 두 SDK에서 대략 75%에 해당하는 부분은 겹쳐져 있었고, 나머지 25%는 개발자들에게 그들이 만든 애플리케이션으로 “정말 재미있는 것들”을 하기에는 매우 제한되어 있었다.
현재로 돌아와 보면, 여러분은 애플 SDK에서 제공하는 API들을 사용해 보통 수준의 게임이나 보통 수준의 애플리케이션을 만들 수 있다. 하지만 좀 더 철학적이고, 저-수준이 필요한 애플리케이션을 만드는 데는 부족하다. 다행히도 애플에서 여러분들에게 절대 알리고 싶어하지 않는 “진짜” API 모음이 존재한다.
이것들은 비공식 SDK “툴 체인”을 통해 사용 가능한 것과 동일한 인터페이스를 제공하지만 예전에는 우리들이 알지 못했던 것들 이다. 좋은 소식은 여러분들이 (Xcode를 통해) 애플SDK를 이 숨겨진 API를 사용하는 애플리케이션을 만드는데 사용할 수 있다는 것으로, 이 기사에서 어떻게 하면 되는지 보여주겠다.
반드시 다음 사항들을 확인 할 필요가 있다. 이 숨겨진 API들을 사용한 프로젝트는 애플의 AppStore에 등록되지 못할 수도 있다. 이를 다운로드 할 때 문제가 되는 것은 기술적인 것이 아니라 정책과 논란 때문이다. 이 API들을 사용하여 여러분의 애플리케이션을 기능적으로 확장할 수 있지만, 경고하건대 여러분의 애플리케이션을 커뮤니티 “인스톨러”를 통해 배포해야 함을 의미할 수도 있다. 다행인 것은 많은 개발자들이 더 좋은 소프트웨어를 작성하기 위해 감수하고 이 방법을 선택한다는 것이며 40%에 달하는 시장 점유율을 가진 커뮤니티 인스톨러를 통해서도 매우 많은 사용자들에게 도달할 수 있다는 것이다. 또한 커뮤니티 소프트웨어 인스톨러의 잠재력을 확장하기 위해 폰을 잠금 해제하여 인증되지 않은 네트워크에서 돌아가는 아이폰 사용자들은 아이튠 AppStore를 사용할 수 없을 것 이다.
이제부터가 재미있는 부분이다. Aspen(아이폰 OS) 소프트웨어를 아이폰에서 사용하거나 사용할 분들과, 이 숨겨진 API들을 사용해 애플리케이션을 빌드하고 싶은 분들을 위해 여러분들이 사용할 수 있는 두 가지 방법이 있다. 하나는 오픈 소스 툴 체인이고 다른 하나는 애플 공식 SDK(에 약간 손을 본 것)을 사용하는 것 이다. 두 방법 모두 애플 자체 소프트웨어에서 사용되는 저-수준 프레임워크의 이점들을 모두 끌어 쓸 수 있고, 오픈 소스 툴 체인을 위해 만들어진 기존 애플리케이션을 빌드하는 것 또한 가능하다.
애플 SDK에 포함된 내부(private) API 사용
오픈 툴 체인에서 사용 가능하게 만들어진 애플의 저-수준 API들은 애플 SDK에서 의도적으로 빠진 오브젝트들과 매써드들을 포함하고 있다. 예를 들어 여러분만의 영화 재생기 같은 걸 만든다고 한다면 애플 SDK만으로 애플에서 만든 영화재생기와 버금 가는 수준으로 개발하려는 것은 매우 어리석은 생각이다.
첫째로 잃어버린 프레임워크 중 하나인 CoreSurface를 예로 들어보자. CoreSurface는 화면에 직접 쓸 수 있게 해 줌으로 맞춤 영화 재생기 또는 소프트웨어 에뮬레이터 같은 애플리케이션을 만들 수 있게 해 준다. 이 프레임워크는 아이폰과 애플SDK에 포함되어 OpenGL같은 고-수준 라이브러리에서 사용되고 있지만 프레임워크 헤더가 없기 때문에 개발자 들은 그 이점들을 사용할 수 없었다.
숨겨진 오브젝트들의 다른 예로 애플리케이션의 설정 화면을 만드는데 사용되는 UIPreferencesTable이 있다. 애플의 문서에는 여러분이 -애플리케이션을 빠져나가 “설정” 애플리케이션에서 사용할- 설정 번들을 여러분의 애플리케이션에서 가지고 있어야 된다고 한다. 이렇게 하면 룩-앤-필(look-and-feel)을 만족시키긴 하지만 누군가 이 방법은 데스크톱 프로그램에서 “설정” 메뉴 옵션을 가질 권리를 빼앗는 것과 동일한 일로 올바르지도, 공평하지도 않다는 것을 알아냈다.
이 숨겨진 API들의 장점들을 사용하기 위해서 여러분들은 이 오브젝트들의 헤더를 설치하고 그 헤더를 사용하도록 Xcode 프로젝트를 수정해야 한다. 이 인증되지 않은 내부 헤더들은 the “iPhone Dev Team.”이라는 개발자 모임을 통해 관리되고 있다. 이 비공식의 헤더들은 오픈 소스 SDK에서 사용되던 것들이다. 이 저-수준 API들을 다운로드하고 인스톨 하려면 여러분의 데스크톱의 터미널 창에서 아래의 내용을 따라 하면 된다.
$ svn co http://iphone-dev.googlecode.com/svn/branches/include-1.2-sdk
$ cd include-1.2-sdk
$ ./configure
--prefix=/Developer/SDKs/iPhoneOS.sdk/Versions/iPhoneOS2.0.sdk
$ sudo sh install-headers.sh
$ sudo ln -s
/Developer/SDKs/iPhoneOS.sdk/Versions/iPhoneOS2.0.sdk
/Developer/SDKs/iPhoneOS.sdk/Versions/Current
이 명령들로 그 API들을 /Developer/SDKs/iPhoneOS.sdk/Versions/iPhoneOS2.0.sdk라는 새 디렉터리에 설치할 것이다. 이제 여러분은 Xcode프로젝트를 “공식적인” API대신 이 비공식 API를 사용하도록 알려줘야 된다. 다음을 절차를 따라 하라.
- 프로젝트 메뉴에서 프로젝트 설정 편집을 선택
- 상단의 빌드 탭 클릭
- “GCC-4.0 – 언어” 가 타이틀인 구간으로 스크롤 다운
- C Flags 옵션에 다음의 값을 한 줄로 (줄 바꿈 모두 제거해서) 입력하고 설정을 저장
-I/Developer/SDKs/iPhoneOS.sdk/Versions/iPhoneOS2.0.sdk/include
-I/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk/usr/include
-I/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/gcc/arm-apple-darwin9/4.0.1
/include
-F/System/library/Frameworks
-F/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk/System/library
/Frameworks
-F/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk/System/library
/PrivateFrameworks
-DMAC_OS_X_VERSION_MAX_ALLOWED=1050
만약 Xcode대신 Makefile을 사용한다면 다음 CFLAGS를 추가하여 매우 깔끔하게 빌드를 만들 수 있다.
DEV = /Developer/Platforms/iPhoneOS.platform/Developer
SDK = $(DEV)/SDKs/iPhoneOS2.0.sdk
CC = $(DEV)/usr/bin/gcc-4.0
CFLAGS = -arch arm
-I"/Developer/SDKs/iPhoneOS.sdk/Versions/Current/include"
-I"$(SDK)/usr/include"
-I"$(DEV)/usr/lib/gcc/arm-apple-darwin9/4.0.1/include"
-F"/System/library/Frameworks"
-F"$(SDK)/System/library/Frameworks"
-F"$(SDK)/System/library/PrivateFrameworks"
여러분의 애플리케이션을 빌드할 때 이제부터는 표준 API들과 추가로 저-수준 API들을 사용하게 될 것이다. 저-수준 API들이 CoreSurface같은 다수의 내부 프레임워크를 포함하기 때문에 이 프레임워크들을 여러분의 애플리케이션으로 불러와야 한다.
이 같은 프레인워크들을 Xcode에서 사용하려면 먼저 여러분의 빌드를 “장치 – 아이폰 OS 2.0”으로 변경해야 한다. 이렇게 하는 이유는 시뮬레이터가 아이폰에 포함된 프레임워크중 다수를 포함하지 않았기 때문이다. 사실, 시뮬레이터는 OpenGL을 사용하는 것 같은 일부 “공식” SDK 애플리케이션도 실행하지 못한다. 이 같은 저-수준 프레임워크를 빌드하고 테스트 하려면 아이폰에서 직접 하는 수 밖에 없다.
- 프로젝트 메뉴에서 활성 SDK 설정을 선택한다. 이제 장치 – 아이폰 OS 2.0 을 선택한다.
- 프로젝트의 Frameworks 폴더에서 우 클릭 하고 추가->기존 프레임워크 를 선택한다. 그러면 프레임 워크 폴더로 들어가고 여기서 하나 이상의 추가할 프레임 워크를 선택할 수 있다. 아마 PrivateFrameworks 폴더로 찾아가야 할 텐데 이곳은 Frameworks 폴더보다 한 단계 위에 위치한다. 만약 찾지 못하겠으면 하드 드라이브를 선택하고 다음 위치로 찾아간다. /Developer/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk/System/library/PrivateFrameworks/
- CoreSurface.framework 같은 추가할 프레임워크를 선택하고 추가를 클릭한다. 그 프레임워크가 Xcode 프로젝트에 추가될 것이다.
Makefile을 사용한다면, 다음의 링커 설정을 추가해야 한다.
LD = $(CC)
LDFLAGS = -arch arm -lobjc
-framework CoreFoundation
-framework Foundation
-framework UIKit
-framework CoreSurface
-L"$(SDK)/usr/lib"
-F"$(SDK)/System/library/Frameworks"
이제 프레임워크가 링크되었다. 여러분의 프로젝트에 따라 적절히 헤더를 인클루드 해야 한다. 예를 들면:
#import
이제 준비가 끝났다! 다양한 내부(private) API 와 프레임워크를 어떻게 사용하는지에 대한 많은 예제들을 http://www.iphonedevdocs.com/ 에서 찾아볼 있고 내 오라일리 책에서도 찾아볼 수 있다. 여러분은 여러분의 애플리케이션이 제조사의 정책적인 규격 요청에 기능적으로 제한되지 않음을 알기 때문에 좀더 기능적인 코드들을 작성하고 밤에는 더 오래 자게 될 것이다!