개발자 입장에서 본 iOS 8의 변화점

이번 WWDC는 “개발”에 집중된 행사였습니다. 그 동안 개발자들이 꾸준히 개방을 요구해왔던 키보드와 위젯, 카메라 API 등이 iOS 8에서 오픈되었고, 앱간의 데이터 연결이 긴밀해졌습니다. 스마트 헬스 악세사리들과 홈 자동화 제품들로 부터 얻은 정보들을 한 곳에 저장하고 제어하는 플랫폼도 도입되었습니다. 더 많은 종류의 화면 크기를 염두에 둔 반응형 레이아웃도 이번에 소개 되었습니다. (애플과 반응형 디자인 참조)

iOS 8

무엇보다도 새로운 프로그래밍 언어인 Swift가 발표되었습니다. Python이 가진 명료하고 파워풀한 문법과, LLVM 런타임이 가진 최적의 성능이 만나 꿈의 언어가 만들어졌습니다. 개발자 입장에서 본 iOS 8의 변화점을 간략하게 정리해보았습니다. 이 포스팅은 Apple 개발자 문서인 What’s New in iOS에서 iOS 8.0 부분을 참고하였습니다


앱 익스텐션(App Extensions)

Image

iOS 8부터 앱 익스텐션을 통해서 시스템의 기능을 확장할 수 있습니다. 애플이 폰에 최적화하기 위해서 제한된 멀티태스킹을 처음 도입했을 때와 비슷하게, 일단은 제한적인 사용자 동작에 해당하는 부분들만 건드릴 수가 있습니다. iOS 8에서 지원하는 익스텐션은 다음과 같습니다.

  • 공유(Share): 소셜 웹사이트 등에 공유할 수 있게 해줍니다.
  • 실행(Action): 선택한 컨텐츠에 대해 간단한 동작을 실행합니다.
  • 투데이 위젯(Today): 알림 센터에 있는 “오늘” 영역에 위젯을 추가할 수 있습니다. 내용 표시와 간단한 작업이 가능합니다.
  • 사진 편집(Photo editing): 사진 앱에서 서드파티 앱을 통해 이미지 편집이 가능해졌습니다.
  • 스토리지 제공자(Storage provider): 앱들간에서 공통적으로 사용되는 문서 저장장소에 OneDrive같은 서드파티 클라우드 서비스 제공자를 지정할 수 있게 되었습니다.
  • 커스텀 키보드(Custom keyboard): 드디어! 커스텀 키보드를 설치할 수 있게 되었습니다.

자세한 내용은 App Extension Programming Guide를 참조할 수 있습니다.


터치 아이디(Touch ID)를 통한 인증

Touch ID

지문인식 센서가 탑재된 아이폰 5s가 출시된 후 잠금화면 해제와 앱 구매할때만 지문인식 센서를 사용할 수 있다는 점이 아쉬움을 가져왔었는데요, 이제는 활용도가 훨씬 좋아질 것 같습니다. 보안이 필요한 앱들은 Local Authentication 프레임워크를 통해서 지문인증을 요청할 수 있게 되었습니다. 인증이 필요한 이유를 화면에 표시하고 지문인식을 요청한 후 인식 결과에 따른 처리를 앱에서 해줄 수 있습니다. 자세한 내용은 Local Authentication Framework Reference를 참조할 수 있습니다.


사진

사진 프레임워크(Photos Framework)

사진, 비디오 라이브러리들에 직접 접근할 수 있는 프레임워크입니다. 기존의 Assets Library 프레임워크를 대체하며, 쓰레드에 안전하게 썸네일 또는 풀사이즈 컨텐츠를 가져오고 캐싱하며, 편집할 수 있습니다. 다른 앱들이 편집한 이벤트도 인식할 수 있습니다. 자세한 내용은 Photos Framework Reference를 참조할 수 있습니다.

Photos UI 프레임워크를 통해서 네이티브 사진 앱 안의 컨텐츠들을 편집할 수 있는 익스텐션을 작성하려면 App Extension Programming Guide를 참조할 수 있습니다.

카메라 세부 조작

AV Foundation 프레임워크를 통해서 사진을 찍을 때 각종 파라메터를 직접 조작할 수 있게 되었습니다. 초점(focus), 화이트 밸런스(white balance), 노출(exposure) 값등을 건드릴 수 있습니다. 다양한 노출값을 동시에 찍은 결과물에도 접근할 수 있습니다. 자세한 내용은 AV Foundation Framework Reference를 참조할 수 있습니다.


게임

메탈(Metal)

Metal

이번에 애플이 새롭게 내놓은 그래픽 연산관련 프레임워크입니다. 최근에는 OpenGL을 직접 건드릴 일이 많이 적어졌기 때문에 어떤 용도로 만들어진건지 개인적으로도 궁금했었는데요. 기존의 OpenGL이 담당하던 레이어의 오버헤드를 획기적으로 줄이고 iOS 기기들에 탑재되어 있는 A7 칩셋의 성능을 극대화해주는 코드를 생성할 수 있다고 합니다.

WWDC 키노트에서 언급한 내용 중에 특히 주목을 끌었던 것은, Unity를 포함한 대부분의 멀티플랫폼 게임 저작툴들이 메탈을 지원할 예정이라는 사실과, 일반 게임 개발자들은 코드 한 줄 바꾸지 않고 툴 업데이트와 컴파일 과정만을 거쳐 iOS에서 최대 10배의 성능 향상을 가져온다는 점입니다. 자세한 내용은 Metal Programming Guide, Metal Framework Reference, Metal Shading Language Guide에 나와 있습니다.

씬 킷(Scene Kit)

Scene Kit

이번에 새로 도입된 3D 게임관련 프레임워크입니다. Objective-C 기반으로 작성되어 있고, 비교적 고성능 렌더링 기능을 상위언어로 구현할 수 있다는 장점이 있습니다. OS X 10.8부터 있었는데 이번에는 iOS에도 포함되게 되었습니다. OpenGL ES같은 로우레벨 API들은 개발자가 렌더링 알고리즘을 세세하게 구현해야 하지만, 씬 킷을 이용하면 기하 구성요소(geometry), 물질(material), 광원(lights), 카메라(camera) 등을 오브젝트로 구성하고, 이 오브젝트들의 값을 변경해서 애니메이션을 줄 수 있다고 합니다. 물리엔진도 포함이 되어 있고, 계층관계의 행동(behavior) 지정을 통해서 자동차와 같은 바퀴달린 물체들을 다루기 쉽게 되어있다고 합니다.

쉐이더 부분은 OpenGL ES나 GLSL로 구현해서 커스텀화도 가능한 것으로 보입니다. 자세한 내용은 Scene Kit Framework Reference에서 확인할 수 있습니다.

스프라이트 킷(Sprite Kit)

Sprite Kit

작년에 처음 도입되었던 스프라이트 킷도 여러 가지 업데이트가 이루어졌습니다. 고급 이펙트들과 커스텀 OpenGL ES 세이더, 광원효과, 고급 물리효과, 애니메이션을 사용할 수 있게 되었고 씬 킷과 통합 구성이 가능해졌습니다. SKFieldNode 클래스를 통해 역장을 구성할 수 있습니다. 강체(rigidbody)는 픽셀단위로 지정할수 있게 되어서 충돌감지를 세밀하게 할 수 있습니다. 강체들 관계에 따른 고정(pin)이 가능하기 때문에 복잡한 시뮬레이션 하기에 수월해졌습니다.

Xcode 6에 새로운 쉐이더들과 씬 에디터가 추가되었고, 이를 통해 작업속도의 비약적인 향상을 기대할 수 있습니다. 씬 에디터를 이용해서 씬 컨텐츠를 생성하고 노드들의 특성을 지정해서 물리효과를 줄 수 있습니다. 추후에 씬 전체를 파일로 저장해서 게임 구동시 로딩해서 사용할 수 있습니다. 자세한 내용은 Sprite Kit Framework Reference, Sprike Kit Programming Guide를 참조하세요.

AV 오디오 엔진(AV Audio Engine)

AAV Foundation 프레임워크를 사용하면, 골치 아프고 복잡한 Core Audio를 쓰지 않고도 다양한 범주의 오디오 함수들을 사용할 수 있습니다. 새로운 오디오 기능들은 iOS와 OS X에서 모두 사용할 수 있습니다. 오디오 입력과 출력에 자동 접근, 오디오 녹음과 재생, 파일 파싱과 변환을 할 수 있습니다. 특수 이펙트나 필터, 음정/재생속도 관리, 스테레오/3D 오디오 환경, 미디 악기 제어를 위해 Audio Unit에 접근할 수도 있습니다.

자세한 내용은 AV Foundation Framework Reference에서 확인할 수 있습니다.


헬스 킷 프레임워크(Health Kit Framework)

Health Kit

헬스 킷은 사용자의 건강과 관련된 정보를 관리해주는 프레임워크입니다. 건강 관련 앱들이 넘쳐나고 있는 가운데, 측정되거나 입력된 정보들이 산재되어 저장되고 있었는데 이를 한 군데에서 관리하기 위해서 도입되었습니다. 보안절차가 고려된 저장공간에 정보들을 안전하게 보관하고, 헬스 앱에서 모든 정보를 한 눈에 볼 수 있습니다.

앱에서 헬스 킷을 지원하면, 측정기기에 직접 연결하지 않고도 필요한 건강 정보들을 받아올 수 있습니다. 사용자는 앱별로 어떤 정보들을 공유할지 제한할 수 있습니다. 정보들이 업데이트 되는 시점도 세세하게 정할 수 있습니다. 예를 들면, 혈압을 잴 때마다 정보를 받아올 수도 있고, 혈압이 너무 높아지는 특정 지점에만 받아올 수도 있습니다.


홈 킷 프레임워크(Home Kit Framework)

Home Kit

헬스 킷과 마찬가지로, 홈 네트워크 기기들을 관리해주는 허브로서 야심차게 준비한 듯 합니다.

홈 킷을 이용해서 집에 있는 기기들은 인식하고, 일련의 동작들을 수행하게 할 수 있습니다. 동작들을 그룹화 하고, Siri를 통해 이를 실행하게 하는 것도 가능합니다. 예를 들면, 집에 들어와서 “잘준비 해줘”라고 하면, 문을 잠그고 조명을 끄고 가스를 잠근다던가 하는 동작들이 한꺼번에 수행되게 할 수 있는 겁니다.

홈 킷 악세서리 시뮬레이터를 통해 테스팅이 가능하며, Home Kit Framework Reference에 자세한 정보가 나와 있습니다.


아이클라우드(iCloud)

문서 기반의 데이터 이전

아이클라우드는 처음 발표되었을 때부터 버그가 많았습니다. 이를 의식해서인지, iOS 8이나 OS X 10.10으로 아이클라우드에 접속을 하면, 최초 1회에 한해서 전체 문서변환을 하게 됩니다. 이렇게 변환된 문서들은 iOS 8과 OS X 10.0 이상에서만 접근이 가능합니다. 서버와 클라이언트간의 동기화와 관련된 안정성 업데이트가 많이 이루어졌다고 합니다. (예전에 동기화 도중 문서들이 사라지는 버그는 악명이 높습니다.) 문서 이전을 마치고 기존 버전의 OS에서 아이클라우드에 접속하게 되면, 이전 저장소에 남아있는 데이터들을 볼 수는 있지만 새로 만들어진 데이터에는 접근할 수 없게 됩니다.

클라우드 킷(Cloud Kit)

클라우드 킷을 통해 앱과 아이클라우드간에 이루어지는 데이터 교환을 직접 컨트롤 할 수 있습니다. 기존 아이클라우드 개념과는 달리 로컬 저장소가 따로 존재하지 않습니다. 공개 저장소(public repository)와 비공개 저장소(private repository)가 있는데, 공개 저장소에 기록된 정보는 앱 사용자들 모두가 접근이 가능하고 비공개 저장소는 사용자만 접근이 가능합니다.

클라우드 킷을 사용하면, 서버 개발을 따로 하지 않고도 앱에서 서버 로직을 구현할 수 있습니다. 제약사항은, 아이클라우드 계정이 있어야 데이터 기록을 할 수 있다는 것입니다. 애플이 원래도 자사 플랫폼 독점(exclusive) 앱을 많이 장려했었는데요, 클라우드 킷을 통해 앱 개발사와 사용자들을 iOS와 OS X 플랫폼에 더욱 묶어두려는 계략이 엿보입니다만, 서버 개발과 유지보수 비용 부담이 부담스러운 인디 개발자로서는 매력적이지 않을 수 없습니다.

도큐먼트 피커(Docuemnt Picker)

UIDocumentPickerViewController를 통해서 앱 샌드박스 밖에 있는 파일들을 접근 할 수 있습니다. 하나의 문서를 여러 앱을 통해 편집하는 것이 가능해집니다. 개발사마다 자사 저장공간에 접근할 수 있는 도큐먼트 프로바이더(document provider)를 제작하는게 가능하기 때문에, iCloud Drice, OneDrive, Dropbox 같은 서비스들은 한 곳에서 사용할 수 있게 될 전망입니다.


핸드오프(Handoff)

Handoff

올해 키노트에서 가장 박수를 많이 받았던 기능이 아닐까 합니다. 맥을 통해 아이폰에서 걸려온 전화를 받고, 수신된 문자에 대한 답장을 하는 기능이 특히 눈길을 끌었습니다. 핸드오프는 같은 Apple ID를 사용하는 기기끼리 동작합니다. 예를 들어, 아이폰에서 작성을 시작한 메일을 맥에서 이어서 작성한다던가, 아이패드에서 보고 있던 Safari 웹 페이지를 아이폰에서 같은 스크롤 위치에서 바로 이어서 본다던가 하는 시나리오들이 가능해집니다.

이런 앱들을 서드파티 앱에도 적용하려면, 파운데이션의 API들을 적용해야 합니다. 각각의 작업들을 다른 기기에서 이어서 할 수 있는 정보들을 액티비티(activity) 객체에 담아두어야 합니다. 자세한 정보는 Handoff Programming Guide에서 참고할 수 있습니다.


유니버셜 앱에서 하나의 스토리보드 사용

iOS 8부터는 하나의 스토리보드를 이용해서 아이폰과 아이패드를 동시에 지원할 수 있습니다. 자세한 설명은 개발자 입장에서 본 iOS 7의 변화점에서 확인하실 수 있습니다. 요컨대 화면 크기별로 앱을 따로 만들게 아니고 반응형으로 잘 지정해서 대응하는 것이 가능해졌습니다. 향후에 발매될 아이폰 6, iWatch나 Apple TV 등을 염두에 둔 행보가 아닐까 싶습니다.

반응형 레이아웃을 위해서 사이즈 클래스라는 것을 도입했는데요, 쉽게 말하면 다양한 화면 크기를 카테고리화 하자는 것입니다. 크기는 레귤러(regular)와 컴팩트(compact) 두 가지가 정의되어 있습니다. 아이패드의 경우 너비와 높이가 모두 레귤러라고 정의하고, 아이폰의 경우 세로모드에서는 너비가 컴팩트, 가로모드에서는 너비와 높이가 모두 컴팩트라고 정의했습니다. 컴팩트의 경우에는 작은 크기로 정보들을 축약해서 보여줘야 하는 상황이고, 레귤러의 경우에는 넉넉한 화면 크기가 보장되며 폭도 고정되어 있지 않는 상황이라고 보시면 될듯 합니다. 아래 이미지에서 확인하실 수 있습니다.

Device 1

Device 2

이를 위해서 새롭게 추가된 클래스들이 있습니다.

  • UITraitCollection: 현재 화면을 구성하는 정보들의 집합입니다. 너비와 높이의 사이즈 클래스, 레티나 여부, 기기 구분(idiom)으로 이루어집니다.
  • UIImageAsset 클래스는 이미지들을 관리해주며 trait collection에 따라 적절한 이미지를 고를 수 있게 도와줍니다. 예를 들면, 컴팩트 사이즈의 너비와 컴팩트 사이즈의 높이, 레티나이면서 아이폰인 경우 해당하는 이미지를 이미지 어셋이 반환해줍니다. 예전에는 @2x, ~ipad 등과 같은 단어를 통해 조합했어야 했습니다.
  • UIAppearance는 특정 trait collection일때만 적용할 수도 있도록 변경되었습니다.
  • UIViewController는 자식 view의 trait collection을 받아올 수 있게 변경되었습니다. 가로모드/세로모드 전환시에는 trait collection이 변경이 되는 것으로 간주해서 그동안 써왔던 메소드들을 모두 없앴고, 이제는 viewWillTransitionToSize:withTransitionCoordinator: 메소드를 오버라이드해서 구현해야 합니다.

추가적인 프레임워크 변경사항

API 모던화

  • Objective-C 기반의 프레임워크에서 getter가 대부분 property로 변경되었습니다.
  • 생성자(initializer)는 id 타입 대신 instancetype을 반환하도록 변경되었습니다.
  • Designated initializer가 필요한 경우 선언됩니다.

AV 파운데이션 프레임워크(AV Foundation Framework)

비디오 캡쳐할 때 임의의 메타 데이터를 기록할 수 있습니다. 예를 들면 촬영 장소값을 넣을 수도 있습니다.

AV 킷 프레임워크(AV Kit Framework)

예전에 OS X에 도입되었던 프레임워크고 이번에 iOS 8부터 포함됩니다.

코어 이미지 프레임워크(Core Image Framework)

  • iOS에서 커스텀 이미지 커널을 만들 수 있습니다.
  • 이미지에서 QR 코드나 사각형을 인식할 수 있습니다.

코어 로케이션 프레임워크(Core Location Framework)

  • 몇층에 있는지 정보를 받아올 수 있습니다.
  • Visit service를 이용해서 관심있는 장소에 방문할 때 significant location change service를 사용하지 않고서도 인지할 수 있게 되었습니다.

파운데이션 프레임워크(Foundation Framework)

  • NSFileVersion 클래스를 통해 아이클라우드에 저장된 문서의 이전 버전들에 접근 가능합니다.
  • NSURL 클래스에 문서 섬네일을 메타 데이터로 저장하는 기능이 추가되었습니다.
  • NSMetadataQuery 클래스를 통해 앱에서 열었던 아이클라우드 문서를 찾을 수 있습니다.

게임 컨트롤러 프레임워크(Game Controller Framework)

  • 컨트롤러가 기기에 접속하게 되면 Game Controller 프레임워크에서 모션 데이터를 직접 받아올 수 있게 되었습니다.
  • 버튼 입력에 대해서 감도를 신경쓰지 않아도 눌린 여부를 알 수 있게 되었습니다.

게임 킷 프레임워크(Game Kit Framework)

  • iOS 7에서 추가되었던 기능이 OS 10.10에도 추가되어 크로스 플랫폼으로 구현 가능합니다.
  • GKSavedGame 클래스를 통해 아이클라우드에 게임 저장정보를 쉽게 동기화할 수 있습니다.
  • 사용자를 인식하기 위해 identifier 스트링을 이용하던 메소드들이 없어졌습니다. GKPlayer 클래스를 통해서 사용자를 인식하도록 변경되었습니다.

iAD 프레임워크(iAD Framework)

  • AV Kit을 이용해서 비디오를 재생한다면, 비디오 재생 전에 광고를 표시할 수 있게 되었습니다.
  • 앱에서 진행중인 광고의 효율성을 확인하기 위한 정보가 추가되었습니다.

미디어 플레이어 프레임워크(Media Player Framework)

  • 메타 데이터 정보를 위한 클래스들이 추가되었습니다.

스프라이트 킷 프레임워크(Sprite Kit Framework)

  • 게임 관련 다양한 기능들이 추가되었습니다.
  • 자세한 사항은 Sprite Kit Framework Reference, Sprite Kit Programming Guide를 참고하시기 바랍니다.

UI 킷 프레임워크(UIKit Framework)

  • 로컬/푸쉬 노티피케이션(Local/push notification)을 등록하기 위해서 UIUserNotificationSettings 객체를 이용하도록 변경되었습니다.
  • 노티피케이션을 받았을 때 액션(action)을 취할 수 있도록 지정이 가능합니다.
  • 컬렉션 뷰(collection view)의 셀 크기를 동적으로 변경할 수 있습니다. 성능 향상을 위해서 화면에 뿌려진 셀을 무효(invalidate)하는 방법들도 추가되었습니다.
  • 검색과 관련하여 UISearchController가 UISearchDisplayController를 대체합니다.
  • UIViewController는 trait와 사이즈 클래스를 지원합니다.
  • UISplitViewController를 아이폰에서도 사용이 가능합니다. 또한 한번의 구성으로 아이폰과 패드에서 모두 최적화해서 보여줄 수 있습니다.
  • UINavigationController의 바 영역을 제스쳐를 통해 숨길수 있게 되었습니다.
  • UIVisualEffect 클래스를 통해 블러(blur) 효과를 손쉽게 적용할 수 있습니다. (올레!)
  • UIPresentationController 클래스를 통해 컨텐츠와 테두리를 분리할 수 있습니다.
  • UIPopoverPresentationController 클래스를 통해 팝오버에서 보여지는 컨텐츠를 조절할 수 있습니다.
  • UIAlertController가 UIActionSheet와 UIAlertView를 대체합니다.
  • UIPrinterPickerController를 통해 프린터를 선택할 수 있습니다.
  • 환경설정 앱에서 앱설정을 직접 건드릴 수 있습니다. UIApplicationOpenSettingsURLString 키를 UIApplication 클래스의 openURL: 메소드에 전달해서 구현이 가능합니다.

비디오 툴박스(Video Toolbox) 프레임워크

  • 하드웨어 비디오 인코딩과 디코딩을 직접 제어할 수 있습니다.

제거된 API

  • UIApplication을 통해 notification을 등록하는 메소드
  • UIViewController에서 인터페이스 방향과 관련된 메소드
  • UISearchDisplayController 클래스
  • Game Kit에서 identifier 스트링을 이용한 사용자 인식

One more thing... Swift!

무엇보다 이번 WWDC의 하이라이트는 iOS 8도 아니요, OS X 10.01도 아니요, Swift의 발표가 아니었나 생각됩니다.

Swift

Swift는 코코아와 코코아 터치를 위해서 최적화되어 만들어진 프로그래밍 언어입니다. 적은 줄의 코드로 많은 일들을 할 수 있고, 성능향상도 가져다 주면서 가독성이 높습니다.

파이선(Python)이 가진 가독성과 LLVM 기반에서 동작하는 C언어의 성능을 합쳤다고 합니다. 이게 허풍이라고 볼 수 없는 것이, LLVM 컴파일러를 만들었던 천재 엔지니어 Chris Lattner가 런타임을 확실히 컨트롤 하고 있고, 애플은 이미 클로저(colsure) 등을 통해 프로그래밍 언어에 손댄 경력이 있습니다. Swift는 향후 10년간 iOS + OS X 플랫폼을 이루는 주축으로 자리잡을 것으로 기대됩니다.

당장 Swift를 스터디할 수 있도록, Apple에서 iBooks 도서를 배포합니다. 이번 WWDC가 우리에게 남겨준 것은 역시 공부, 또 공부입니다. (비명)

관련링크

comments powered by Disqus