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

올해의 WWDC에서는 많은 분들의 예상대로 애플 워치에서 네이티브 앱을 지원하는 watchOS가 소개되었습니다. 이제 애플 생태계는 iOS, OS X, watchOS의 세 플랫폼으로 구성되게 되었습니다.

3_os

이번 포스팅에서는 WWDC 2015에서 발표된 iOS 9의 바뀐 부분을 개발자 입장에서 정리해보았습니다. Apple 개발자 문서인 What's New in iOS를 참고하였습니다.


iPad를 위한 멀티태스킹

한 화면에서 두개의 앱을 동시에 실행할 수 있는 멀티태스킹이 도입되었습니다. 가칭 iPad Pro라고 불리우는 12인치 아이패드를 대비하는 신호라고도 볼 수 있는데요. 크게 세 가지 종류의 모드가 있습니다.

슬라이드 오버(Slide Over)

앱 사용중에 다른 앱을 잠시 화면 한쪽에서 작게 볼 수 있는 모드입니다.

slide_over

스플릿 뷰(Split View)

화면을 분할하여 동시에 두 앱을 실행하는 모드입니다. 슬라이드 오버 상태에서 가운데 구분막대를 터치해서 활성화 할 수 있고, 구분막대를 움직여서 두 앱의 크기를 조절할 수 있습니다.

split_view

PIP(Picture in Picture)

동영상 재생프로그램의 경우 현재 재생중인 동영상을 다른 앱이 실행되는 중에도 재생되게 할 수 있습니다.

pip

멀티태스킹이 이루어질 때 다양한 화면 크기에 최적화된 앱을 만들 수 있는 환경을 위해서 애플이 지난 몇 년 동안 다음과 같이 경로를 밟아 왔습니다.

  • iOS 6: 오토 레이아웃(Auto layout)
  • iOS 7: 다이내믹 타입(Dynamic Type)
  • iOS 8: 적응형 UI(Adaptivity)

그래서 위의 사항들이 적용되어 있는 유니버셜 앱들은 큰 수정 없이 바로 멀티태스킹 적용이 가능합니다. 슬라이드 오버로 보여줄 앱을 고를 때에는 이렇게 적용되어 있는 앱들만 목록에 표시해줍니다. PIP로 동영상을 띄우려면 AVKit이나 AVFoundation을 통해 비디오 재생을 해야 합니다. Media Player 프레임워크는 지원이 중단 되었습니다. 관련 문서는 Adopting Multitasking Enhancements on iPad입니다.


검색

이번 WWDC에서 개인적으로 가장 흥미로웠던 부분 중 하나인데요, 아이폰에 저장된 개인정보와 설치한 앱들이 가지고 있는 정보들 활용한 새로운 검색시스템이 도입되었습니다. 작년에 구글이 스마트폰 내 검색을 도입한 것과 같은 방향입니다. 인터넷 검색이야 외부 검색엔진을 사용할 수 있지만, 스마트폰 내 검색은 민감한 개인정보를 포함하기 때문에 자체 플랫폼이 있어야만 한다는 필요성에서 나온 것으로 보입니다.

앱 데이터를 검색한 결과를 선택하면 딥링크(Deep Link)를 통해 앱 안에 검색된 데이터를 보여주는 화면으로 바로 이동할 수 있습니다. 뿐만 아니라 설치되어 있지 않은 앱의 검색 결과를 보여주고 앱 설치 화면으로 이동할 수도 있습니다. 검색 결과는 Siri도 접근할 수 있기 때문에 Siri를 통해서 할 수 있는 일의 범위가 대폭 확대되었습니다.

search

검색결과에 포함되려면 앱과 웹에서 다음과 같이 처리를 해주어야 합니다.

검색결과는 가능하면 키워드와 관련이 있는 최소한의 항목으로 보여주는 것이 권장됩니다. 그렇지 않을 경우 랭킹 시스템에 의해서 걸러져서 나중에는 아예 검색결과에 포함이 되지 않을 가능성도 있기 때문입니다.


게임 관련

이번에 개인적으로 기대했던 TV 앱스토어가 열리지는 않았습니다만, 향후 TV와 게이밍에 관심이 많이 보여진다고 느낄 만큼 게임 관련 프레임워크가 대폭 보강되었습니다.

gameplay_kit

게임플레이킷(GameplayKit)

스프라이트킷, 씬킷과 같이 사용되기 위한 게임 로직관련 모듈입니다. 난수(random) 생성, 개체들의 재사용성을 극대화하기 위한 툴, 상태흐름(state machines) 등을 포함하고 있습니다. 특히 게임을 구현할때 공통적으로 사용되는 알고리즘도 포함하고 있는데요, 턴제 게임에서 인공지능, 길찾기 알고리즘 등이 포함되어 있습니다. GameplayKit Programming Guide에서 자세한 내용을 참고할 수 있습니다.

model_io

모델 I/O(Model I/O)

게임에서 사용되는 3D 데이터와 연관된 프레임워크입니다. 메쉬 데이터를 불러오거나 마테리얼, 광원, 카메라 설정 등을 가져올 수 있습니다. 이렇게 가져온 데이터를 가공하고 내보내기도 할 수 있습니다.

메탈킷(MetalKit)

메탈을 활용하는 앱을 쉽게 만들 수 있도록 제공하는 유틸리티 프레임워크입니다. 다양한 소스에서 텍스쳐를 불러오는 것, 모델 I/O 어셋과 관련된 메탈 API, 그래픽 렌더링 앱의 코드를 줄이기 위한 뷰 매니지먼트(view management)를 지원합니다.

메탈 퍼포먼스 쉐이더

메탈 앱에서 사용할 수 있는 고성능 쉐이더를 제공합니다. iOS GPU에서 최적의 성능을 발휘할 수 있도록 특별히 튜닝되었다고 합니다. 그리고 기기별로 따로 성능 최적화를 할 필요 없이 알아서 최적화 되어 적용된다고 합니다. 가우시안 블러(Gaussian blur), 이미지 히스토그램(Image histogram), 소벨 엣지 디텍션(Sobel edge detection) 등의 쉐이더를 지원합니다.

메탈의 새로운 기능

성능 최적화가 되어 렌더링 성능이 개선되었습니다. 메탈 쉐이딩 언어와 메탈 스탠다드 라이브러리가 적용되었습니다. 쉐이더에서 더 다양한 픽셀 포맷에 쓸 수 있게 되었고, OS X의 기능들과 평행하도록 많은 부분이 수정되었습니다.

씬킷(SceneKit)의 새로운 기능

SCNViewSCNScreenRenderer 클래스를 이용한 메탈 렌더링이 가능해졌습니다. SCNAudioPlayerSCNNode 클래스를 통해 지향성 오디오를 지원합니다. 또한, 아래와 같이 Xcode 상에서 씬을 편집할 수 있는 새로운 에디터가 추가되었습니다. (SceneKit Framework Reference 참조)

scene_editor

스프라이트킷(SpriteKit)의 새로운 기능

씬킷과 마찬가지로 메탈 렌더링 지원이 추가되었습니다. 메탈을 지원하는 기기에서는 OpenGL ES 쉐이더를 사용해도 알아서 메탈 렌더링이 제공됩니다. Xcode에서 씬 에디터가 개선되었고 액션 에디터가 추가 되었습니다. 스크롤링 게임을 쉽게 만들 수 있도록 카메라 노드가 개선되었습니다. 씬킷과 마찬가지로 지향성 오디오를 지원합니다. (SpriteKit Framework Reference 참조)


앱 씨닝(App Thinning)

애플이 지원하는 기기와 해상도가 점점 늘고 있고, 이에 따라 앱의 용량도 점점 늘어나게 되었습니다. 이를 위한 장기적인 해법으로 앱 씨닝을 도입하였습니다. 기기의 CPU 종류와 디스플레이 해상도에 따라 꼭 필요한 코드와 이미지만 다운받게 함으로써 약 40% 정도의 공간절약 효과가 있다고 합니다.

app_thinning

다음과 같이 세 가지 기술이 적용되어 있습니다.

슬라이싱(Slicing)

어셋 카탈로그(Asset Catalog)에서 관리하고 있는 이미지들은 자동으로 적용이 되고, 기기 해상도에 맞는 이미지들만 앱 다운로드에 포함되게 됩니다. 아래는 64비트 CPU에서 @2x 레티나 이미지 및 고해상도 텍스쳐로 이루어진 앱의 경우를 나타낸 그림입니다. 사용되지 않는 리소스는 앱을 다운받을 때 용량에서 제외됩니다.

app_thinning_example

온디맨드 리소스(On-Demand Resources, ODR)

앱에서 사용하는 데이터의 일부를 추후에 다운받을 수 있게 해주는 기능입니다. 앱에서 데이터가 필요한 시점에 백그라운드로 다운로드가 이루어지며, 기기에 공간이 부족하면 사용하지 않는 데이터를 우선으로 자동 삭제해준다고 합니다. 아래와 같이 게임이 여러 레벨로 구성된 경우 레벨별로 필요한 시점이 다르기 때문에 나중에 다운받는 영역을 지정할 수 있게 됩니다.

on_demand

아래는 온디맨드 리소스(ODR)를 사용했을 때와 그렇지 않을때의 용량 비교입니다. ODR을 사용하면 최초로 받을 수 있는 앱의 크기는 2기가로 오히려 줄어드는 것 같지만, 추가 리소스를 계속 로드할 수 있기 때문에 전체적으로는 4기가보다 큰 앱을 만들 수 있게 됩니다.

odr_size

비트코드(Bitcode)

앱스토어에 올릴 때 최종 컴파일 결과물을 올리는 것이 아니고 중간코드를 올리는 방식으로 변경할 수 있습니다. 차후에 새로운 CPU가 등장해도 앱스토어에서 이에 맞는 앱을 생성할 수 있게 됩니다. iOS 9 새 프로젝트에서 기본으로 선택되어 있고, watchOS 2 앱은 필수로 지원해야 합니다.

bit_code


RTL 언어지원

중동 지방에서 많이 쓰는 RTL(Right to Left) 언어 지원이 대폭적으로 강화되었습니다. 즉 히브리어와 아랍어를 주 언어로 지정하면 화면의 모든 UI 요소가 아래와 같이 좌/우 바뀌어 표시되게 됩니다. 관련 세션에 나온 엔지니어에 의하면, 해당 지역 사용자들에게는 정말 자연스럽고 편하다고 합니다. LTR(Left to Right) 언어권에서는 뒤로가기가 왼쪽으로 이동하는데, RTL권에서는 반대로 오른쪽으로 이동하는게 자연스럽다는 것입니다.

rtl_support

홈화면에서는 아이콘들이 오른쪽부터 빈칸을 채워가도록 정렬 됩니다. 아이콘의 알림 갯수는 우상단이 아닌 좌상단에 표시되게 됩니다. 테이블뷰도 좌우가 바뀌어 표시가 되고, 컬렉션뷰도 오른쪽부터 빈칸을 채우게 됩니다.

앱에서도 고려해서 처리해주어야 할 요소들이 있습니다. RTL 언어권에서 뒤집혀야 할 내용과(주로 UI 요소) 그렇지 않아야 할 내용(주로 이미지)를 구분해야 하기 때문입니다. UIViewUIImage 클래스 등이 이를 고려해서 개선되었습니다. 자세한 내용은 Supporting Right-to-Left Languages를 참고하세요.


앱 트랜스포트(App Transport) 보안

앱의 Info.plist 파일에서 보안 전송 필요한 부분을 정의할 수 있게 되었습니다. 앱을 새로 개발한다면 전송부분을 모두 HTTPS 사용하는 것을 권장하고, 기존 앱이 있다고 해도 최대한 HTTPS 적용하는 것을 권장합니다. 이와 관련해서 NSURLSession 클래스가 크게 변경되었습니다.


익스텐션 포인트(Extension Points)

iOS 8에서 추가되었던 익스텐션에서 한 발짝 나아가 익스텐션 포인트라는 것이 추가되었습니다. 지원하는 목록은 다음과 같습니다.

  • 네트워크 익스텐션 포인트
    • Packet Tunnel Provider extension
    • App Proxy Provider extension
    • Filter Data Provider, Filter Control Provider
  • Safari 익스텐션 포인트
    • Safari의 공유 링크 관련 익스텐션 (Shared Links extension)
    • 광고 블럭을 위한(!) 컨텐츠 블러킹 익스텐션(Content Blocking extension)
  • 스팟라이트 익스텐션 포인트
    • 검색 데이터 저장을 위한 인덱싱 익스텐션(Indenxing extension)
    • 재인덱싱을 위한 인덱스 유지보수 익스텐션(Index Maintenance extension)
  • 오디오 유닛(Autio Unit) 익스텐션: 음악 프로그램에서 사용되는 가상악기, 이펙터 등을 플러그인의 형식으로 사용할 수 있게 되었습니다. 이로인해 음악 관련 프로그램들이 눈부시게 발전하는 계기가 되지 않을까 생각됩니다.

자세한 사항은 App Extension Programming Guide을 참고하세요.


새로운 주소록 API

아이폰 SDK 초기부터 있었던 Address Book / Address Book UI 프레임워크를 대신하여 새로운 주소록(Contacts) API가 도입되었습니다. (Contacts Framework Reference, ContactsUI Framework Reference 참조)


워치 커넥티비티(Watch Connectivity)

iOS와 Watch 앱간의 데이터를 양방향으로 주고받는데 사용되는 프레임워크입니다. 이렇게 데이터를 주고 받을 때 두 앱이 모두 실행중이면 바로 메시지를 보낼 수도 있고, 받을 앱이 실행중이지 않으면 백그라운드로 전송을 해준다고 합니다. (Watch Connectivity Framework Reference 참조)


키체인(Keychain)

키체인을 통해 기기간의 암호를 공유할 때 다음과 같은 개선사항이 적용되었습니다.

  • 터치 아이디와 암호입력에 따른 고유 데이터 지정 가능
  • 지문 데이터가 지워지면 따라서 지워지는 데이터 지정 가능
  • 앱 비밀번호 옵션을 통한 접근 가능

기타 프레임워크

AV Foundation 프레임워크

AVSpeechSynthesisVoice API가 언어기반이 아닌 식별자 기반으로 음성을 선택하도록 변경되었습니다.

AVKit 프레임워크

PIP 지원을 위해 AVPictureInPictureController가 추가되었습니다.

CloudKit 프레임워크

클라우드킷(CloudKit)을 웹 서비스로서 사용하기 위한 자바스크립트 기반 CloudKit JS 라이브러리가 추가되었습니다. Apple ID 인증 기반이고, 클라우드킷만 이용해서 iOS + 웹 앱까지는 따로 서버를 구현하지 않고도 서비스를 올일 수 있게 되었습니다. 사용자 수에 따라 무료제공 티어(Tier)가 있고, 이를 초과할 경우 과금이 이루어집니다.

cloudkit_price

Foundation 프레임워크

온디맨드 로딩을 위해서 NSBundle 클래스 등이 수정되었습니다.

HealthKit 프레임워크

헬스킷에서 측정 가능한 데이터에 UV 노출과 같은 항목이 추가 되었습니다.

Local Authentication 프레임워크

지문이 닿은 상태를 앱에서 감지 가능하도록 변경되었고, 지문입력을 프로그래밍적으로 취소할 수 있게 된 것 등의 개선이 이루어졌습니다.

Core Location 프레임워크

일회성으로 현재위치를 가져오는 과정이 대폭 간소화되었습니다.

MapKit 프레임워크

대중교통 도착시간을 가져올 수 있게 되었고, 3D 플라이오버 뷰를 사용할 수 있게 되었습니다. 어노테이션(annotations)을 사용자화 할 수 있는 폭이 늘어났고 검색결과에 타임존 정보를 포함 할 수 있게 되었습니다.

PassKit 프레임워크

앱에서 애플페이에 직접 카드를 추가할 수 있는 등 애플 페이와 관련한 사항들이 변경되었습니다.

Safari Services 프레임워크

SFSafariViewController가 추가되어 Safari와 쿠키, 데이터를 공유한 웹뷰를 앱에서 사용할 수 있게 해줍니다. 따라서 Safari 자동완성도 사용할 수 있게 되었습니다. WKWebViewUIWebView를 통해 웹 컨텐츠를 보여주고 있었다면 전환을 고려해봅직합니다.

UIKit 프레임워크

다양한 화면 크기에 최적화된 레이아웃을 구현하는데 도움을 주는 기능들이 대폭 추가되었습니다. UIStackView는 아래와 같은 스택구조의 레이아웃을 편하게 구현하게 해줍니다.

stack_view

UIView에 새로운 앵커(anchor)가 추가되었습니다. 또한 아래와 같이 화면 크기에 따라 본문 텍스트가 좌/우 마진을 얼마나 가져야 하는지를 알아서 계산해주는 레이아웃 가이드도 추가되었습니다.

layout_guide

그 외에도 iOS 9에 도입된 멀티태스킹이나 앱간 링크를 위해서 다양한 부분이 변경되었습니다. 또 Blur 효과의 양을 애니메이션 줄 수 있는 방법이 생겼습니다. 알림이 표시될 바로 답장을 할 수 있는 것과 관련된 API도 공개되었습니다.


마치며

watchOS 2부터 드디어 네이티브 앱을 애플워치에서 실행할 수 있게 되었습니다. 또한 Swift가 2.0으로 버전업 되었습니다. 오픈소스화 계획을 발표하기도 했습니다. 이와 관련된 내용은 이후 포스팅에서 다루도록 하겠습니다.

관련링크

comments powered by Disqus