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

올해 WWDC는 소프트웨어에 집중되었던 작년과는 달리, 다양한 하드웨어가 발표되었습니다. 거의 전체 랩탑 라인업의 업데이트와 아이패드 프로, 아이맥 프로, 그리고 홈팟까지 공개되었습니다. tvOS 11과 watchOS 4는 좀 심심한 감도 있었지만, iOS 11은 어느 해 못지 않게 다양한 변화점을 담고 있습니다.

이 글에서는 WWDC 2017에서 공개된 iOS 11의 바뀐 부분을 개발자 입장에서 정리하였습니다. Apple 개발자 문서인 What's New in iOS를 참고하였고, 특정 토픽은 WWDC 세션 등을 참고하였습니다.


Drag and Drop

드래그 앤 드랍

이번에 아이패드 프로 2세대가 발표되면서, 아이패드를 위한 기능들이 많이 추가되었습니다. 드래그 앤 드랍도 그 중 하나인데요, 아이패드에서는 같은 앱에서, 또한 다른 앱으로 드래그 앤 드랍이 가능하며, 아이폰에서는 앱 내에서만 가능합니다. (베타 3 기준)

예전에 복사해서 붙여넣기(copy and paste) 기능도 뒤늦게 지원했지만 높은 편의성으로 호평을 받았었는데요, 이번 드래그 앤 드랍도 터치 운영체제에서 가장 최적화된 구현이라는 평가를 받고 있습니다.

기존에 테이블뷰(UITableView)나 컬렉션뷰(UICollectionView)를 사용하는 경우 쉽게 적용할 수 있습니다. 특정 뷰(view)가 드래그 시작점인지 끝점인지 지정 가능하고, 드래그 하는 동안 미리보기와 드랍하는 애니메이션을 사용자화 할 수 있습니다.


Files

로컬, iCloud 문서 접근

이번에 추가된 파일(Files) 앱과 더불어, UIDocumentBrowserViewController를 통해서 로컬 문서와 iCloud 문서 접근하는 것이 가능해졌습니다. 브라우저에서 커스텀 액션을 지정할 수 있고, FileProvider, FileProviderUI 프레임워크를 통해 서드파티 클라우드 서비스를 접근할 수 있습니다.


Dynamic Type

향상된 다이나믹 타입(Dynamic Type) 지원

iOS 11에서는 시스템 글꼴이 아닌 사용자 지정 글꼴에 대해서도, 사용자가 설정한 값에 따라 적절한 글자 크기를 결정해주는 UIFontMetrics가 추가되었습니다. PDF 어셋을 벡터로 지정할 수 있게 되어 사용자가 글꼴 크기를 키운 경우 화면에 크게 아이콘을 표시할 수도 있게 되었습니다. 그 외에도 글자 크기에 따라 오토 레이아웃(Auto Layout)을 표현할 수 있도록 레이아웃 규칙(layout constraints) 관련 변경이 있습니다.


앱 비밀번호 자동완성(App Password Autofill)

앱 안에서 아이디, 비밀번호로 로그인할 경우 사파리 키체인(Keychain) 데이터를 이용해서 손쉽게 입력할 수 있게 되었습니다. 아이디, 비밀번호 필드의 경우 머신러닝을 통해서 인식한다고 하는데요, 명시적으로 .username, .password로 컨텐츠 속성을 지정할 수 있습니다. 그리고 운영중인 서버와 유니버셜 링크(Universal Link)를 설정할 때 하는 것과 비슷하게 앱과 서버를 묶어서 설정할 수 있습니다.


ARKit

ARKit

이번 WWDC에서 가장 주목받은 프레임워크입니다. 이미 AR이라는 개념은 2000년대 전후에 한번 휩쓸고 갔기 때문에 큰 관심을 끌지 못하고 있었는데요. ARKit의 경우 추가적인 장비 없이 모션센서와 카메라만으로 쓸만한 성능을 내준다는 점과, 이미 출시된 iOS의 기기의 숫자가 커서 iOS 11 업데이트시 하루아침에 메이저 플랫폼으로 부각될 수 있다는 점 때문에 많은 관심을 받고 있는 것 같습니다.

10주년 아이폰에서는 AR 성능 향상을 위한 레이저 센서가 추가된다는 루머도 있는데, ARKit에 힘을 싣고 있는 중에 그럴듯해 보이기도 합니다. 당장 출시되기는 어렵겠지만 팀쿡이 얼마전 관심있다고 했던 스마트 글래스를 위해서도 필요한 단계이기도 하구요.

ARKit hands on

ARKit이 해주는 것은 크게 보면 카메라 위치 감지와 평면감지입니다. 카메라와 모션센서를 조합해서 현재 보이는 것들에 대해 3D 좌표상에서의 위치를 계산하고, 기기 자신의 위치를 추론합니다. 또한 테이블이나 바닥같은 평평한 곳을 인식할 수 있습니다. 평면인식은 현재 가로로만 가능한데, 추후에 세로 벽이 추가될 확률도 높아 보입니다.

이렇게 얻어진 정보를 가지고 화면에 뿌려주는 것은 SceneKit이나 SpriteKit, 또는 Metal을 이용해야 합니다. 이게 결국 ARKit에서 뭔가 구현하는 것 보다 3D/2D 컨텐츠를 어떻게 보여주는지가 더 중요해질 가능성이 농후해 보입니다. 그래서 그런지 Unity와 Unreal 엔진과 제휴맺었다는 언급도 있었고, Unity의 경우 ARKit 관련 플러그인도 벌써 나온 상태입니다.


메탈(Metal) 2

메탈이 버전 2로 올라감에 따라 내부적으로 많은 개선이 있었고, 메탈 1과 비교했을 때 성능적으로 꽤 향상이 있다고 합니다. 애플 문서에서 많은 부분을 할애해서 설명하고 있는데, 대다수의 개발자들은 메탈 2를 활용한 Unity나 Unreal Engine을 사용하며 혜택을 볼 것으로 보입니다.


Core ML

Core ML

ARKit과 더불어 관심을 많이 받은 프레임워크입니다. 애플의 강점을 살려서, 하드웨어와 소프트웨어의 밀접한 협력을 통해 고성능이면서도 배터리 효율이 좋은 머신러닝 기능을 구현할 수 있다고 합니다. 객체 추적, 얼굴 인식, 언어 인식, 고유명사 인식 등의 많이 사용되는 기능들은 상위 프레임워크인 비전(Vision), NLP(자연어 처리) 프레임워크에 포함되어 있습니다.

머신러닝(ML)은 크게 트레이닝(training) 단계와 추론(inference) 단계로 구성되는데, Core ML은 추론 단계에만 특화되어 있기 때문에 범용적인 머신러닝을 구현하는데에는 적합하지 않아 보입니다. 다만 이미 트레이닝된 데이터가 있다면 이를 손쉽게 프로젝트에 불러올 수 있고, 성능 좋은 함수의 형태로 사용할 수 있기 때문에 간단히 활용하기에는 좋아 보입니다. Core ML을 계기로 머신러닝에 대한 관심이 늘어나고, 잘 트레이닝 데이터가 오픈소스로 공유되는 공간이 늘어나기를 기대해봅니다.


SiriKit

SiriKit

외형적으로는 음성 인식할 때 보여주는 비주얼에 살짝 변경이 있었고, 훨씬 자연스러운 새 목소리가 추가되었습니다. 영어와 중국어, 불어, 이탈리아어, 독일어, 스페인어만 지원하긴 하지만 시리를 통해 단문 번역도 할 수 있게 되었습니다.

SiriKit domains

작년에 처음 도입되어 한정적인 도메인만 지원했는데, 올해는 많은 분들의 예상대로 지원하는 도메인이 늘어났습니다. 회원카드 등을 보여줄 수 있는 "비주얼 코드(visual code 도메인", 할일 앱이나 노트 앱 컨텐츠를 이용할 수 있는 "노트, 할일(notes and to-do lists) 도메인", 택시 등을 예약할 수 있는 "라이드 부킹(ride booking) 도메인", 계좌 이체나 계좌 검색 등을 위한 "페이먼츠(payments) 도메인"이 추가되었습니다.


Multiple TCP

iOS 9에서서는 와이파이 어시스트(Wi-Fi Assist) 기능이 있어서 와이파이 망이 느릴 때 셀룰러 망에 접속할 수 있게 했었는데요, 이게 좀더 발전된 형태가 Multiple TCP입니다. 애플 내부적으로는 시리(Siri)가 다양한 네트워크 환경에서 응답하는 속도를 빠르게 하기 위해서 개발했다고 합니다. 가령 집에서 와이파이 망을 사용하고 있다가, 집 밖을 나가서 걷는 도중에 시리를 호출하게 되면, 기존에는 와이파이에 접속되어 있고 신호가 약하기 때문에 사용자가 무작정 기다려야 하는 상황이 발생했는데요. Multiple TCP를 사용하면 와이파이라도 신호가 약할 경우 셀룰러로 요청을 매끄럽게 돌려서 바로 결과를 받을 수 있게 할 수 있습니다.

Multiple TCP를 지원하기 위해서는 서버 커널에서 지원을 해야 하고, 또한 앱에서도 URLSessionConfiguration 속성을 지정해야 합니다. 자세한 것은 "Advances in Networking" 세션에서 참고하실 수 있습니다.


Apply Pay

Apple Pay

메시지 앱을 통한 개인 간의 송금 기능이 추가되었고, 이에 따라 "애플 페이 캐쉬"도 추가되었습니다. 국내에도 도입이 된다 안된다 말이 많았었는데요, 일단 올해에도 별다른 소식은 없어 보입니다.

SDK 측면에서 보면, 애플 페이를 통해 결제를 진행할 때 발생할 수 있는 다양한 상황에 따른 에러메시지를 훨씬 다양하게 받을 수 있게 되었습니다. 주소를 입력했는데 포맷이 다르다던가 하는 "경고"성의 메시지도 받을 수 있게 되었고, 어떻게 변경하면 좋을지 "추천"도 받을 수 있게 되었습니다.


App Store

새로운 앱스토어(App Store) 앱

iOS 11에서 거진 10년동안 크게 바뀌지 않았던 앱스토어가 완전히 새롭게 디자인되었습니다. 이에 따라 앱개발자 입장에서 고려할 것들이 몇 가지 생겼습니다. 먼저, 인앱 결제를 프로모션 할 수 있게 되었습니다. 애플이 예전에도 인앱결제가 있는 앱들을 표시하는 방법을 "Free"에서 "Get"으로 변경했었는데요, 이번 변경에 따라 더더욱 무료 앱이면서 인앱결제가 주 수익원인 앱의 경우 무료가 아닌 느낌을 주려고 하는 것 같습니다.

필 쉴러가 공식적으로 앱 리뷰 속도가 개선된 것을 언급하기도 했습니다. 최근에는 24시간 안에 리뷰가 끝나는 경우도 있으니깐, 예전에 7-10일 걸리던 것에 비하면 정말 빨라진 것 같습니다. 동시에 여러 개의 버전을 TestFlight에서 테스트할 수 있게되었고, 새로운 버전을 출시할 때 7일의 간격 안에서 순차적으로 릴리즈(phased release)할 수 있도록 하는 기능도 생겼습니다.


Messages

메시지(Messages)

메시지 앱에서 앱들을 보여지는 방법이 개선되었습니다. 또한 Messages in iCloud로 인해서 모든 대화가 iCloud에 저장되고 동기화 된다고 합니다. (기존에도 거의 동기화 된다고 느낄만큼 비슷했었는데요, 이제는 아예 메시지 원본이 서버에 보관되는 듯 합니다)

라이브 메시지(live messages)가 새로 추가되었습니다. 게임과 같은 동적인 컨텐츠를 메시지 앱으로 보낼 수 있게 됩니다. 라이브 메시지는 각각 MSMessagesAppViewController를 가질 수 있고, 한 화면에 여러 개의 라이브 메시지를 보이게 할 수도 있습니다.


홈킷(HomeKit)

이번 WWDC 발표를 뜨겁게 달구었던 새로운 하드웨어인 홈팟(HomePod)의 발표와 함께, 많은 부분들이 개선되기를 바랬지만 생각만큼 눈에 띄는 변화는 적어보였습니다. 좋은 성능의 스피커, 똑똑한 음성인식 및 AI, 그리고 홈킷 허브 기능을 담당하는 기기를 기대했었는데, 발표된 것만으로 봐서는 꽤 성능 좋아보이는 스피커에 그칠 것 같다는 느낌이 듭니다. 자세한건 가을까지 기다려봐야 알겠지만요.

SDK 측면에서는, 각종 트리거(trigger) 관련하여 개선이 있었습니다. HMSignificantTimeEvent의 경우 일출, 일몰로부터의 시간을 지정할 수 있게 되었고 HMCalendarEvent로 날짜를 지정, HMDurationEvent로 소요시간을 지정할 수 있게 되었습니다. 그 외에도 온도 등이 일정 범위에 있는지 여부, 사용자가 부재한지 여부 등의 트리거가 추가되었고, 복수의 트리거를 묶은 트리거도 추가되었습니다.


맵킷(MapKit)

올해는 층별로 실내지도가 추가되었고, 네비게이션 모드시에 속도제한 표시 및 차선 표시가 추가되었습니다. (올레!) 아직 국내에서는 성능이 딸리지만, 미국에서는 캘린더 등과 연동되고 군더더기 없이 깔끔하게 표시되어서 꽤 쓸만한데요, 그래도 데이터 정확도는 구글맵을 따라잡으려면 갈길이 멀어 보입니다.

개발자 입장에서는, 맵 위에 보여주는 데이터를 부각시키기 위해서 맵 자체를 흐리게 보여주는 mutedStandard 모드가 추가 된 것과, 어노테이션(annotation)이 겹칠 때 어떻게 동작할 수 있는지 지정할 수 있게 된 것이 눈에 띕니다.


Camera

카메라, 사진

아이폰 7 플러스에서 두 개의 렌즈를 통해 포트레이트(portrait) 모드의 사진을 찍을 수 있었는데요, 이 때 저장된 깊이(depth) 정보를 활용할 수 있게 되었습니다. 예시로 보여준 앱은 예를 들어 피사체를 제외한 배경을 다른 배경으로 바꿔주는 앱이였습니다. 개인적으로 이 API를 통해 어떤 앱들이 나올지 기대가 됩니다.

이미지, 비디오를 효율적으로 저장하기 위한 코덱도 추가되었습니다. h.265 기반의 고성능 압축을 이용한다고 하고, 비디오 코덱은 HEVC(Hight Efficiency Video Coding), 이미지 코덱은 HIEF(High Efficiency Image Format, |히프|)입니다. 특히 라이브 포토는 HIEF 컨테이너가 가진 특성을 잘 활용해서 저장 공간을 획기적으로 아껴준다고 합니다.

이와 더불어 라이브 포토를 접근하고 수정하는 방법이 대폭 추가되었습니다. 루프, 바운스, 롱 익스포져 등의 다양한 효과가 추가되었습니다.


AirPlay 2

AirPlay 2

홈팟(HomePod)을 대비해서 나온 것 같습니다. 여러 기기에서 동시 재생을 지원하며, 음악, 팟캐스트 등의 롱폼 오디오(long-form audio) 재생시 알람이나 전화 통화가 재생을 방해하지 않게 할 수 있습니다.

AirPlay 2를 지원하려면 AVKit을 통해서 미디어를 재생하는 것이 가장 간단한 방법이고, 로우레벨 API를 통해서 재생하는 경우 고려해야 할 것이 많아 보입니다. 롱폼 오디오(long-form audio) 재생은 AVAudioSessionsetCategory(_:mode:routeSharingPolicy:options:) 메소드에서 AVAudioSessionRouteSharingPolicyLongForm를 지정해서 적용할 수 있습니다.


MusicKit

뮤직킷(MusicKit)

애플 뮤직 카탈로그에 접근할 수 있는 API가 생겼습니다. 서드파티 앱에서 애플 뮤직 구독을 끌어올리기 위해서 노력하는 것 같습니다. Spotify API에서 제공하는 것들이 대부분 가능하다고 보시면 될 것 같습니다. 앱 안에서 애플 뮤직 구독을 바로 할 수 있는데, 이럴 경우 개발자에게 수익을 분배합니다.


시스템

그 외에도 핫스팟 설정을 위한 네트워크 익스텐션이 추가되었고, 코어 블루투스(Core Bluetooth) 프레임워크에서 블루투스 리셋이나 기기 재부팅시 세션 복원기능이 향상되었습니다. 또한 Core NFC 프레임워크에서 NFC 데이터를 읽기가 가능해졌으며 (쓰기는 불가합니다), APFS(Apple File System)이 기본 파일시스템이 되었습니다.


여기까지는 굵직한 항목 위주로 정리한 내용입니다. 기타 자세한 사항은 What's New in iOS 문서의 iOS 11 섹션을 참고하시기 바랍니다.

관련링크

comments powered by Disqus