'iOS11'에 해당하는 글 2건

제목: iOS11: Machine Learning for everyone

WWDC 2017에서 한가지는 확실하게 만들었다. 애플은 기기에서의 기계학습을 확실히 밀고 있다.

그리고 앱 개발자들이 여기에 조인할 수 있도록 가능한 쉽게 만들고 싶어한다.

작년 애플은 기본 컨볼루셔널 신경망(basic convolutional networks)을 위한 Metal CNN and BNNS frameworks를 발표했다. 올해는 Metal, 새로운 컴퓨터 비젼 프레임워크, Core ML의 수많은 수가사항이 있다. 툴킷은 ML 모델을 여러분의 앱에 아주 쉽게 넣을 수 있게 해준다.


이 블로그 포스팅에서는, iOS11와 macOS10.13에서 새로운 기계학습에대한 내 생각(과 내 경험)을 공유하려고 한다.

Core ML
Core ML은 WWDC에서 많은 주목을 받았고, 그 이유는 알기 쉽다. 바로 많은 개발자들이 그들의 앱에 넣으려고 했던 프레임워크이기 때문이다.

이 API는 꽤 간단하다. 당신이 할 수 있는 것은 다음과 같다.
  1. 학습된 모델을 불러오기
  2. 예측 만들기
  3. 개이득!!!
이 말이 제한적으로 보일 수 있지만, 실제로 모델을 불러와서 예측을 하는 것은 보통 여러분의 앱에서 하고 싶었던 모든 것일 수 있다.

예전에는 학습된 모델을 불러오는 것이 굉장히 힘들었다(사실 library to take away some of the pain에대한 글을 썼었다). 그러니 이제 단지 두단계로 간단해져버려 굉장히 행복하다.

모델은 .mlmodel 파일안에 담겨있다. 이것은 새로나온 공개형 파일 포멧(open file format)으로 여러분의 모델, 입력과 출력, 클래스 레이블 그리고 데이터에 일어나는데 필요한 전처리에서 그 레이어를 표현한다. 또한 학습된 모든 파라미터들을 담고있다(가중치와 기저).

모델을 사용하는데 필요한 모든것이 이 한 파일 안에 들어 있는 것이다.

여러분은 간단하게 여러분의 프로젝트에다 이 mlmodel 파일을 떨어뜨리면 Xcode가 자동으로 스위프트(혹은 Objective-C)를 감싸는 클래스로 생성하며, 이런 과정이 모델을 사용하기 굉장히 쉽게 만들어준다.

예를들어, 여러분의 Xcode 프로젝트에 ResNet50.mlmodel 파일을 추가했으면, 이렇게 작성할 수 있겠다.
let model = ResNet50()
모델을 인스턴트화한다. 그리고 아래에는 예측을 한다.
let pixelBuffer: CVPixelBuffer = /* your image */

if let prediction = try? model.prediction(image: pixelBuffer) {
  print(prediction.classLabel)
}
그리고 이게 전부이다. 모델을 불러오거나 스위프트에서 그 결과물을 변환하기위해 다른 코드를 짤 필요가 없다. 이 모든것을 Core ML과 Xcode가 관리해준다. 멋지다!
주의: 화면뒤에서 무슨일이 일어나는지 알고싶으면, Project Navigator에 mlmodel 파일을 선택하여 버튼을 클릭하면 생성된 헬퍼 코드로 파일을 볼 수 있다.
Core ML은 모델을 CPU에서 돌릴지 GPU에서 돌릴지 스스로 결정할 것이다. 그리하여 가용의 리소스 사용을 최적화할 수 있게 해준다. 또한 Core ML은 특정 부분만 GPU에서 동작하고(많은 계산이 많이 필요한 작업) 다른 부분은 CPU(메모리가 많이 필요한 작업)에서 동작하도록 쪼갤 수 있다.

Core ML이 CPU를 사용할 수 있는 능력은 개발자들에게 또다른 큰 이점을 준다. iOS 시뮬레이터에서 돌려볼 수 있다는 점이다(어떤것은 Metal에서 불가능한데, 이것 또한 유닛테스트로 잘 돌아가지 않는다).

Core ML이 지원하는 모델은 무엇인가?
위의 ResNet50 예제는 이미지 분류기이지만, Core ML은 여러 타입의 모델을 다룰 수 있다.
  • support vector machines(SVM)
  • tree ensembles such as forests and boosted trees
  • linear regression and locgistic regression
  • neural networks: feed-forward, convolutional, recurrent
이 모든 것들은 회기(regression)뿐만 아니라 분류(classification)에도 사용될 수 있다. 추가로 여러분의 모델은 one-hot encoding, feature scaling, imputation of missing values등과같은 전형적인 ML 전처리 과정을 담고 있을 수 있다.

애플은 학습시킨 여러 모델을 다운로드 받을 수 있게 해놓았다. Inception v3, ResNet50, VGG16같은 것이 있는데, 파이썬 라이브러리 Core ML Tools로 자신만의 모델을 변환할 수도 있다.

현재 여러분은 Keras, Caffe, scikit-learn, XGBoost, libSVM로 학습한 데이터를 변환할 수 있다. 이 변환 툴은 지원하는 버전에대한 약간의 명세이다. 예를들어 Keras 1.2.2는 동작하지만 2.0은 아닌. 다행인점은 이 도구가 오픈소스여서 미래에는 더 많은 학습 툴킷을 지원할 부분에는 확신할 수 있다.

그리고 다른 모든것이 실패하면 언제나 여러분만의 변환기를 만들 수 있다. mlmodel 파일 포멧은 공개형이고 꽤 직관적으로 사용할 수 있다(photobuf 포멧 내에 있고, 스팩은 애플이 명세해놓음).

한계
Core ML은 모델을 빨리 불러와서 여러분의 앱에서 실행하기에는 훌륭하다. 그러나 이런 간단한 API로는 그 한계를 가지고 있다.
  • 지원하는 모델 타입들은 감독 기계학습(supervised machine learning)이다. 비감독 학습 알고리즘이나 강화 학습은 안된다. (비록 "제네릭" 뉴럴 네트워크 타입을 지원하는데, 이것을 이용할 수는 있을것 같다)
  • 기기에서 학습은 지원하지 않는다. 당신은 오프라인 툴킷을 사용하여 모델을 학습시키고 모델을 Core ML 포멧으로 변환해야한다.
  • Core ML이 특정 레이어 타입을 지원하지 않는다면, 사용할 수 없다. 이 점에서 여러분이 직접 계산한 커널로 Core ML을 확장시키는게 불가능하다. TensorFlow같은 툴들이 질반 목적 컴퓨테이셔널 그래프를 만들기위해 사용되는 곳은, mlmodel 파일 포멧은 유연성과는 좀 멀다.
  • Core ML 변환 툴은 제한된 수의 학습 툴과 명세한 버전만 지원한다. 예를들어 TensorFlow에서 모델을 학습했으면, 이 툴을 사용할 수 없고 여러분의 변환 스크립트를 작성해야할 것이다. 그리고 내가 덫붙이자면, 여러분의 TensorFlow 모델이 mlmodel에서 지원하지 않는 것을 하고 있다면, Core ML에서 모델을 사용할 수 없다.
  • 중간 레이어(intermediate layer)에서 만들어진 아웃풋을 볼 수 없다. 네트워크의 마지막 레이어에서 나온 예측만 볼 수 있다.
  • 100% 확신이 되진 않지만, 모델 업데이트를 다운받는 것이 문제가 있어 보인다. 여러분이 다시 학습시키고 싶은데, 바뀐 모델바다 앱의 새로운 버전을 내고 싶지 않으면 Core ML은 여러분에게 적절하지 않을 것이다.
  • Core ML은 (편의를위해) CPU에서 실행하는지 GPU에서 실행하는지 숨기는데, 이것이 앱을 위해 잘 동작할거라 믿어야만 한다. 당신이 아무리 아무리 원한다고 해도 Core ML에게 강제로 GPU에서 실행하라고 할 수 없다.
당신이 이런 한계들과 공존할 수 있다면, Core ML은 당신에게 맞는 프레임워크이다.

그렇지않거나, 전체를 컨트롤 하고 싶다면, Metal Performance Shaders나 Accelerate 프레임워크로 여러분만의 것을 만들어야할 것이다.
물론 실제 마법이 Core ML에 있진 않지만, 여러분의 모델에 들어있다. 여러분이 시작할때 적절한 모델을 가지고 있지 않다면 Core ML은 소용없을 것이다. 그리고 모델을 설계하고 학습시키는것은 기계학습에서 어려운 부분이다.

간단한 데모 앱
Core ML을 가지고 놀아보려고 간단한 데모를 만들었다. 언제나처럼 깃헙에서 소스를 확인할 수 있다.


이 데모 앱은 고양이 사진을 분류하기위해 MobileNet architecture을 사용했다.

원래 이 모델은 Caffe에서 학습되었다. 이것이 mlmodel 파일로 변환하는데 약간의 노력이 들게 만들었으나, 한번 변환한 모델로 만들고나니 앱에서 빌드하기 굉장히 쉬었다. (변환 스크립트는 깃헙 저장소에 들어있다)

앱은 아직 멋지지 않지만(단순히 정적인 이미지에대해 상위 5가지 예측의 아웃풋을 낸다) Core ML을 어떻게 쉽게 사용했는지 보여준다. 그냥 코드 몇줄만이 필요할 뿐이었다.
주의: 데모앱이 시뮬레이터에서는 잘 동작하지만 기기에서는 크래쉬가 난다. 읽어내려가서 왜 그런지 찾아내보자 ;-)
물론 안에서 무슨일이 일어나는지 알고싶었다. 실제로 mlmodel 파일이 mlmodelc 폴더에 컴파일되었으며 이 폴더는 여러분의 앱 번들 안에 있다. 이 폴더는 여러 다른 파일들, 몇몇 바이너리, 몇몇 JSON들을 가진다. 따라서 여러분의 앱에 실제로 넣기전에 Core ML이 어떻게 mlmodel을 변환하는지 볼 수 있다.

예를들어 MobileNet Caffe 모델은 소위 Batch Normalization 레이어라 불리는 것을 사용하며, 이것들이 변환된 mlmodel 파일안에 들어있다는 것을 확인했다. 그러나 컴파일된 mlmodelc에서는 Batch Normalization 레이어가 보이지 않았다. 이것은 Core ML이 모델을 최적화시켰다는 좋은 소식이다.

mlmodelc는 여전히 스케일링 레이어(scaling layer)를 포함하며 반드시 필요하지 않아 보이므로 좀 더 모델의 구조를 최적화할 수 있을것 같아 보인다.

물론 아직 iOS11 베타1버전이고 Core ML은 아마 더 개선될 것이다. 그 말은, Core ML에 넘겨주기전에 여러분의 모델을 최적화할 필요가 있다는 뜻이다. (“folding” the Batch Normaliza) 그러나 그렇게하면 특정 모델을위해 측정하고 비교해야할 것이다.


여러분의 모델이 CPU에서 실행될때와 GPU에서 실행될때 같은지도 확인해야할 것이다. 내가 언급한것처럼 Core ML은 모델을 CPU에서 돌릴지(Accelerate 프레임워크를 사용하여) GPU에서 돌릴지(Metal을 사용하여) 정한다. 결국 이 두 구현은 다르게 동작할 것이다. 그러니 둘 다 테스트해봐야한다!

예를들어 MobileNet은 "depthwise" 컨볼루션 레이어라 불리는 것을 사용한다. 이 원래 모델은 Caffe에서 학습되었고, 정규 컨볼루션의 groups 프로퍼티와 아웃풋 채널 수를 같게 만들어 depthwise 컨볼루션을 지원한다. 결과로나온 MobileNet.mlmodel 파일은 동일하지 않다. 이것이 iOS 시뮬레이터 안에서는 잘 동작하겠지만 실제 디바이스 위에서는 크래쉬가 난다!

시뮬레이터는 Accelerate 프레임워크를 사용하지만 실제 디바이스는 Metal Performance Shaders를 사용하여 생긴 문제이다. 그리고 Metal이 데이터를 인코딩하는 방법때문에 MPSCNNConvolution 커널은 제한되어 그룹의 수와 아웃풋 채널의 수를 같게 만들 수 없게 되었다. 아이고!

나는 애플에 버그리포팅을 제출했지만 내 요점은 이렇다. 시뮬레이터에서 모델이 잘 동작한다는게 디바이스에서 잘 동작할거라는 의미는 아니다. 테스트를 해보아라!

얼마나 빠른가?
나의 새로운 10.5" iPad Pro가 다음주까지 도착하지 않기 때문에(역자: 부럽습니다) Core ML의 속도를 시험해보지 못했다

나는 특별히 MobileNets을 실행시키는데 나의 Forge library를 이용할때와 Core ML을 이용할때 그 속도 차이가 어떻게 되는지 관심이 갔다(아직 초기 베타 단계에 있다).

채널을 고정하라! 공유할 데이터가 생기면 이 섹션을 업데이트 할 것이다.

Vision
다음으로 이야기할것은 새로나온 Vision 프레임워크이다.

여러분도 이름에서 추측했을지 모르겠지만, Vision은 컴퓨터비젼(computer vision) 테스크를 실행시켜준다. 과거에는 이를위해 OpenCV를 사용해야했었는데, 이제 iOS는 자신만의 API를 가지게 되었다.

Vision이 수행할 수 있는 일의 종류들이다
  • 이미지안에서 얼굴 찾아내기. 각 얼굴에대해 사각형을 만들어준다.
  • 안면의 세부적인 특징 찾아내기. 눈이나 입의 위치나, 머리의 모양 등.
  • 이미지에서 사각형모양으로된 것을 찾아내기. 표지판같은것들.
  • 비디오에서 움직이는 물체 추적하기.
  • 수평성 각도 알아내기
  • 두 이미지를 변형하여 그 내용을 정렬하기. 사진들을 합성할때 유용하다.
  • 이미지안에 포함된 텍스트 영역 감지하기.
  • 바코드 감지와 인지.
이 작업들중 몇몇은 이미 Core Image와 AVFoundation으로 가능하지만 이제 일관된 API로 한 프레임워크안에 들어왔다.

여러분의 앱이 이 컴퓨터비젼 작업중 하나가 필요할때, 더이상 여러분이 직접 구현하거나 다른 라이브러리를 사용할 필요가 없다. 그냥 Vision 프레임워크를 사용하면 된다. 더욱 강력한 이미지 처리를위해 Core Image 프레임워크와 합쳐서 사용할 수도 있다.

더 나은 것은, Core ML을 작동시키기위해 Vision을 사용할 수도 있다는 점이다. 그리하여 뉴럴 네트워크를 위한 전처리 단계로서 이런 컴퓨터 비젼 기술을 사용할 수 있게 해준다. 예를들어, 사람 얼굴의 위치와 크기를 감지하는데, 그 영역에 비디오 프레임을 자르는데, 이미지에서 얼굴이 있는 부분에 뉴럴럴 네트워크를 실행시키는데 Vision을 사용할 수 있다.

사실 이미지나 비디오와 함께 Core ML을 사용하면 항상 Vision을통해 가는것이 알맞은 방법이다. 가공되지않은 Core ML로는 여러분의 입력 이미지는 모델이 예상하는 포멧안에 있도록 해야하지만, Vision으로는 프레임워크가 이미지 리사이징 등에 주의해야한다. 이것으로 여러분의 추가 노력을 조금 절약해줄 것이다.

코드에서 Core ML을 작동시키기위한 Vision 사용은 다음과같이 생겼다.
// the Core ML machine learning model
let modelCoreML = ResNet50()

// link the Core ML model to Vision
let visionModel = try? VNCoreMLModel(for: modelCoreML.model)

let classificationRequest = VNCoreMLRequest(model: visionModel) {
  request, error in
  if let observations = request.results as? [VNClassificationObservation] {
   /* do something with the prediction */
  }
}

let handler = VNImageRequestHandler(cgImage: yourImage)
try? handler.perform([classificationRequest])
VNImageReuestHandler가 요청하는 오브젝트의 배열을 받아서, 아래처럼 여러 컴퓨터 비젼 작업을 함께 연결하여 할 수 있음을 인지하자.
try? handler.perform([faceDetectionRequest, classificationRequest])
Vision은 컴퓨터 비젼을 사용하기 아주 쉽게 만들어준다. 그러나 기계학습 사람들에게 멋진 일은 컴퓨터 비젼 작업의 아웃풋을 받아서 Core ML 모델에 넣을 수 있다는 점이다. Core Image의 파워와 합쳐지면 이미지 처리 파이프라인을 하나로 만들게된다!

Metal Performance Shaders
내가 말하고싶은 마지막 주제는 Metal이다. 이것은 애플의 GPU 프로그래밍 API이다.

올해 클라이언트를위한 많은 내 일거리는 Metal Performance Shaders (MPS)로 뉴럴 네트워크 구축과 최적화된 퍼포먼스로 맞추는 작업이 포함되있었다. 그러나 iOS10은 컨볼루션 네트워크를 생성하기위한 기본적인 몇 커널만을 제공했었다. 종종 이 갭을 채우기위해 커스터마이징한 커널을 짜야했다.

그러니 나는 iOS11에서 여러 이용가능한 커널 수가 늘었을때 행복했고, 그 이상의 기분이었다. 이제 그래프를 구축하는(building graphs) API를 가진다.

주의: 왜 Core ML 대신에 MPS를 사용할까? 좋은 질문이다! 가장 큰 이유는 Core ML이 여러분이 원하는 것을 지원하지 않거나, 프로세스 전체를 컨트롤 하고싶고 가능한 최대의 속도를 짜내고 싶을때 사용한다.

MPS에서 기계학습을위한 큰 변화들은 다음과 같다.
  • Recurrent neural networks. 이제 RNN, LSTM, GRU, MGU 레이어를 생성할 수 있다. 이것들이 MPSImage 오브젝트의 시퀀스에도 동작하고, MPSMatrix 오브젝트 시퀀스에도 동작한다. 이것이 흥미로운 이유는, 다른 모든 MPS 레이어들이 이미지만 다른다는 것이다(그러나 확실히 텍스트나 이미지가아닌 데이터와 작업할때는 매우 불편하다).
  • 더 많은 데이터 타입들. 이전의 가중치는 32비트 부동소수라고 가정했었는데, 이제 16비트 소수, 8비트 정수, 심지어 바이너리까지 될 수 있다. 컨볼루션과 완전히 연결된 레이어들은 바이너리 가중치와 바이너리화된 인풋으로 할 수 있다.
  • 더 많은 레이어들. 지금까지 우리는 plain-pld convolution과 max/average pooling으로 만들어야 했었다. 그러나 iOS11 MPS는 dilated convolution, subpixel convolution, transposed convolution, upsampling과 resampling, L2-norm pooling, dilated max pooling, 게다가 몇몇 새로운 활성 함수들(activation functions)을 가능하게 했다. 아직 MPS는 Keras나 Caffe 레이어 타입처럼 모든 타입을 가지진 않지만, 그 갭은 줄어들고 있다...
  • 더욱 편리함. Metal은 항번에 채널 4개의 분할로 데이터를 구성하는데(이미지가 MTLTextrue 오브젝트에의해 돌아오기 때문에),  그것때문에 MPSImage으로 작업하는것은 항상 좀 이상하다. 그러나 이제 MPSImage는 데이터를 읽고 쓰는 메소드를 가지므로 한결 편해질것이다.또다른 편리함은 레이어에 batch normalization 파라미터를 설정하게 해주는 새로운 메소드를 가지는 것이다. 이 말은 더이상 여러분이 컨볼루션 레이어 가중치에 batch normalization을 접지 않아도 MPS가 알아서 다 해줄것이라는 의미다. 매우 편리하다!


  • 성능 개선. 기존에 있던 커널들이 더 빨라졌다. 이 소식은 항상 좋다.
  • 그래프 API. 내 생각에는 이것이 큰 소식이다. 모든 레이어와 (임시의) 이미지를 직접 생성하는것은 항상 성가신다. 이제 Keras에서처럼 그래프를 표현할 수 있다. MPS는 이미지가 얼마나 커져야하는지, 패딩을 어떻게 다뤄야하는지, MPS 커널의 offset을 어떻게 설정할지 등을 자동으로 계산한다. 뒷편에서는 퓨징 레이어(fusing layers)로 그래프까지도 최적화시킬 수 있다.
이제 모든 커널들이 NSSecureCoding으로 시리얼라이즈 가능해보이는데, 이 의미는 그래프를 파일로 저장하여 나중에 복구시킬 수 있다는 의미이다. 그리고 이 그래프로 인터페이스를 사용하면 이제 그냥 한 메소드 호출만 하면 된다. 아직 Core ML만큼 쉽지는 않지만, MPS 사용이 확실히 이전보다 작업이 많이 줄었다.

내가 생각하기에 아직 분명하지 않은 것은 자신만의 컴퓨트 커널을 작성할 수 있는지, 그래프에 이것을 붙일 수 있는지이다. 내 클라이언트 작업에서 나는 전처리 과정에서 종종 필요했었고, Metal Shading Language로 작성된 커스텀 shader를 필요로 했다. 내가 말할 수 있는 부분은, "MPSNNCustomKerneNode" 클래스가 될것 같진 않다. 더 조사할 필요가 있어보인다!

결론: 기계학습을 위한 Metal Performance Shaders은 iOS 11과함께 더 강력해졌지만, 아마 많은 개발자들이 (내부적으로 MPS를 사용해가며) Core ML와 붙여 사용할 수 있다.
주의: 여러분의 앱이 계속 iOS 10을 지원하지 않는한, 새로나온 그래프 API는 내 Forge library를 쓸모없게 만들었다. 곧 예제 앱을 새로나온 그래프 API로 포팅할 것이고, 그것에대한 세부적인 내용을 블로그에 포스팅할 예정이다.

남은것들
발표된 것 중에 다른 부분이다.
  • Accelerate: Accelerate 프레임워크에서 BNNS는 기능적 업데이트가 크게 일어나진 않았다. 결국 Softmax 레이어가 나왔지만, MPS가 얻은 새로운 레이어 타입은 없었다. 아마 맞을것이다. 딥 뉴럴 네트워크를위한 CPU 사용은 어쨌든 좋은 아이디어가 아닌것같다. 이 말은, 나는 Accelerate를 사랑하고, 이것으로 많은 즐거움이 있었다. 그리고 이번년도에 나는 스파스 메트릭스를 더 지원했었는데, 꽤 멋졌다.
  • 자연어 처리(Natural Language Processing): Core ML은 이미지만을 위한게 아니라 텍스트를 포함한 수많은 종류의 데이터를 다룰 수 있다. 이 API에는 NSLinguisticTagger 클래스를 사용하는데, 얼마간 사용해봤지만 iOS 11이 나오면서 더욱 효과적게 되었다. 이제 NSLinguisticTagger는 언어 식별, 토큰화, part-of-speech tagging, lemmatization, Named Entity Recognition을 한다.
나는 NLP에 많은 경험이 없으므로 다른 NLP 프레임워크에대해 어떤식으로 stack up 되었는지 말할순 없을것 같지만, NSLinguisticTagger는 보기에 꽤 강력해 보인다. 여러분의 앱에 NLP를 넣고 싶으면 이 API로 시작하기에 좋아보인다.

이 모든게 좋은 소식인가?
애플이 개발자를위해 이 모든 새로운 툴을 제공하는것은 훌륭한 일이지만, 애플의 많은 API에는 중요한 "문제"가 있다.
  1. 오픈소스가 아니다
  2. 제한을 가진다
  3. 새로운 OS가 배포될때만 업데이트를 한다
이 세가지가 함게 있으면 애플의 API는 항상 다른 툴들에비해 뒤떨어질것이다. 만약 Keras가 멋진 새로운 레이어 타입을 추가하면 애플이 그 프레임워크와 OS를 업데이트 하기 전까지 Core ML로는 사용할 수 없을 것이다.

그리고 API의 어떤 부분은 여러분이 원하는대로 동작하지 않을때, 내부로 들어가서 고칠 수 없다. 여러분은 이것으로 작업해야하거나(항상 가능하진 않다) 다음 OS 배포까지 기다려야한다(모든 사용자들이 업그레이드하도록 해야한다).

물론 나는 애플이 비밀 소스를 줄거라 생각하진 않지만, 많은 다른 기계학습 툴킷들이 오픈소스니 Core ML도 오픈소스로 만드는 건 어떨까?🙏

애플이 이것을 아는것은 아마 빠른 시일안에 일어나진 않을 것이지만, 여러분의 앱에 기계학습을 넣기로 했을때는 적어도 위의 내용들을 마음에 담아주자.

더 읽을거리...



이 블로그는 공부하고 공유하는 목적으로 운영되고 있습니다. 번역글에대한 피드백은 언제나 환영이며, 좋은글 추천도 함께 받고 있습니다. 피드백은 

으로 보내주시면 됩니다.



WRITTEN BY
tucan.dev
개인 iOS 개발, tucan9389

,
제목: New stuff from WWDC 2017

올해 그 시기가 다시 돌아왔다. 여러분도 나와 비슷하다면 아마 최근에 몇주동안 많은 시간을 WWDC 발표에 쏟아 부었을 것이다. 릴리즈 노트를 파보고, WWDC 발표를 보고, cool new stuff으로 가지고 놀아보면서 말이다. 그리고 보통 새로운것을 처리하는 그 양이 어마어마하게 많다.

그래서 지난 2년처럼 나는 다양한 소스로부터 찾을 수 있었던 모든 것들을 리스트로 조직화하여 준비했었다. macOS/iOS/watchOS/tvOS에서 사용자가 직면하는 모든 기능들, 모든 새로운 프레임워크, API, 그리고 각각 SDK의 개선점들과 애플의 개발자 도구들이 있다.

여기있는 모든 것들의 더 많은 정보를 위해서는 섹션 위에있는 링크를 따라가서 애플의 개발자 사이트나 "What's New" 문서로 가고 developer.apple.com에 릴리즈 노트를 다운받자. 그리고 물론 새롭게 리디자인된  비공식 WWDC Mac 앱에서 여러분이 관심있는 발표들도 보자.

지난 최근년도에 노트를 확인하고싶으면(예를들어 여러분의 앱에서 iOS9 지원을 멈추려할때 확인하고 싶은 것들), 아래 포스트를 확인해보자.

macOS 10.13 High Sierra
  • Mail
    • 중요한 이메일의 스마트 하이라이트
    • 작성창(compose window)을 위한 뷰 분리
    • 적은 디스크 공간 사용하기
  • 메시지 앱: iOS/macOS간에 iCloud로 대화 동기화하기(end-to-end 암호화)
  • 노트 앱
    • 노트 핀하기
    • 테이블 지원
  • 사진 앱
    • 퍼시스턴트 사이드바
    • 모든 불러온 자료를 연대순으로 보여주기(shows all imports chronologically)
    • 증진된 얼굴 인식
    • 기기간의 사람들 동기화
    • 칼라 곡선과 칼라 선택 편집 도구
    • 사진 인쇄를 위해 더 많은 파트너
    • 메모리즈를 위한 더 많은 토픽들
    • 제3자 앱에서 사진을 편집하여 사진 앱에 다시 저장할 수 있음
    • 애니메이션이 있는 GIF를 실행하기
    • 라이브 사진 효과
  • 사파리
    • 비디오 자동재생 막기
    • 지능적 추적 보호(intelligent tracking prevention)
    • 사이트별 세팅(예를들어 어떤 사이트에대해 자동재생 활성화나 내용 차단기 비활성)
    • 자동으로 읽기 모드
  • 스포트라이트는 더 많은 종류를 찾아줌(예를들어 비행기 정보나 위키피디아에서 나온 여러 결과들)
  • 자연스러워짐, 더 자연스러워진 음향의 Siri 목소리
  • 윈도우 서버(미션 컨트롤 등) Metal 2의 상위에 탑재됨
  • APFS는 새로운 설치에대해 새로운 디폴트 파일 시스템
  • H.265(HEVC) 비디오 지원, 최신 맥에대해 하드웨어 가속이 탑재
  • 접근성
    • 새로운 화면위 접근성 키보드
    • Siri에게 타이핑하기(목소리 인터페이스를 비활성하기)
    • 이미지의 보이스오버 설명(voiceover descriptions)은 이제 이미지 내용의 설명이나 인식된 텍스트를 자동으로 포함할 것임

iOS11
  • 리디자인된 컨트롤 센터
    • 단일 페이지, 애니메이션
    • 3D 터치로 보여지는 더 많은 컨트롤들
    • 몇 영역은 커스터마이징 가능함
    • 토클이 가능함(예를들어 셀룰러 데이터, 핫스팟, 에어드랍)
  • 앱 변경의 새로운 디자인
    • 새로운 애니메이션
    • 더이상 첫번째 앱으로 홈 화면을 보지 않아도 됨
  • 락스크린에서 지나간 노티피케이션 접근가능(상단의 노티피케이션 패널은 이제 락스크린처럼 동일함)
  • 더이상 홈스크린의 독에 있는 앱들은 이름을 보이지 않음
  • 비밀번호 화면, 사진 앱 숫자 입력 화면, 숫자 키보드의 디자인이 바뀜
  • 이제 탭바는 약간 더 볼드된 문자와 채워진 기호(glyph)를 사용함
  • 가로 모드에서 탭바는 좁아지고 레이블은 오른쪽에 나타남
  • 다양한 앱에서 큰 볼드 헤딩으로 새로운 헤더 디자인(iOS10의 음악 앱같은)
  • 멀티터치로 디래그 앤 드롭 지원
    • iPhone과 iPad앱 안에서나 혹은 앱 간의
  • 파일 앱 – 파인더 앱처럼 태그, 좋아요, 중첩된 폴더, 클라우드 저장소 등. (iCloud Drive 앱을 대체하게됨)
  • 애플 뮤직
    • 공유된 "up next"
    • 여러분의 친구들이 무엇을 듣는지 보여줌
    • 여러분의 프로필을 구성하고 다른사람들과 공유되고 싶은 것을 정하기
  • 앱스토어: 완전히 리디자인된 앱
  • 캘린더: 새로운 디자인
  • 카메라: QR 코드 지원
  • 홈: NFC & QR코드를 이용한 페어링으로 스피커(여러 방의 오디오 – AirPlay 2), 스프링클러, 수도꼭지를 지원
  • 지도
    • 쇼핑몰이나 공항에서 층 도면
    • 제한 속도 표시
    • 차선 안내
    • 한손 줌(구글 맵처럼 더블탭+드래그업/다운)
    • 모의-AR 비행 모드 (소스)
  • 메시지
    • 리디자인된 앱 서랍
    • 앱 서랍으로 넘어간 Digital Touch
    • iOS/macOS간의 대화를 자동으로 동기화하기(end-to-end 암호화)
    • 개인 대 개인 지불을 위한 애플 패이
    • 새로운 "Echo"와 "스포트라이트" 화면 효과
    • 옛날 대화를 자동으로 지우는 것을 선택함
  • 노트
    • 노트를 핀하기
    • 목록 화면에서 노트를 잠그기(스와이프 액션)
    • 테이블을 지원
    • 선/그리드 스타일을 선택하기 (source)
    • 한 라인내 그리기
  • 사진
    • 메모리즈를 위한 더 많은 주제
    • 메모리즈를 세로로 재생 가능
    • 애니메이션된 GIF 재생
    • 라이브 포토를 자르기
    • 라이브 포토를 위해 키프레임 선택하기
    • 라이브 포토 효과: 루프, 바운싱, 뮤드, 긴 노출
    • iOS의 사진으로부터 쉽게 와치 페이스(photo or kaleidoscope)를 만들 수 있는 옵션
    • 비디오는 HEVC 포맷(2배까지 압축됨)으로 저장되고, 사진은 HEVC 기반의 HEIF 포맷으로 저장됨
    • iOS9에서처럼 "편집" 버튼이 우측 상단으로 돌아감
  • 팟캐스트: 새로운 디자인
  • 사파리
    • 지능적 추적 보호(intelligent tracking prevention)
    • 세팅에서 "경험적 피처드" 메뉴는 완성되지 않은 새로운 API 가능
    • 추적 보호와 카메라/마이크 접근을 비활성 가능
  • 설정
    • 백그라운드 앱 갱신은 WiFi 연결에서만 동작되도록 세팅할 수 있음
    • 새로운 "계정과 비밀번호" 패널("메일"과 "사파리"에서 확장됨)
    • 리디자인된 "저장공간과 iCloud 사용" 패널("iPhone 저장공간으로)
    • "일반/스포트라이트 검색"이 "Siri" 패널로 합쳐짐
    • 재구성된 "알림" 섹션
    • 이제 모든 앱에대해 항상 "사용하는 동안" 위치 허가를 선택할 수 있음
    • "끄기" 버튼이 일반 메뉴에 있음
    • 시스템 수준에서의 소셜 네트워크 로그인이 제거됨(Twitter, Facebook 등)
  • Siri
    • 자연스러워짐, 더 자연스러워진 음향의 목소리
    • 여러 결과, 추가의 질문들
    • 번역(베타) –영어에서 프랑스어, 독일어, 이탈리아어, 스페인어, 중국어
  • Siri 지능
    • 더 많은 곳에서 다 많은 종류의 제안
    • 기기간에 동기화된 당신의 정보 (end-to-end 암호화)
  • TV 앱: Amazon Prime은 내년에 추가될 것임
  • 접근성
    • "스마트 뒤집기(smart invert)" 모드
    • "Siri에게 타이핑하기" 옵션(목소리 인터페이스를 비활성)
    • 자동으로 호출 답변을 선택하기
    • 이미지의 보이스오버 설명(voiceover descriptions)은 이제 이미지 내용의 설명이나 인식된 텍스트를 자동으로 포함할 것임
    • 추가로 큰 텍스트 모드에서, 탭바의 탭을 길게 누르면 탭 이미지와 레이블이 커져서 팝업되어 표시됨
  • 운전중에는 방해하지 마라(Do Not Disturb while Driving) – 운전을 자동으로 감지하여 알림을 끔
  • 긴급 SOS 기능(전원 버튼을 5번 누르고 슬라이더를 슬라이드 하기)
  • 기존의 기기에서 새 아이폰을 자동으로 설정
  • AirPods을 위한 커스텀 액션 구성
  • 가까이에 다른 기기로부터 WiFi 비밀번호 요청하기
  • QR 코드를 스캔하여 WiFi 로그인하기
  • 내장된 문서 스캐너
  • 화면 녹화(컨트롤 센터로부터 접근)
  • 프린트를 지원하는 앱에서 PDF 생성하기
  • PDF, 스크린샷, 스캔한 문서에 표시하기(그리기)
  • 스크린샷을 찍고나서 구석에 썸네일이 나타나고, 그것을 탭하여 편집, 주석, 공유할 수 있음
  • 새로운 비디오 플레이 컨트롤
  • 셀 시그널에대해 점 대신 바
  • 한손 키보드 옵션 (더 좁아진 키들과 한쪽에 비워진 공간을 남김)
  • 적게 사용된 앱을 자동으로 지우고 필요하면 다시 복구하는 옵션
  • health 데이터는 iCloud에 동기화될 수 있음
  • FLAC 오디오 지원
  • 앱스토어, iTunse Store, 캘린더의 새로운 아이콘
  • 앱스토어는 iPad와 Mac 앱을 위해 정보 페이지를 보여줌(아마 버그같다?)
  • 앱스토어는 유료 앱을 사려할때 애플패이 스타일의 창을 보여줌
  • 홈 스크린에서 앱을 실행할때 다른 애니메이션
  • 기기를 잠금해제할때 다른 애니메이션
  • 알림 텍스트에서 하이라이트된 링크? (source)
  • 3D 터치 없는 기기에서 쉽게 알림 열기? (source)
  • iPhone5 & 5c, iPad4를 위한 드롭 지원
  • 옛날 32비트 앱을 위한 드롭 지원

iPad
  • 리디자인된 앱 독
    • 더 Mac스러운 디자인
    • 앱 안에 있을때 밀어올릴 수 있음
    • 앱은 독에서부터 슬라이드오버(slide-over)까지 드래그될 수 있음
    • 한 앱에서 최근에 사용한 파일에 접근
    • 오른쪽에 핸드오프/제안된 앱을 보여줌(비활성가능)
  • 슬라이드오버를 위한 새로운 디자인
  • 더 새로운 iPad는 분할 뷰에서 2개의 앱을 보여줄 수 있고, 세번째는 슬라이드 오버에서 보여줄 수 있음(그럼 네번째는 PiP에서?)
  • PiP 창은 유연하게 크기조절가능함 (source)
  • 앱 전환자를 위한 새로운 디자인
    • 분할 뷰 앱 페어링을 보존하고 미션 컨트롤 종류처럼 보임
    • 컨트롤 센터와 합쳐짐
  • 키보드자판 위에서 쓸어올려 구두점/숫자에 접근하기
  • 키보드 단축키(Cmd+Shift+3/Cmd+Shift+4)로 스크린샷 찍기
  • 화면에서 팬슬을 팹하여 새로운 노트와함게 노트앱 열기, 혹은 어느 기간안에 이전에 열린 노트 열기
  • 손글씨 인식 & 식별 (확실하진 않지만 iPad만?)
  • 컨트롤 센터에서 손전등 (source)

watchOS4
  • Siri 와치 페이스(Siri watch face)
  • Kaleidoscope 와치 페이스
  • 토이스토리 와치 페이스
  • 뉴스 앱
  • 독 증진
    • 새로운 수직의 디자인
    • 좋아요 모드(이전처럼)이나 최근 모드(iOS처럼) 사이에서 선택할 수 있음
    • iPhone에서 음악을 켜면 자동으로 가장 앞단의 앱으로서 '지금 재생중'을 보여줌
  • 홈 화면을 hex 그리드 대신 가나다 순으로 정렬된 앱 리스트로 보이게 할 수 있음
  • 이제 편집 모드 동안에 crown을 이용하여 구성된 와치 페이스을 스크롤 할 수 있음
  • 컨트롤 센터에서 손전등/안전 라이트
  • iPhone과 페어링하기위한 새로운 UI
  • 바뀐 비밀번호 화면 (굵어진 숫자, 애니메이션, 클릭)
  • 설정에서 위치 서비스 활성화
  • 몇몇 앱에서 다른 누군가에게 시계를 보여줄때 화면은 위아래로 자동으로 회전할 것임
  • 액티비티: 도전, 목표, 축하 등으로 개별화된 알림
  • 심박수: 이력 차트
  • 메일: 제스처(?)
  • 지도: 제안, 최근
  • 음악
    • 리디자인된 UI
    • 당신이 좋아하는 음악을 자동으로 동기화
    • 음악의 위치를 보여줌(iPhone/watch)
    • 시계에 특정 음악을 업로드 할 수 있음
  • 폰: 손수 숫자를 입력하기위한 키패드 (전화받는 도중에도 물론)
  • 타이머: 타이머가 끝나면 다시하기 버튼
  • 날씨: 공기 상태
  • 워크아웃(workout)
    • 새로운 UI – 워크아웃 시작하기 더 쉬워짐
    • 각 타입의 워크아웃은 마지막 목표 설정을 기억함
    • 한 세션에서 여러 워크아웃을 쉽게 할 수 있음
    • 앱으로부터 음악을 컨트롤 할 수 있는 기능
    • 자동으로 방해하지 마시오로 전환
    • 자동으로 재생목록을 재생하는 옵션
    • 개선된 풀장 수영(Pool Swim) 워크아웃
    • 높은 밀도의 인터벌 훈련(High Intensity Interval Training)
  • NFC를 통해 몇몇 운동 장비와 연동
  • 여러 센서나 스포츠 기기와 소통하기위한 코어 블루투스(예를들어 포도당 센서)
  • 개인 대 개인 지불을 위한 애플패이
  • 더 능력있는 카메라 컨트롤 (?)

tvOS4
  • 홈 화면 동기화 – 여러 애플 TV에 설치된 앱과 홈 화면 레이아웃을 동기화하기
  • 자동 어둡게 모드 – 시간에따라 자동으로 모드를 변경
  • AirPlay2 – 여러 방에 오디오 지원
  • AirPods은 이제 자동으로 여러분의 애플 TV와 페어된다.
  • TV 앱: Amazon Prime은 올해 후반기쯤에 추가될 것임

Foundation & Core frameworks
  • Core Data
    • 코어 스포트라이트와 더 통합됨 (NSCoreDataSpotlightDelegate)
    • 새로운 인덱싱 API(NSFetchIndexDescription, NSFetchIndexElementDescription, R-tree 인덱스)
    • com.apple.CoreData.SQLDebug 환경 변수는 4로 설정할때 SQL 쿼리를 디버깅한다고 할 수 있음
    • NSURLNSUUID 속성 타입
    • 다른 프로세스(예를들면 앱 익스텐션)에서의 변화를 추적하기위한 영속 이력 API(NSPersistentHistoryTrackingKey)
  • Core Location
    • CLGeocoder: CNPostalAddress와 통합됨
    • 쇼핑몰이나 공항에서 정밀한 인도어 위치가 가능함
    • 더 정확한 방향의 계산
  • NSArchiverNSUnarchiver는 디프리케이트됨
  • NSDistributedNotificationCenter: 옵저버들이 구독 취소를 할 필요가 없어짐
  • NSError: 새로운 NSLocalizedFailureErrorKey 정보 키
  • NSJSONSerialization: JSON 더미 속에서 알파뱃 순으로 정렬된 키들을 출력할 수 있음(NSJSONWritingSortedKeys)
  • NSLinguisticTagger: 증진된 API로서, 유력한 언어를 인지함
  • NSURL: 얼마나 빈 공간을 사용가능하게 만들 수 있는지 확인함(volumeAvailableCapacityForImportant/OpportunisticUsage)
  • NSURLSession
    • 적용가능한 연결성 API(waitsForConnectivity)
    • 스케줄링 API(earliestBeginDate)
    • 진행 추적(ProgressReporting)은 UIProgressViewNSProgressIndicator에서 사용할 수 있음
    • 증진된 스케줄링을위해 크기 힌트를 요청하기: countOfBytesClientExpectsToSend/Receive
    • Brotli 컨텐트 인코딩을 지원
  • NSXPCConnection: NSProgress 지원
  • 기존에있던 임의의 몇 API는 이제 에러 처리에대해 바뀌기도하고 문자열 대신에 URL을 받음

macOS SDK
  • High Sierra는 32비트 앱을 지원하는 마지막 배포판임
    • 2018년 1월부터 MAS에 제출되는 새로운 앱은 64비트 지원을 필요로함
    • 2018년 6월부터 모든 앱(새것&업데이트)은 64비트만 될 것임
  • AirPlay2 – 여러 방에 오디오 지원
  • Core ML 프레임워크 – 기계 학습
  • 이제 iOS에서 가능하던 Core Spotlight를 Mac에서도 가능함
  • Metal 2
    • 더 나은 성능과 새로운 API
    • 디버깅과 프로파일링 도구
    • 기계학습을 지원
    • 외부 그래픽 카드 접근을 위한 API
    • VR 지원(스팀, 유니티, 언리얼 VR SDK가 Mac으로 옴)
  • 사진 프로젝트 확장(PHProjectExtensionController) – 커스텀 인쇄 프로젝트나 웹 겔러리를 만들기 등
  • Vision 프레임워크 – 이미지 분석과 인식
  • NSAccessibilityCustomRotor – 사용자를 위한 선택 리스트를 제공(예를들면 섹션이나 링크들)
  • NSApplication: 파일이나 URL을 열기위해 나온 새로운 application(_:open:) 콜백(이전의 NSAppleEventManager기반 API를 대체함)
  • NSButton: 내용물은 애니메이터 프록시를통해 애니메이션될 수 있음
  • NSColor
    • systemBlue와같이 새로운 시스템 칼라 셋
    • NSColor.red와같은 표준 칼라들은 이제 sRGB 프로파일을 사용함
    • 어셋 카탈로그로부터 칼라를 불러오기위한 NSColor(named: ...)
  • NSCollectionView: iOS에서처럼 프리패칭하기
  • NSDrawer: 디프리케이트됨 :(
  • NSFontAssetRequest 잃어버린 시스템 폰트를 비동기로 다운로드하기위함
  • NSLevelIndicator: 새로운 모습, 스타일, 구성 옵션들. 값은 애니메이션 될 수 있음
  • NSMenuItem: allowsKeyEquivalentWhenHidden
  • NSSegmentedControl: 정돈(alignment)과 배치(distribution) 속성
  • NSTableView: 디폴트로 스스로 크기조절하는 행 사용(오토레이아웃을 사용하여)
  • NSWindowTab: title, tooltip, accessory view같은 탭들을 더욱 커스터마이징할 수 있는 옵션들
  • Core Image: 찍힌 이미지의 depth map 접근하기
  • MapKit
    • 새로운 "muted" 맵 타입
    • MKAnnotationView.displayPriority는 어떤 지도 주석이 더 중요한지 정해줌
    • 주석 모으기(MKAnnotationView.clusteringIdentifier, .collisionMode, MKClusterAnnotation)
    • MKMapView.dequeueReusableAnnotationView(withIdentifier:for:): UITableView에서처럼 항상 주석을 반환하는 변형
  • WKWebView: 커스텀 URL 스킴, 쿠키 관리, 스넵샷, 내용 필터링을 위한 새로운 API
  • 스위프트 호환성을 위한 정재된 API
    • 스위프트의 전역에 print()와 충돌을 피하기 위해 print라 정의된 몇몇 메소드들 이름 변경(예를들어 printView, printWindow)
    • 몇몇 전역 상수는 강타입 클래스 속성으로 이동됨(예를들어 NSSharingService.composeEmail)
    • 몇 클래스에서 nullability 수정
    • NSApplication.shared같은 ObjC 클래스 속성들
    • contentViewfirstResponder같은 몇몇 속성들이 이전에는 assign(스위프트에서는 unowned(unsafe))이었는데 이제 weak로 됨
  • iCloud 문서 공유하기
    • NSDocument 앱을위해 무료로 됨
    • NSDocument.share, allowsDocumentSharing
  • 파일 메뉴에서 볼 수 있는 새로운 "Share" 서브메뉴(NSDocumentController.allowsAutomaticShareMenu, standardShareMenuItem)
  • 복구가능한 상태를 인코딩하는것을 비동기로 완료할 수 있음(encodeRestorableState(with:backgroundQueue:))
  • 터치바 API 개선
    • 새로운 칼라 피커 컨트롤
    • NSGroupTouchBarItem은 시스템 경고로서 같은 버튼을 사용하는 옵션
    • NSGroupTouchBarItem은 공간이 충분하지 않을때 압축 설정을 하는 옵션
    • RTL 언어 지원
    • playground에서 터치바 랜더링
  • HEVC와 HEIF 지원
  • 시스템 수준의 소셜 네트워크 로그인이 디프리케이트됨(Twitter Facebook등)

iOS SDK
  • 뷰컨트롤러는 이제 상단에 선택적으로 검색 필드와함께 표준의 큰 타이틀 헤딩을 표시할 수 있음
    • 헤딩을 다루기위한 prefersLargeTitles, largeTitleDisplayMode
    • 검색필트를 다루기위한 searchControllerhidesSearchBarWhenScrolling
  • 레이아웃 시스템 변화
    • UIView
      • 뷰는 이제 "safe area insets"을 가진다(safeAreaInsets, safeAreaLayoutGuide, insetsLayoutMarginsFromSafeArea)
      • RTL 언어를 위해 추가된 directionalLayoutMargins
    • UIViewController
      • 추가된 safeAreaLayoutGuideadditionalSafeAreaInsets
      • 추가된 systemMinimumLayoutMarginsviewRespectsSystemMinimumLayoutMargins
      • preferredScreenEdgesDeferringSystemGestures는 시스템 패널에서 사용자가 스와이프한 엣지가 어딘지 정의함
      • topLayoutGuide, bottomLayoutGuide, automaticallyAdjustsScrollViewInsets는 디프리케이트됨
    • UIScollView
      • 추가된 adjustedContentInsetcontentInsetAdjustmentBehavior
      • 추가된 frameLayoutGuidecontentLayoutGuide 레이아웃 가이드
    • UITableView
      • separatorInsetReference(.fromCellEdges.fromAutomaticInsets)
  • 다이나믹 타입 개선
    • UIFontMetrics는 커스텀 폰트의 크기를 조정할 수 있게 해줌(예를들어 다이나믹 타입 설정에따른 버튼 사이즈)
    • constraintEqualToSystemSpacing(below/after:)는 정확하게 스케일한 거리 제약을 정의함
    • spacingBaselineToBaseline은 시각적 포멧 언어를위한 옵션임
    • UIStackView를 위한 spacingUseSystem
  • 드래그 앤 드롭을 위한 새로운 API
  • AirPlay2 – 여러 방에 오디오 지원
  • AR이 가능한 앱을 쉽게 만들수 있는 ARKit(iPhone 6s나 더 최신/iPad Pro나 더 최신)
  • Core ML프레임워크 – 기계 학습
  • Core NFC – NFC 태그를 읽기위한
  • DeviceCheck 프레임워크 – 시스템 재설치후에 보존하는 기기를 위한 플래그 세팅
  • FileProvider 프레임워크 – 파일 프로바이더 익스텐션을 위한 새로운 API
  • IdentityLookup – 알수없는 사람이 보낸 SMS을 걸러내는 Message Filter 익스텐션에서 사용됨
  • IOSurface – macOS에서나온 프레임버퍼 프레임워크
  • Metal 2 – 더 나은 성능, 기계학습 지원, 디버깅 & 프로파일링 툴, 더욱 통합된 API
  • MusicKit – 사용자의 애플 뮤닉 라이브러리에 접근하기위함
  • macOS에서 온 NSXPConnection
  • 앱내에서 PDF를 보여주기위한 PDFKit
  • macOS에서 온 ProcessInfo.ThermalState API
  • Quick Look Preview 익스텐션(QLPreviewingController)
  • 썸네일 익스텐션(QLThumbnailProvider)
  • Vision 프레임워크 – 이미지 분석과 인식
  • UIBarItem.largeContentSizeImage – 탭 바 아이콘을 길게 누를때 접근성 HUD에서 보여지는 이미지
  • UIDocumentBrowserViewController – 앱 파일들을 브라우징하기위한 새로운 UI(로컬이나 클라우드에서)
  • UINavigationItem.titleViewUIBarButtonItem.customView는 이제 오토레이아웃을 사용하여 그들의 크기를 정할 수 있음
  • UIScreen.maximumFramesPerSecond는 새로운 iPad를 위한 ProMotion 지원
  • UIStackView.setCustomSpacing(after:)
  • UITabBar
    • 이제 탭바는 약간 더 볼드된 문자와 채워진 기호(glyph)를 사용함
    • 가로 모드에서 탭바는 좁아지고 레이블은 오른쪽에 나타남
    • 추가로 큰 텍스트 모드에서, 탭바의 탭을 길게 누르면 탭 이미지와 레이블이 커져서 팝업되어 표시됨(큰 버전의 아이콘이나 벡터 이미지를 추천함)
  • UITableView
    • 시작/끝 스와이프 액션이 구성가능함(UISwipeActionsConfiguration, UIContextualAction)
    • 디폴트로 셀과 헤더/풋터에대해 스스로 크기조절하는 오토레이아웃 사용
    • UICollectionView에서처럼 performBatchUpdates(_:completion:)
  • HealthKit
    • 체성분분석기(waist circumference)나 인슐린 레벨같은 새로운 헬스 데이터 타입(HKQuantityTypeIdentifier)
    • tai chi나 mixed cardio같은 새로운 워크아웃 타입(HKWorkoutActivityType)
    • 워크아웃 앱은 워크아웃 세그먼트를 표시할 수 있음(HKWorkoutEventType.segment)
    • 워크아웃 앱은 사용자의 워크아웃 루틴을 읽고 작성할 수 있음(HKWorkoutRoute)
  • MapKit
    • 새로운 "muted" 맵 타입
    • 맵 컨트롤은 이제 일반 뷰처럼 맵으로부터 분리되어 사용할 수 있고, RTL을 인지함
    • MKMarkerAnnotationView: "표시" 모양과함께 새로운 디폴트 주석 뷰
    • MKAnnotationView.displayPriority는 더 중요한 지도 주석을 명시함
    • 주석 모으기(MKAnnotationView.clusteringIdentifier, .collisionMode, MKClusterAnnotation)
    • MKMapView.dequeueReusableAnnotationView(withIdentifier:for:): UITableView에서처럼 항상 주석을 반환하는 것
  • SFSafariViewController
    • 몇몇 추가적인 구성 옵션들
    • 사파리와 다른 앱들은 이제 쿠키들과 웹사이트 데이터에대해 다른 컨테이너를 얻음
    • 사파리에서 웹사이트 데이터를 지우는것은 앱에서의 것도 지운다
  • SiriKit
    • 새로운 목록들과 노트 도메인(TODO 리스트, 노트, 할일 목록를 생성하고 관리하기)
    • 새로운 시각적 코드 도메인(지불을위해 QR 코드를 표시하고 연락처 정보를 교환하기)
    • Ride Booking과 지불을위한 추가사항
  • WKWebView: 커스텀 URL 스킴, 쿠키 관리, 스넵샷, 내용 필터링을위한 새로운 API
  • 앱을위한 iCloud 키체인 패스워드 자동완성
  • iCloud 문서 공유
  • 새로운 NFC 접근 허가(+ NFCReaderUsageDescription)
  • 위치 접근
    • 위치 접근이 어떻게 사용자에게 표시될지에대한 몇가지 변경(화살표 아이콘과 파란색 바)
    • 사용자는 이제 "사용하는 동안"을 항상 선택할 수 있고, 이것을 다룰 수 있어야 함
    • 앱들은 반드시 NSLocationWhenInUseUsageDescription을 포함하고 선택적으로 NSLocationAlwaysAndWhenInUseUsageDescription을 포함함
  • 사진 접근
    • 사진을 저장만 하기위해 write-only 지원을 물어볼 수 있음(NSPhotoLibraryAddUsageDescription)
    • 사용자에게 사진 라이브러리를 모두 접근하지 않고 한 사진만 선택하도록 요구하려면 UIImagePickerController를 사용할 수 있음
  • HEVC와 HEIF를 지원
  • 캡처된 이미지(CIImage에서 kCIImageAuxiliaryDepth)와 비디오(AVDepthData)의 depth map에 접근하기
  • 시스템 수준에서의 소셜 네트워크 로그인이 제거됨(Twitter, Facebook 등)
  • 32비트 앱 지원이 누락됨(iOS11 개발 타겟을 타겟으로하는 앱은 64비트만 지원가능)

watchOS SDK
  • Core Bluetooth
  • Core ML 프레임워크 – 기계학습
  • macOS로부터 온 ProcessInfo.ThermalState API
  • macOS로부터 온 NSXPCConnection
  • WKExtension
    • enableWaterLock – 앱 내 워터 락 버튼(water lock button)을 구현하기 위함(워크아웃 앱과 위치 추적 앱만을 위함)
    • isAutorotating – 자동 회전 기능은 사용자가 손목을 바깥쪽으로 틀면 나옴
    • isFrontmostTimeoutExtended – 어떤 앱이 화면상에서 8분까지 잡혀있으면 그 시간을 연장할지 시스템에게 요청하는 것(watchOS 3.2에서는 디폴트 타임아웃이 2분으로 바뀌었었음)
  • WKInterfaceController
    • 수직으로 스크롤되는 페이지 지원(WKPageOrientation.vertical)
    • 선택된 페이지에서 페이지된 인터페이스를 시작하기(pageIndex 파라미터)
    • 특정 포지션에 리스트를 스크롤하기(scroll(to:at:animated:))
    • 스크롤 이벤트에대한 콜백(interfaceOffsetDidScrollToTop/Bottom, interfaceDidScrollToTop)
  • WKInterfaceGroup: 이제 그룹은 오버랩' 레이아웃을 가질 수 있음
  • WKSnapshopRefreshBackgroundTask: reasonForSnapshop – 왜 스넵샷이 필요했는지 알려줌
  • HealthKit
    • 체성분분석기(waist circumference)나 인슐린 레벨같은 새로운 헬스 데이터 타입(HKQuantityTypeIdentifier)
    • tai chi나 mixed cardio같은 새로운 워크아웃 타입(HKWorkoutActivityType)
    • 워크아웃 앱은 워크아웃 세그먼트를 표시할 수 있음(HKWorkoutEventType.segment)
    • 워크아웃 앱은 사용자의 워크아웃 루틴을 읽고 작성할 수 있음(HKWorkoutRoute)
    • 워크아웃 앱은 crown + 사이드 버튼을 함께 눌러서 "하드웨어 일시정지" 제스처에 응답할 수 있음(HKWorkoutEventType.pauseOrResumeRequest)
  • SiriKit
    • 단일-프로세스 런타임 – UI와 앱 코드는 이제 단일 프로세스에서 돌아갈 것이고 성능을 증진함
    • 위치를 사용하는 앱은 이제 와치에서 직접 위치 접근을 물어볼 수 있음
    • SpriteKit과 SceneKit 뷰들은 전체 화면 모드에서 보여질 수 있음(구석에 시간이 계속 나타나겠지만)
    • 한줄의 오디오 녹음 – 커스텀 컨트롤을 사용하며, 시스템 다이얼로그는 아님
    • 백그라운드 오디오 녹음 모드(마이크 지시자가 보임)
    • 워크아웃 앱이 아닌 것들을 위한 백그라운드 위치 추적 모드(위치 아이콘이 보임)

tvOS SDK
  • AirPlay2 – 여러 방에 오디오 지원
  • Core ML 프레임워크 – 기계 학습
  • iOSSurface – macOS로부터 온 프레임버퍼 프레임워크
  • Metal 2 – 더 나은 성능, 기계학습 지원, 디버깅 & 프로파일링 툴, 더욱 통합된 API
  • macOS에서 온 NSXPConnection
  • macOS에서 온 ProcessInfo.ThermalState API
  • Vision 프레임워크 – 이미지 분석과 인식
  • Core Image: 찍힌 이미지의 depth map접근하기
  • MapKit
    • 새로운 "muted" 맵 타입
    • 맵 컨트롤은 이제 일반 뷰처럼 맵으로부터 분리되어 사용할 수 있음
    • MKMarkerAnnotationView: "표시" 모양과함께 새로운 디폴트 주석 뷰
    • MKAnnotationView.displayPriority는 더 중요한 지도 주석을 명시함
    • 주석 모으기(MKAnnotationView.clusteringIdentifier, .collisionMode, MKClusterAnnotation)
    • MKMapView.dequeueReusableAnnotationView(withIdentifier:for:): UITableView에서처럼 항상 주석을 반환하는 것
  • 더 나은 폰트 크기조절을 위한 UIFontMetrics와 오토레이아웃 추가사항 (iOS를 보라)
  • TVML 템플릿
  • 웹 인스팩터에서 TVML 지원
  • RTL 언어 지원
  • 앱은 조용한 알림을 사용해 백그라운드에서 깨어날 수 있음
  • 리소스 번들 사이즈 제한이 4GB로 늘어남
  • HEVC와 HEIF 지원

개발자 툴
Xcode9
  • 완벽하게 다시작성된 소스 에디터
    • 스위프트로 작성됨
    • 더 빨라짐
    • 더 많은 폰트 구성 옵션들
    • 3가지 커서중 하나 선택하기(수직, 수평, 블락)
    • Cmd-+ 텍스트 크기
    • 코드를 침범하지 않은채 이슈 풍선이 나타나며, 원클릭으로 여러 이슈를 고칠 수 있음
  • 완전히 새로운 리팩토링 시스템
    • C, ObjC, C++, 스위프트를 지원
    • 코드위에 올리면 부분을 하이라이트하고, 클릭하여 다양한 추출(extractions)처럼 변형/리팩토링을 적용할 수 있음
    • 모든 파일에서 이름 재정의
    • 키보드 단축키를 정할 수 있음
    • 엔진은 오픈소스화 될 것이며, Xcode는 자동으로 여러분에의해 만들어진 변형을 불러올 것임
  • 더 빨라진 인텍서(indexer)
    • 최대 35배까지 "빠르게 열림"
    • 최대 50배까지 빠르게 검색됨
  • 새로운 빌드 시스템(옵트-인 미리보기)
    • 스위프트로 쓰여짐
    • 2.5배까지 빨라진 빌드
    • ObjC/스위프트가 섞인 프로젝트의 빌드가 빨라짐
    • 코드 커버리지 테스팅이 빨라짐
    • 빌드동안 인덱싱을 계속 할 수 있음
  • 스위프트 3.2와 4.0을 포함함
    • 스위프트 버전은 타겟별로 선택할 수 있으며, 한 앱은 두 버전으로 빌드된 모듈을 포함할 수 있음
  • 마크다운 에디터가 통합됨
  • Github이 통합됨
    • 저장소 검색 & 워크플로우 클론
    • 새 저장소를 생성하기위해 프로젝트를 푸시하기
    • github.com에서 "open in Xcode"
    • 새로운 소스 컨트롤 네비게이터
  • 설정에서 계정 패널은 더이상 알고있는 git 저장소 목록을 보여주지 않음
  • 시뮬레이터 증진
    • 동시에 여러 시뮬레이터가 돌아감
    • 이제 시뮬레이터는 디바이스 형태를 다시 가지게됨(Xcode 6에서 없어졌음?)
    • 전원버튼같은 하드웨어 버튼을 누를 수 있음
    • 모서리 스와이프를 지원
    • 유연하게 스케일가능함(해상도가 아니라 크기를 변경)
    • 시뮬레이터의 비디오를 녹화하기
    • 시뮬레이터에 어떤 것을 보내기위해 시스템-와이드 공유 익스텐션(예를들어 사진/비디오, 지도 위치, URL, 앱 등)
  • 무선 디버깅 – WiFi나 이더넷을 통해 원격으로 기기에 앱을 실행하기
    • Quicktime, Safari 인스팩터, 콘솔 등에서도 지원함
  • Xcode는 이제 파일을 이동할때 폴더-그룹 동기화를 유지할 것임
  • 런타임 세니타이저(runtime sanitizers)
    • Main Thread Checker는 백그라운드 스레드에서 UI에 접근하는지 감지함
    • Undefined Behavior Sanitizer는 C/ObjC에서 정의되지 않은 행동 버그를 감지함
    • Address와 Thread Sanitizer의 증진
  • 뷰 디버거(view debugger) 증진
    • 계층의 부분으로 뷰컨트롤러를 보여줌
    • SceneKit과 SpriteKit 화면을 이해함
  • Crashes Organizer는 Spotlight에의해 인덱스된 로컬 .dSYMs 사용을 선택할때 심볼화되지 않은 로그를 심볼화할 것임
  • 문서 브라우저에서 검색이 증진됨
  • Xcode server(CI)는 이제 Xcode에 내장됨
  • Xcode의 여러 복사본은 동시에 돌아감(그러나 9개 이하)
  • 테스트 개선점
    • UI 테스트는 이제 여러 앱으로 뻗어나갈 수 있음
    • 3배에서 10개까지 빠른 UI 테스트
    • 새로운 UI 테스팅 API(예를들어 XCUIScreen.screenshot())
    • 테스트 빌드는 동시에 여러 기기에서 돌아감(xcodebuild를 사용하여)
  • 배포를 위한 서명: 자동 서명하기와 더 커스터마이징가능한 서명하기
  • 어셋 카탈로그(asset catalogs)
    • 어셋 카탈로그에 칼라를 추가할 수 있음
    • 앱 아이콘을 위한 앱 얇게하기(app thining)
    • 어셋 카탈로그는 "preserve vector data" 옵션으로 PDF 포멧의 이미지를 담을 수 있음. 이것은 앱에 벡터 양식을 올릴 수 있으며, 다양한 문맥에서 아이콘을 크게 키울때 사용될 수 있음
    • HEVC와 HEIF 어셋을 지원
  • 스위프트에서 프로토콜에의해 요구되는 모든 메소드 추가를 수정
  • 300개 이상의 새로운 진단, 분석, 수정이 있음
  • 새로운 "Strip Swift Symbols"는 바이너리에서 스위프트 심볼을 strip하는 설정을 만들어, 그 크기를 줄임(디폴트로 활성화됨)됨
  • IB에서 constraint가 선택되면 그 엘리먼트의 위치를 변경할 수 있고, 그 상수는 업데이트 될 것임
  • 개선된 템플릿 메크로 시스템(?)

Swift 4
  • 줄어든 바이너리 사이즈
  • 더 나아지고 예측가증한 성능
  • 마이그레이션이 필요하지만, 아주 조금
  • String 개선
    • 사용하기 더 쉬워짐(예를들어 다시 컬랙션이 됨 .characters를 호출할 필요가 없음, 쉬워진 슬라이싱)
    • 더 나은 성능
    • 더 올바른 유니코드 지원(예를들어 이모티콘 다룰때)
    • 다열- 문자열 리터럴("""...""")
    • CharacterunicodeScalars를 가짐
    • 문자열 슬라이스는 이제 새로운 타입인 Substring을 가짐(StringProtocol을 통해 String과함께 더욱 기능을 공유함)
  • DictionarySet 개선점
    • 키-값 쌍의 시퀀스로부터 딕셔너리를 생성하기
    • 깃셔너리와 셋을 같은 타입의 값으로 필터링하기
    • 딕셔너리 값들을 새로운 딕셔너리로 맵핑하기
    • 그룹화된 시퀀스를 딕셔너리로
    • 디폴트 값과 함께 Dictionary 서브스크립팅 하기
  • Codable – 인코딩/디코딩을 위한 새로운 API(예를들면 JSON에서)
  • \Person.name – 운 강타입 키패스
  • NSRange에서/으로부터 Swift.Range 변환
  • observe(keyPath) { observed, change in ... } – 블럭기반 KVO
  • private 속성/메소드는 같은 파일내의 익스텐션에서 접근가능
  • associatedtype을위한 where
  • @objc는 이제 대붑ㄴ의 경우에 명시적으로 추가될 필요가 있음
  • MutableCollection.swapAt(x, y)
  • 일부분 범위(5..., ...5)
  • 제네릭 서브스크립트(파라미터나 리턴값도 제네릭이 될 수 있음)
  • 클래스와 프로토콜 요구사항 합치기: var x: UIView & Animatable
  • 독점적 메모리 접근(exclusive access to memory) – 다른 곳에서 수정되는 값에 올바르게 접근하는지 체크하는 컴파일러 체크와 런타임 체크
  • Swift Package Manager의 다양한 개선사항들

ObjC
  • 스위프트에서처럼 배포타겟보다 최신의 API 사용을 감지함(@available)

App Store & iTunes Connect
  • 앱스토어를 우한 앱 아이콘은 이제 바이너리에서 어셋 캍탈로그안에서 배포될 것임
  • 앱 이름은 30자까지 제한됨
  • 앱 이름 아래 새로운 부제목 필드가 생김(또한 30자)
  • 설명은 이제 새 버전을 제출할때만 편집할 수 있게될것임
  • 새로운 프로모셔널 텍스트 필드(170자) – 설명의 시작부분에 보여지며, 언제든지 편집할 수 있음
  • 앱의 프리뷰 비디오를 3개까지 올릴 수 있고, 자동으로 재생될 것임(이때는 소리없이)
  • 단계별 배포(phased releases) – 자동 다운로드으로 설정한 사용자들은 한주마다 점차 앱을 받음
  • 인앱구매는 앱과는별개로 앱스토어에서 판촉될 수 있음
  • 평점은 더이상 모든 업데이트마다 자동으로 리셋되지 않음(여러분이 직접 리셋할 수 있음)
  • (아직 엄격하게 제약하진 않았지만)리뷰를 요구할때 SKStoreReviewController만 사용할것을 강력하게 추천함 (1.1.7)
  • 실행가능한 코드를 다운받는 프로그래밍 IDE는 이제 몇 조건과 함께 앱스토어에서 가능함 (2.5.2)
  • TestFlight 외부 테스터 제한이 1만명으로 올라갈 것임

Safari
  • CSS stroke 지원
  • variable fonts 지원
  • 드래그 앤 드롭 이벤트
  • WebCrypto API 업데이트
  • 컨텐트 블락커(content blockers)에서 if-top-urlunless--top-url 규칙
  • Brotli 컨텐트 인코딩을 지원

다른것들
  • Swift Playgrounds 2.0
    • 구독 모델로 플레이그라운드 컨텐트의 제공 호스팅
    • 스위프트4와 iOS11 SDK, 카메라, AR API 지원
    • 통합된 문서
    • 8가지 새로운 지역화
  • Business Chat (preview) – iMessage로 여러분의 고객이 여러분에게 연락할 수 있도록 해주는 회사를 위한 서비스
  • HomeKit 프로토콜은 이제 모두에게 무료로 공개됨(비영리 목적)
  • iCloud 저장소 플랜은 가족 모두와 공유될 수 있음


이 블로그는 공부하고 공유하는 목적으로 운영되고 있습니다. 번역글에대한 피드백은 언제나 환영이며, 좋은글 추천도 함께 받고 있습니다. 피드백은 

으로 보내주시면 됩니다.



WRITTEN BY
tucan.dev
개인 iOS 개발, tucan9389

,