【iOS9】API Diffs から見る iOS 9 の新機能 #wwdc

本日 WWDC 2015 が始まりました。基調講演だけ見ると開発者的にでかい話は Swift 2 と watchOS 2 ぐらいかな、という感がありますが、「[iOS 9.0 API Diffs]((https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/index.html#//apple_ref/doc/uid/TP40016222))」や「[What's New in iOS](https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-SW1)」を見ると今回も新しい機能が数多く追加されているようです。分量が多すぎてほんの一部しか見れてませんが、気になったものを列挙していきます。

※ 本記事は Apple による公開ドキュメント（ログイン不要領域にある）を元に構成しています


##App Extension

App Extension は、iOS 8 から導入された、アプリの機能を他のアプリからも使えるようにするためのしくみですが、なんでもかんでもできるわけじゃなくて、あらかじめ決められている "Extension Points" に限って利用可能な機能です。

- 参考記事：[【iOS8】App Extension の実装方法 その１：Action](http://d.hatena.ne.jp/shu223/20140606/1402015233)
  - （たとえば上の記事で解説している Extension Points のひとつ "Action" は UIActivityViewController で利用する機能を追加できるもの）


で、iOS 9 ではさらに**いくつかの Extension Points が追加**されました。

- Network extension points:
- Safari extension points:
- Spotlight extension points:
- The Audio Unit extension point

What's new にはそれぞれ用途の例が示されています。Audio Unit extension とかはわかりやすくて、たとえば自分のアプリで持っているオーディオエフェクトの機能を他のアプリでも使えるようにできるような Extension のようです。


##Core Image

What's new では触れられていませんが、API Diffs を見ているといろいろと楽しそうな名前が並んでいます。

- CITextFeature
- CIDetectorTypeText

新規追加のこの２つのクラス名から察するに、**CIDetector で文字認識が可能に**なったのかなと。


- 関連記事：[『OpenCV 3.0 on iOS』 #yidev 第19回勉強会](http://d.hatena.ne.jp/shu223/20150518/1431901401)（OpenCV を用いた文字検出・認識）


##UIKit

目立つ新規クラスとしては "UIStackView" がありますが、説明読んでもありがたみがピンとこず。サブビューのセットを管理しやすくしてくれる何か、らしいけど。。使ってみます。


<img src="http://f.st-hatena.com/images/fotolife/s/shu223/20150608/20150608183608.png" width="300">


あとは UIEvent に `coalescedTouchesForTouch:`, `predictedTouchesForTouch:` が追加されてます。まだドキュメント出てないので詳細不明ですが、とにかく**新しいタッチイベント**です。What's new では下記のように説明されています。

> such as the ability to get access to intermediate touches that may have occurred since the last refresh of the display and touch prediction.


あと UIKit dynamics 関連。UIDynamicItem `collisionBoundingPath`、UIDynamicItemCollisionBoundsType の `.Ellipse`, `.Path` により、**矩形以外の自由な図形での衝突判定**がサポートされるようです。あと、さまざまなフィールドタイプをサポート、カスタム可能にする UIFieldBehavior というクラスが新規追加されています。


##AVFounadtion

iOS 7 で追加された音声合成のAPI、AVSpeechSynthesisVoice に色々とAPIが追加されています。`identifier`, `init(identifier: String)`, `name`, `quality` といった API が追加されていて、<b>声の品質や、idで声の種類を指定できる</b>ようになる模様。identifier に指定できる定数としては `AVSpeechSynthesisVoiceIdentifierAlex` というのが用意されています。

- 関連記事：[iOSで使える日本語OKな音声読み上げエンジン8種（TTS,音声合成）](http://qiita.com/shu223/items/223492e4f061032e652e)


他にも AVAudioSequencer、AVBeatRange とか気になる名前のものがありますがドキュメントないとよくわからないのでまた後ほど。


##Foundation

NSProcessInfo に `NSProcessInfoThermalState` というものが追加されていて、<b>デバイスの温度の状態を表す</b>もののようです。


iOSについてはまだドキュメントがないのですが、ググると（一足先に導入された）OS X の「[Energy Efficiency Guide for Mac Apps](https://developer.apple.com/library/mac/documentation/Performance/Conceptual/power_efficiency_guidelines_osx/RespondToThermalStateChanges.html) 」というものが出てきました。


このドキュメントによると、`NSProcessInfoThermalStateNominal` （デバイス温度は許容レベル）とか、`NSProcessInfoThermalStateSerious` （ヤバイ）とか、`NSProcessInfoThermalStateCritical` （もうダメ。即刻冷やすべし）とかがあるようです。（というかこのドキュメント、Recommended action とかも書いてあってたぶん iOS でも参考になりそう）


##AVKit

AVPictureInPictureController というビューコントローラが追加されています。画面の中に小さい画面を表示するようなことを Picture in Picture と呼ぶらしいです。


##MapKit

箇条書きで。

-  MKMapType `.HybridFlyover`, `SatelliteFlyover`
  -  標準マップアプリで iOS 8 あたりからできるようになった <b>3D Flyover モードがマップタイプとして選べるようになった</b>
- MKAnnotationView `detailCalloutAccessoryView`, MKPinAnnotationView の追加プロパティ諸々
   - アノテーションが can be fully customized になったとのこと
   - （前からカスタマイズはできてたので、これらの追加APIで「カスタマイズしやすくなった」ということか？）
-  MKMapView `showsCompass`, `showsScale`, `showsTraffic`
  -  名前の通り、MKMapView に方位や縮尺や渋滞情報を表示できるようになったのかと。


##Core Bluetooth

新規追加機能はほとんどなし。以下の2つの Added は地味に嬉しい。

- CBCentralManager `isScanning`
- CBPeripheralState `.Disconnecting`

Scanning かどうか自分でメンバ変数用意して管理してたので。。（CBPeripheralManager に `isAdvertising` はあるのになんで？って思ってた）




##HealthKit

What's new には

> New support for tracking areas such as reproductive health and UV exposure.

と書いてあります。"reproductive health" っていうのはググってみると「性と生殖にかかわる健康」とあって、妊娠・出産・避妊などの話のようです。UV exposure は紫外線を浴びた量。それらを新たに HealthKit で管理できるようになった、とのこと。


API Diffs を見ると新規追加クラスは上記に関するもの以外にもたくさんあって、たとえば HKDevice というのが追加されてて、デバイスの情報を保持するクラスのようです。

- HKDevice
  - `firmwareVersion`
  - `hardwareVersion`
  - `manufacturer`
  - `model`
  - `name`
  - `softwareVersion`
  - `UDIDeviceIdentifier`


あと HKWorkoutSession という新クラスもあって、ワークアウトの情報を取れるようにするものなのかなと。

- HKWorkoutSession
  - `activityType`
  - `locationType`
  - `state`
- HKWorkoutSessionDelegate
  - `workoutSession:didChangeToState:fromState:date:`
  - `workoutSession:didFailWithError:`
- HKWorkoutSessionLocationType
  - `HKWorkoutSessionLocationTypeIndoor`
  - `HKWorkoutSessionLocationTypeOutdoor`
  - `HKWorkoutSessionLocationTypeUnknown`
- HKWorkoutSessionState
  - `HKWorkoutSessionStateEnded`
  - `HKWorkoutSessionStateNotStarted`
  - `HKWorkoutSessionStateRunning`


##HomeKit

What's new では HomeKit に一切触れられていないのですが、新機能のオーバービュー的なページの「[iOS 9 for Developers](https://developer.apple.com/ios/pre-release/)」では、

- サポートするアクセサリの種類を増やした
- <b>iCloudからの遠隔操作</b>等、アクセサリとinteractする方法を増やした

とあります。


API Diffs も非常に多くのAPIが新規追加されているのですが、なにぶんこれまで対応デバイスがなかったもので、そもそも本フレームワークをがっつり触ったことがないので新APIのありがたみが正直まだピンときてません。


今回、サンフランシスコの Apple Store にて HomeKit 対応デバイスをゲットできたので、後日色々試してみようと思っています。


##その他

新規追加の Search、CoreSpotlight、WatchConnectivity と、WatchKit についてはもうちょっと具体的に調べてまた別記事で書きたいと思います。


##（追記）iOS 9 のサンプルコード集

知る人ぞ知る（？）、恒例のサンプル−コード集をつくりました！

- [iOS 9 の新機能のサンプルコード集](http://qiita.com/shu223/items/467dc48b9624d3195be2)
 

watchOS 2 のサンプルコード集もあります。

- [watchOS 2 の新機能のサンプルコード集 - Qiita](http://qiita.com/shu223/items/0a005628f488b9059753)

いずれもGitHub にて公開しております。



##（追記）iOS 10 の新機能

- [API Diffsから見る iOS 10 の新機能 #WWDC2016 - Qiita](http://qiita.com/shu223/items/9ac3261cdbf2a35468ed)