API Diffsから見る iOS 10 の新機能 #WWDC2016

タイムラインでは「つまんねー」「Apple終わってる」「ジョブズがいればこんなことには・・・」という落胆の声をたくさん見かけましたが、"[iOS 10.0 API Diffs](https://developer.apple.com/library/prerelease/content/releasenotes/General/iOS10APIDiffs/)" や "[What's New in iOS](https://developer.apple.com/library/prerelease/content/releasenotes/General/WhatsNewIniOS/Articles/iOS10.html#//apple_ref/doc/uid/TP40017084-SW1)" 等のプレリリースドキュメントを見ると今回も新しい機能/APIが数多く追加されていて、個人的には非常にワクワクしております。

![wwdc.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/02093845-6fe7-938b-4566-0e018b7071cb.jpeg)

以下、気になったものを列挙していきます。


##VoIP API / CallKit

[BONXというVoIP通話するプロダクトを手伝っている](http://d.hatena.ne.jp/shu223/20151015/1444869631)関係で、IP通話がどんな感じでできるようになるのか（サーバーは自分で用意するのかとか）、非常に気になります。


"Speakerbox: Using CallKit to create a VoIP app" という公式サンプルが公開されているので、後でコードを見てみようと思います。


##SiriKit / Intents / IntentsUI

ついにSiriのAPIが開発者に開放されました。What's New in iOS でも一番上に書かれているので、Appleとしても iOS 10 の目玉と考えているのではないでしょうか。


SiriKit というフレームワークがあるわけではなくて、Intents / Intents UI というフレームワークがその実体となるようです。以下の6つのドメインをサポートする、とのこと。

- Audio or video calling
- Messaging
- Sending or receiving payments
- Searching photos
- Booking a ride
- Managing workouts

これだけ見ても何がどんな感じでどこまでできるのか、全然ピンと来ないので、後ほど以下の公式サンプルを試してみます。

- IntentHandling: Using the Intents framework to handle custom Siri request
- UnicornChat: Extending Your Apps with SiriKit


##音声認識API / Speech

SiriKitとは別に、<b>音声認識のAPI</b>が追加されました。<b>リアルタイム音声にも、録音済み音声にも</b>使えるようです。

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


"SpeakToMe: Using Speech Recognition with AVAudioEngine" という公式サンプルが公開されているので、すぐに試せます。SFSpeechRecognizerの初期化時に Locale を渡せるようになってますが、日本語もいけるのでしょうか（あとでやってみます）

```swift
private let speechRecognizer = SFSpeechRecognizer(locale: Locale(localeIdentifier: "en-US"))!
```


###2016.6.15追記

実際に試して記事を書きました！

- [Speechフレームワークで音声認識 - 対応言語は58種類！](http://qiita.com/shu223/items/ca8e62803e83e396c177)


##AVFoundation

###AVCapturePhotoOutput

AVFoudationで写真を撮る際に使用していた AVCaptureStillImageOutput が deprecated になり、iOS 10 では AVCapturePhotoOutput という新クラスを使うようです。すべての写真ワークフローにunifiedなパイプラインを提供する、とのことですがカメラに詳しいわけでもないので使ってみないとわからないのですが、AddedなAPIを見ていると、<b>Live Photo 撮影機能</b>が開発者に開放されてたりと、色々とできることが増えてそうです。

```swift
AVCapturePhotoCaptureDelegate.capture(_: AVCapturePhotoOutput, didFinishProcessingLivePhotoToMovieFileAt: URL, duration: CMTime, photoDisplay: CMTime, resolvedSettings: AVCaptureResolvedPhotoSettings, error: NSError?)
AVCapturePhotoCaptureDelegate.capture(_: AVCapturePhotoOutput, didFinishRecordingLivePhotoMovieForEventualFileAt: URL, resolvedSettings: AVCaptureResolvedPhotoSettings)
AVCapturePhotoOutput.isLivePhotoAutoTrimmingEnabled
AVCapturePhotoOutput.isLivePhotoCaptureEnabled
AVCapturePhotoOutput.isLivePhotoCaptureSupported
AVCapturePhotoOutput.isLivePhotoCaptureSuspended
AVCapturePhotoSettings.livePhotoMovieFileURL
AVCapturePhotoSettings.livePhotoMovieMetadata
AVCaptureResolvedPhotoSettings.livePhotoMovieDimensions
```

###AVPlayerLooper

メディア（オーディオ・ビデオのことだと思われる）の特定箇所を簡単にループさせられるクラス、とのこと。


##Messages

長々とキーノートで紹介されたMessagesアプリの新機能。「使ってないし。。」という声を多くタイムラインで見かけました。が、Messagesというフレームワークが追加され、開発者ができることも何やら増えたようです。


What's New によると、App ExtensionをつくってMessagesアプリと自分のアプリを連携させられるようです。つくれるApp Extensionは以下の2種類：

- ステッカーパック（ユーザーがMessagesで使うことができる）
- Messages内で使えるカスタムUI（iMessage appと呼ぶ）

"Ice Cream Builder: A simple Messages app extension" という公式サンプルが公開されています。あと[リファレンス](https://developer.apple.com/reference/messages)もパッと見ですがプログラミングガイド的にわかりやすく書かれてそうでした。


##Core Image

キーノートでのPhotosの話の中で、顔だけじゃなくて「乗馬」みたいな<b>シーンも認識</b>するようになった、という話があって、CIDetector, CIFeatureにもそのへん追加されてるのかなと思ったら API Diffs には残念ながらそういう変更が見当たりませんでした。


フィルタは以下の5つが追加されたとのこと。アップサンプリングフィルタはちょっと試してみたい。

- CINinePartTiled
- CINinePartStretched
- CIHueSaturationValueGradient
- CIEdgePreserveUpsampleFilter
- CIClamp


僕は一眼レフユーザではないので使わなそうですが、RAW画像を扱えるようになったとのこと。

> RAW image file support is now available on iOS devices that use the A8 or A9 CPU. Core Image can decode RAW images produced by several third-party cameras as well as images produced by the iSight camera of supported iOS devices (to learn more, see AVFoundation). To process RAW images, use filterWithImageData:options: or filterWithImageURL:options: to create a CIFilter object, adjust RAW processing options with the keys listed in RAW Image Options, and read the processed image from the filter’s outputImage property.


あと、`imageWithExtent:processorDescription:argumentDigest:inputFormat:outputFormat:options:roiCallback:processor:` というメソッドが何か重要そうなのですが、理解に自信がないのでWWDCのセッション見てからコメントします。

> You can now insert custom processing into a Core Image filter graph by using the imageWithExtent:processorDescription:argumentDigest:inputFormat:outputFormat:options:roiCallback:processor: method. This method adds a callback block that Core Image invokes in between filters when processing an image for display or output; in the block, you can access the pixel buffers or Metal textures containing the current state of the processed image and apply your own image processing algorithms.


##MapKit

Addedは以下の3つだけ。

```swift
MKAnnotationView.init(coder: NSCoder)
NSUserActivity.mapItem
MKLaunchOptionsDirectionsModeDefault
```

キーノートではMapアプリの新機能の話があったのに、これだけ？と一瞬思いましたが、NSUserActivity に追加された `mapItem` というプロパティが重要っぽいです。What's New の Proactive Suggestions の項に以下のように解説されています。

> In iOS 10, the NSUserActivity object includes the mapItem property, which lets you provide location information that can be used in other contexts. For example, if your app displays hotel reviews, you can use the mapItem property to hold the location of the hotel the user is viewing so that when the user switches to a travel planning app, that hotel’s location is automatically available. And if you support app search, you can use the new text-based address component properties in CSSearchableItemAttributeSet, such as thoroughfare and postalCode, to fully specify locations to which the user may want to go. Note that when you use the mapItem property, the system automatically populates the contentAttributeSet property, too.

キーノートで話してた機能と関連することだとは思いますが、正直これも自分で試してみないとよくわからない。。


##Core Bluetooth

ある程度枯れてるのでハード的にBluetooth 5.0がサポートされるとかがない限りはそんなに変更ないかなと思ってましたが、やはりそんなに大きな変更はありませんでした。


主な変更点としては、

```swift
CBCentralManager.state
CBPeripheralManager.state
```

がなくなって、代わりにこれらの状態を管理するクラス CBManager というのが追加された、という点です。Bluetoothの状態をこのクラスから取るようになった、というだけかと。

```swift
CBManager.state
CBManagerState [enum]
CBManagerState.poweredOff
CBManagerState.poweredOn
CBManagerState.resetting
CBManagerState.unauthorized
CBManagerState.unknown
CBManagerState.unsupported
```

また、CBCentralManager と CBPeripheralManager に引数なしの初期化メソッドが追加されました。

```swift
CBCentralManager.init()
CBPeripheralManager.init()
```

あと、キャラクタリスティックのValueの有効範囲を指定する Descriptor の UUID を示す定数が追加されています。

```swift
CBUUIDCharacteristicValidRangeString
```

（Valid Range ディスクリプタの公式ドキュメント）

- https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorsHomePage.aspx
- https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.valid_range.xml

##Core Motion

Significant Elevation まわりのAPIが追加されていて、（Core Locationの）Significant Location のようにバックグラウンドでバッテリーを節約しつつ大まかな高度の変化を取れるような感じになったのかなと。

```swift
CMAltimeter.isSignificantElevationAvailable() -> Bool [class]
CMAltimeter.querySignificantElevationChange(from: Date, to: Date, withHandler: CoreMotion.CMSignificantElevationSampleHandler)
CMAltimeter.startSignificantElevationUpdates(handler: CoreMotion.CMSignificantElevationSampleHandler)
CMAltimeter.stopSignificantElevationUpdates()
CMSignificantElevationSample
CMSignificantElevationSample.elevationAscended
CMSignificantElevationSample.elevationDescended
CMSignificantElevationSample.endDate
CMSignificantElevationSample.startDate
CMSignificantElevationSampleHandler
```

##新App Extension

個人的にはExtensionは全然つくってないのですが、「開発者ができること」としては重要なので、何が追加されて何ができるようになったのか、はおさえておきたいと思っています。


iOS 10 では以下の Extension Points が追加になったようです。

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

あと、サードパーティ製のキーボードのExtensionが強化されたとのこと。


##あとで見る

###Proactive Suggestions

いろいろ賢くなったよ、という話っぽいが、What's New で長めに書かれていて、関連フレームワーク・クラスも多いので後で読む。

###UserNotifications / UserNotificationsUI / VideoSubscriberAccount

新フレームワークだけど、名前的には必要になったときに見ればいいかな、と思うのでまた後ほど。


##その他、あまり変更がなかったフレームワーク

ここに書いた以外にもたくさんありますが、API Diffsでページを開いて見たものの中で、追加APIがなかった、もしくは「ほとんど」なかったものもまとめておきます。

以下はAddedなAPIなし。

- AudioUnit
- CoreLocation
- CoreAudioKit
- ExternalAccessory
- OpenAL
- MultipeerConnectivity
- HealthKitUI

以下はほとんどAddedなし、もしくは気になる変更がなかった。

- AVKit
- CoreAudio
- OpenGLES


##watchOS 3 の新機能

量が多いので別記事としてまとめました。個人的には**改善して欲しかったところがちゃんと改善**されてて好印象です。

- [API Diffsから見る watchOS 3 の新機能 - Qiita](http://qiita.com/shu223/items/c3a0e28c7b4a3085966a)


##バックナンバー

- [【iOS9】API Diffs から見る iOS 9 の新機能 #wwdc - Qiita](http://qiita.com/shu223/items/c70f99c4c121f41e7845)