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

10번째 버전의 iOS가 발표되었습니다. 작년에 이어 올해도 키노트 전반에 느껴지는 흐름은 "공유"와 "개방"이였습니다. 사용자가 피부로 느낄 수 있는 전반적인 변경사항에 대해서는 이미 정리가 잘 된 글들이 많이 있기 때문에 다음 링크를 참조하시면 좋을 것 같습니다.

이번 포스팅에서는 WWDC16에서 공개된 iOS 10의 바뀐 부분을 개발자 입장에서 정리해보도록 하겠습니다. Apple 개발자 문서인 What's New in iOS를 참고하여 작성되었습니다.


SiriKit

Siri Example

드디어 서드파티 앱들이 Siri를 이용한 앱을 개발할 수 있게 되었습니다. 다만 iOS 10에서는 다음과 같은 종류의 앱들만이 Siri API를 사용할 수 있습니다. 아마 익스텐션(extension)과 마찬가지로 iOS 버전이 올라가면서 다른 종류도 차차 추가되지 않을까 싶습니다.

  • 음성/영상 전화
  • 메시징
  • 금액 주고 받기
  • 사진 검색
  • 예약
  • 운동 관리

몇 년 전 부터 Siri API가 오픈된다는 루머가 있었는데 개인적으로 "음성 입력을 실제로 어떤 형태로 앱에서 인식해서 처리를 하는가"하는 부분이 무척 궁금했었는데요, 이번 발표로 이에 대한 궁금증을 어느 정도 해결 할 수 있었습니다.

Siri Parse

그것은 바로 입력된 음성에 대해 "의도(intent)"를 파악하는 것이였습니다. 위의 경우를 보면 입력한 문장에 대해 범주는 Payment이고, 의도는 sendPayment이며, 금액은 85 달러, 받는 사람은 Buttercup이라고 파악한 것을 알 수 있습니다. 이렇게 "의도(intent)"를 파악하고 난 후에는 "동작(action)"을 실행하고 "결과(response)"를 보여주게 됩니다.

Siri Dev

SiriKit을 사용할 때 개발자가 신경 써 줘야 할 부분은 크게 세 가지가 있습니다. 첫째는 앱에서 사용되는 단어(vocabulary)을 지정해주는 것이고, 둘째는 실행 코드(app logic)를 구현하는 것이며, 셋째는 사용자에게 보여줄 UI를 구성하는 것입니다. 더 자세한 내용은 세션 217, "Introducing SiriKit"에서 설명하고 있습니다.


Proactive Suggestions

프로액티브(proactive)는 사용자에게 특정 앱이 필요한 순간을 미리 파악해서 제안하는 기능입니다. iOS 9에서 도입된 앱 검색(app search)을 적용했다면, 스팟라이트나 Safari 검색 결과, 핸드오프(Handoff), Siri 제안에 등에 앱을 노출시킬 수 있었습니다. iOS 10에서는 사용자가 앱에서 어떤 동작을 하는지에 대한 정보를 제공하여 퀵타입(QuickType) 제안이나 지도, 카플레이, 앱 전환기(app switcher), Siri 대화, 잠금화면(음악, 비디오 앱의 경우) 등에 앱을 추가적으로 노출시킬 수 있게 되었습니다.

Proactive

NSUserActivity 클래스의 mapItem 속성을 통해 다른 상황에서도 사용될 수 있는 위치 정보를 제공할 수 있습니다. 호텔 리뷰정보를 보여주는 앱의 경우 사용자가 다른 앱을 사용할 때 그 호텔의 위치정보를 사용하게 할 수 있습니다.

Recent location

앱에서 특정 장소를 공유할 때에는 주소 외에도 latitudelongitude 값, namedLocation, phoneNumbers 값 등을 함께 전달할 수 있습니다. 이럴 경우 공유된 장소의 이름이나 연락처 정보로 Siri에서 전화를 거는 등의 활용이 가능합니다.

iOS 9에서는 웹사이트에서 특정 마크업을 추가하면 스팟라이트나 Safari에서 검색할 수 있었습니다. 이와 더불어 iOS 10에서는 Schema.org에서 정의하고 있는 PostalAddress를 통해, 웹사이트에서 보고 있던 장소를 지도 앱으로 넘어가서도 동일하게 바로 보여지도록 구현 가능합니다.

UIKit에서 추가된 textContentType 속성을 통해서 사용자가 입력하는 텍스트의 종류에 대해 지정할 수 있게 되었습니다. 지정된 경우 상황에 맞는 종류의 키보드가 보여지게 되고, 오타 수정도 상황에 맞게 최적화 됩니다. UITextContentTypeFullStreetAddress을 사용하여 텍스트의 종류가 주소라고 지정을 하며 키보드 입력 제안 항목에 사용자가 현재 있는 위치의 주소가 표시될 것입니다.

MPPlayableContentManager API를 사용하여 잠금화면에서 사용자가 앨범아트를 보거나 재생할 수 있게 할 수 있습니다.

라이딩 쉐어링 앱에서 MKDirectionsRequest API를 사용하는 경우 사용자가 필요하다고 판단되는 순간 앱 전환화면에 표시해줍니다. 해당 기능을 사용하는 경우 Info.plist 파일에 특정 키를 추가해야 합니다. 앱에서 라이딩 쉐어링만 지원하는지, 다른 형태의 길찾기 정보를 같이 제공하는지에 따라 지도 앱에서 표시되는 문구가 다르게 표시됩니다.


메시지 앱 익스텐션(extension)

이번 iOS 10에서 크게 바뀐 앱 중 하나가 메시지 앱입니다. 각종 메시지 효과와 다양한 기능들이 추가되었으며 무엇보다 서드파티 앱들을 만들 수 있게 되었는데요, 페이스북의 메시지 앱 플랫폼에 대항하기 위한 것이라고 생각되어집니다. 복잡도에 따라 다음과 같이 두 가지 종류의 앱이 있습니다.

스티커 앱
정적인 이미지 파일을 포함한 스티커 팩 앱을 만들 수 있습니다. 코드 한 줄 건드릴 필요 없이 이미지 파일들을 드래그 앤 드랍 하는 것 만으로도 앱을 만들 수 있습니다.

Sticker app example

iMessage 앱
커스텀 UI를 통해 텍스트, 이미지, 미디어 파일을 대화 안에서 생성하고, 보내고, 업데이트 할 수 있습니다. 이를 위해서는 Messages 프레임워크를 사용해야 합니다.

Message custom app example


User Notifications

새로 추가된 User Notifications 프레임워크를 통해 기존에 따로 관리되었던 로컬 알림과 원격 알림을 모두 관리할 수 있게 되었습니다. 플랫폼 간의 사용 용법이 통일화 되었고 페이로드(payload)를 디코드하여 이미지를 표시하거나 종단간(end-to-end) 암호화를 지원할 수 있게 되었습니다.

또 새롭게 추가된 Notifications UI 프레임워크를 통해 알림 UI의 모양을 커스터마이징 할 수 있게 되었습니다.

Notifications


음성 인식

iOS 10에서는 연속적으로 음성 인식을 할 수있는 API가 추가되어, 녹음되거나 실시간으로 재생되는 음성을 인식하고 텍스트로 변환할 수 있게 되었습니다. 다음과 같이 몇 줄의 코드만으로 연속 음성인식 기능을 구현할 수 있습니다.

let recognizer = SFSpeechRecognizer()  
let request = SFSpeechURLRecognitionRequest(url: audioFileURL)  
recognizer?.recognitionTask(with: request, resultHandler: { (result, error) in  
     print (result?.bestTranscription.formattedString)
})

음성 인식을 하기 위해서는 다른 민감한 정보에 접근할 때와 마찬가지로 사용자의 동의를 얻어야 합니다. 이는 음성인식의 정확도를 높이기 위해 사용자의 음성 정보가 애플 서버에 임시적으로 저장되기 때문입니다. 사용자의 동의를 얻기 위해 Info.plist 파일에 NSSpeechRecognitionUsageDescription 키를 추가해야 합니다. 또한, 앱에서 음성 인식이 이루어지고 있는 동안에는 사용자가 이를 알 수 있도록 적절하게 표시해야 합니다.


넓어진 색영역

Wide Color

아이패드 프로 디스플레이는 기존 sRGB 보다 더 넓어진 확장된 sRGB(extended sRGB) 색영역을 표현할 수 있습니다. 이를 지원하기 위해 Core Graphics, Core Image, Metal, AVFoundation 프레임워크 들이 내부적으로 변경되었으며 개발시 다음과 같은 사항을 고려해야 합니다.

  • UIColor 클래스에서는 더 이상 값들을 0과 1사의 값으로 한정하지 않게 되었습니다. 기존 앱에서 값들을 제한하고 있었다면 iOS 10에서 동작할 때에는 제한하지 않도록 변경해야 합니다.
  • UIView에서 커스텀 드로잉을 할 때 드로잉 환경은 확장된 sRGB 색영역에서 이루어져야 합니다.
  • 커스텀 이미지를 렌더링할 경우에는 새롭게 추가된 UIGraphicsImageRenderer 클래스를 사용해야 합니다.
  • Core Graphics이나 Metal을 사용해서 이미지 프로세싱을 하는 경우 16비트 플로팅 포인트를 지원하는 색영역을 사용해야 합니다.
  • Core Graphics, Core Image, Metal Performance Shaders는 색영역을 손쉽게 바꿀 수 있는 옵션을 제공합니다.

트루톤 디스플레이 지원
아이패드 프로 9.7인치에서 추가된 트루톤 디스플레이는 다양한 빛 환경에서 최적화된 색상으로 화면을 보여주게 됩니다. Info.plist 파일의 UIWhitePointAdaptivityStyle 키 값을 다음과 같이 적절하게 설정할 수 있습니다.

  • 사진관리 앱의 경우 UIWhitePointAdaptivityStylePhoto로 지정하여 영향을 덜 받게 할 수 있습니다.
  • 텍스트를 많이 포함한 앱의 경우 UIWhitePointAdaptivityStyleReading로 지정하여 시스템에 의해 영향받는 트루톤 값의 차이를 더 크게 할 수 있습니다.

앱 검색 개선

iOS 10에서 Core Spotlight 프레임워크를 통해 이루어진 개선사항은 다음과 같습니다.

앱내 검색
CSSearchQuery 클래스를 통해 따로 인덱싱하거나 검색 알고리즘을 구현할 필요 없이 스팟라이트의 강력한 검색기능을 앱 안에서도 사용할 수 있게 되었습니다.

이어서 검색하기(Search continuation)
사용자가 스팟라이트에서 시작한 검색을 앱에서 계속 이어서 검색할 수 있게 할 수 있게 되었습니다. 이 기능을 활성화 하려면 Info.plist 파일에 CoreSpotlightContinuation 키에 YES 값을 추가해야 합니다.

크라우드소싱을 이용한 딥 링크 인기도 (Crowdsourcing deep link popularity with differential privacy)
스팟라이트에서 검색되는 순위를 높이기 위해 앱 안에서 사용되는 딥 링크가 얼마나 인기있는지를 애플 서버에 저장할 수 있습니다. 이 때 사용되는 기술은 differential privacy라는 방법인데요, 간략하게 설명하면 개개인의 사용자의 데이터는 알 수 없게 하면서도 데이터가 많이 쌓였을 때 전체적인 데이터를 얻을 수 있는 방법이라고 할 수 있습니다. 애플이 보안과 관련하여 곳곳에 신경쓰고 있음이 보여지는 대목이라고 보여집니다. 아래 그림은 이를 위해 사용되는 공식이라고 하네요.

Differential Privacy를 구하는 공식!

유효성 검사의 시각화
App Search API Validation tool을 사용하여 웹사이트의 마크업과 딥 링크의 유효성을 검사할 때 결과를 시작적으로 보여주게 되었습니다.

Validation tool


위젯 개선

iOS 10에서 이제 잠금화면에서도 위젯을 볼 수 있게 되었습니다. 위젯의 내용이 어떤 배경에서도 잘 보일 수 있도록 텍스트 색을 widgetPrimaryVibrancyEffect이나 widgetSecondaryVibrancyEffect로 지정할 수 있습니다.

Widget


애플 페이

2016년 가을 기준으로 애플 페이를 지원하는 플랫폼이 다음과 같이 늘어나게 됩니다.

Apple Pay in Fall 2016

눈에 띄는 부분은 이제 웹사이트에서도 애플 페이를 사용할 수 있게 된 것입니다. 사용자는 iOS나 macOS에서 구동되는 Safari로 접속할 때 이용할 수 있으며 개발자는 ApplePay JS 프레임워크를 통해서 구현할 수 있습니다.

이와 더불어 UIKit을 통하지 않고서도 PassKit에 접근할 수 있게 되었습니다. 따라서 다양한 플랫폼에서 단일 코드 베이스로 구현을 할 수 있습니다. 또한 카드 발급사들은 자사의 앱 안에서 해당 카드를 보여줄 수 있게 되었습니다.

애플 페이를 지원하는 국가와 금융 기관이 변경될 때 마다 앱을 다시 컴파일 할 필요 없이 availableNetworks 메소드를 통해 런타임 체크할 수 있습니다. 또한 iTunes Connect에서 새로운 결제 테스트 환경을 지원합니다.


보안 개선

  • Info.plist 파일에서 NSAllowsArbitraryLoadsInWebContent 키를 통해 ATS 보호를 하면서도 웹 컨텐츠를 모두 불러올 수 있게 설정할 수 있습니다.
  • Common Data Security Architecture (CDSA) API가 제거되고 새로운 SecKey API가 추가되었습니다.
  • Secure Transports API 관련 변경사항이 있습니다.
  • UIPasteboard 클래스에서 기기간의 복사 데이터이터가 공유되는데, 저장되는 종류와 만료 시점을 정할 수 있습니다.
  • 사용자의 데이터에 접근하기 위해 사용 용도를 밝혀야 하는 항목이 추가되었습니다. 예를 들어 Calendar 데이터에 접근하려면 Info.plist 파일에 NSCalendarsUsageDescription 키를 추가하여 사용 목적을 명시해야 하며 그렇지 않을 경우 데이터 접근시 앱이 튕기게 됩니다.

CallKit

이제 카톡 음성통화도 일반 전화가 오는 것과 동일한 화면에 표시 할 수 있게 됩니다. CallKit 프레임워크를 통해 접근이 가능하며, VoIP 앱을 이용한 기록이 네이티브 전화 앱의 즐겨찾기와 최근 사용 목록에 표시할 수 있게 됩니다. 또한 익스텐션(extension)을 통해 전화 방해(blocking) 관리나 전화를 건 사람에 대한 정보 표시가 가능합니다.

CallKit


뉴스 퍼블리셔 개선

뉴스 퍼블리셔(News Publisher)를 통해 아름답게 디자인된 뉴스, 잡지, 웹 컨텐츠 등을 Apple News에 게시할 수 있게 되었습니다. 메이저 언론사부터 시작해서 개인 출판자나 블로거들도 누구나 가입할 수 있습니다. (https://newsresources.apple.com 참고)


Video Subscriber Account

iOS 10에서 추가된 Video Subscriber Account를 통해 케이블 사업자나 위성 사업자에 구독중인 계정을 인증하고 이를 통해 앱에서 권한을 조절할 수 있게 되었습니다. 이를 통해 Apple TV에서도 각 채널별로 회원가입하고 로그인하고 엄청 복잡하게 진행되던 것이 한방에 SSO(Single Sign-on)으로 해결 할 수 있게 되었습니다.


앱 익스텐션(App Extensions)

iOS 10에서 추가된 앱 익스텐션은 다음과 같습니다.

  • Call Directory
  • Intents
  • Intents UI
  • Messages
  • Notification Content
  • Notification Service
  • Sticker Pack

이와 더불어 키보드 익스텐션에서 개선된 사항으로는, 문서에 따라 적절한 언어를 선택할 수 있게 된 점과 handleInputModeListFromView:withEvent:를 통해 시스템에서 사용되던 언어변경 버튼을 표시할 수 있게 된 점입니다.


기타 프레임워크 변경사항

프레임워크별로 변경된 사항들에 대해 간략히 정리해 보면 다음과 같습니다.

AVFoundation
AVCaptureStillImageOutput이 제거되고 AVCapturePhotoOutput 클래스가 추가되었습니다. 이를 통해 라이브 포토나 RAW 이미지도 접근이 가능합니다. 하드웨어가 지원할 경우 wide-gaumt 색상 포맷으로 이미지 캡쳐도 가능합니다.

동영상 파일과 HLS에 따라 별도로 AVPlayerItem을 구현해야 할 필요가 없어졌고, AVPlayerLooper 클래스를 통해 특정 부분의 반복재생이 간편해졌습니다. AVAssetDownloadURLSessionAVAssetDownloadURLSession 클래스를 통해 HLS 스트림을 다운받고 나중에 재생할 수 있게 되었습니다.

AVKit
AVAssetDownloadURLSession 속성을 통해 Now Playing Info Center를 업데이트 할 수 있습니다.

Core Data
Xcode와 연계가 강화되어 모델을 변경함에 따라 NSManagedObject 서브클래스가 자동으로 업데이트 되게 되었습니다. 또한 NSPersistentStoreCoordinator, NSManagedObjectContext, NSPersistentContainer, NSManagedObject, NSFetchRequest 관련 변경사항이 있습니다. 자세한 사항은 Core Data Framework Reference를 참고하실 수 있습니다.

Core Image
A8, A9 CPU를 사용하는 기기에서 RAW 이미지 파일을 지원하게 되었습니다. DSLR에서 찍은 사진이나 지원하는 iOS 기기에서 찍은 사진을 디코드하여 프로세스하고 결과물로 만들 수 있습니다. UIImage의 디코딩 성능이 크게 개선되었고, UIImageView에서 확장된 sRGB 이미지를 표시할 수 있게 되었습니다. 그 외에도 필터와 색 영역 관련 변경사항이 있습니다.

Core Motion
만보계(pedometer) 이벤트를 수신할 수 있게 되었습니다. 이는 사용자가 운동을 중단하고 재개하는 이벤트를 실시간으로 받을 수 있게 된 것을 의미합니다. 지원하는 기기에 한해서 CMPedometer API를 통해 백그라운드에서도 이벤트를 받을 수 있습니다.

Foundation
NSDateInterval에 기간과 관련된 함수들이 대거 추가되었습니다. NSMeasurement에는 값을 다른 단위로 변활할 때 유용한 함수들이 추가되었고 NSMeasurementFormatter를 통해 값을 현지 표기에 맞게 보여줄 수 있습니다. NSUnit를 사용하여 쉽게 단위 표기를 할 수 있습니다.

GameKit
게임센터 앱이 사라짐에 따라 앱 안에서 점수판 등의 필요한 화면을 보여주는 기능이 추가되어야 합니다. 또한 GKCloudPlayer로 구현된 iCloud 전용 계정 종류가 추가되었습니다. GKGameSession을 통해 세이브 데이터 관리, 턴제 실시간 게임을 쉽게 구현할 수 있게 되었습니다.

GameplayKit
게임 맵(Game World)에 관련된 사항들, AI와 관련된 사항들이 개선되었습니다.

HealthKit
HKCDADocument에서 CDA 문서와 관련된 내용을 접근할 수 있게 되었고, HKWorkoutConfiguration를 통해 운동의 종류와 장소를 지정할 수 있게 되었습니다. 휠체어 이용자를 위한 HKWheelchairUseObject가 추가되었고 관련 속성들이 추가되었습니다.

HomeKit
iOS 10부터 아이패드를 통해 홈 악세서리를 컨트롤 하고 자동화 할 수 있습니다. 카메라와 초인종 액세서리에 접근할 수 있는 API가 추가되는 등의 다양한 개선사항이 있습니다. 자세한 사항은 HomeKit Framework Reference에서 확인할 수 있습니다.

Metal
테셀레이션(tessellation)을 지원함에 따라 더 복잡한 기하체를 생성할 수 있게 되었고 성능에 최적화된 함수들이 추가되었습니다. Resource Heaps와 Memoryless Render Targets를 통해 메모리 관리를 더 세밀하게 할 수 있게 되었습니다.

ModelIO
USD 파일포맷 지원되고, MDLMaterialPropertyGraph로 모델의 순차적인 변경을 쉽게 할 수 있습니다. 또한 MDLVoxelArray, MDLLightProbeIrradianceDataSource 관련 변경사항이 있습니다.

Photos
라이브 포토의 편집이 가능해졌습니다. 특히 PHLivePhotoEditingContext를 통해 동영상 파트와 정지영상 파트의 편집이 가능해졌습니다.

ReplayKit
게임 플레이 영상을 서드파티 사이트에 실시간으로 방송할 수 있게 되었습니다. 이를 위해서 서드파티들은 해당하는 앱 익스텐션을 구현해야 합니다.

SceneKit
물리 기반 렌더링(PBR)이 생겼고, SCNCamera 클래스에 HDR 기능을 통해 더 현실적인 묘사가 가능해졌습니다.

SpriteKit
다양항 모양의 타일맵을 사용할 수 있게 되었고 Xcode 편집기를 통해 관리가 가능해졌습니다.

WebKit
WKWebView에서 픽(peek), 팝(pop) 액션을 세부적으로 조절할 수 있게 되었습니다.

UIKit

  • 객체지향이고 완전히 인터랙티브한 애니메이션 시스템이 도입되었습니다. 제스쳐에 따라 반응하기도 하고, 중간에 취소도 되며, 중단 지점에서부터 이어서 애니메이션을 줄 수도 있습니다. iOS 10 사진 앱에서 확대된 사진을 쓸어 내렸을 때 컬렉션 뷰로 돌아간는데 적용이 되어 있습니다. UIViewPropertyAnimator 레퍼런스에서 더 자세한 내용을 확인할 수 있습니다.
  • UIPreviewInteraction 클래스와 UIPreviewInteractionDelegate 프로토콜을 통해 세부적인 픽(peek), 팝(pop) 동작을 지정할 수 있습니다.
  • UIPasteboard 클래스에 기기간 공유를 위한API와 옵션이 추가되었습니다.
  • Dynamic Type을 지원하기 위해 UIFont 클래스에 preferredFontForTextStyle:compatibleWithTraitCollection: 메소드가 추가되었습니다.
  • UIContentSizeCategoryAdjusting 프로토콜에 adjustsFontForContentSizeCategory 속성이 추가되어, 기기의 UIContentSizeCategory가 변경될 때 적절한 폰트를 적용할 수 있게 되었습니다.
  • 탭바 아이콘과 뱃지에 커스텀 색상을 지정할 수 있게 되었습니다.
  • UIApplicationopenURL:options:completionHandler: 메소드가 추가되어 비동기적으로 동작하게 되었고, 기존 openURL: 메소드를 대체하게 되었습니다.
  • UICloudSharingController 클래스와 UICloudSharingControllerDelegate 프로토콜을 통해 CloudKit 공유를 쉽게 할 수 있습니다.
  • UICollectionViewUICollectionViewDataSourcePrefetching 프로토콜을 통해 셀들을 미리 로딩할 수 있게 되어 스크롤 버벅임을 줄일 수 있게 되었습니다.

마치며
이제 iOS도 나온지 10년이 되어가고 macOS와 같이 성숙한 플랫폼이 되어감에 따라 눈에 확 띄는 새로운 것 보다는 점진적인 발전의 모습이 더 많이 보이는 것 같습니다. 서두에서도 말씀 드린 것 처럼 올해도 "공유"와 "개방"을 모토로 하여 이전 버전에는 막혀있던 것이 열렸던 부분이 많이 있고 올 가을에는 어떤 앱들이 새로 나올지 기대가 됩니다.

관련 링크

comments powered by Disqus