【iOS 11】開発者ドキュメントから見る iOS 11 の新機能 #WWDC17

（WWDC17初日に[ブログに書いた記事](http://d.hatena.ne.jp/shu223/20170606/1496710194)を再編したものになります）
ついにiOSも10年目。だいぶ成熟してきて、今年は特に何も期待しないまま参加したのですが、開発者的には非常にワクワクする発表がたくさんありました。


基調講演の内容からではなく、ベータ公開されたiOS Dev CenterのAPIリファレンスを見て、<b>個人的に／開発者目線から気になった新API</b>を挙げていきます。


##Core ML

iOS 10からMetal Performance Shaders（以下MPS）に追加されたCNN関連機能、足りないものが色々とあり、ここらへんは拡充されたら嬉しいなとは思っていましたが、新フレームワークとして登場しました。


おいおい、さらに増えたら <span class="deco" style="color:#FF0000;">MPSCNN / BNNS / Core ML とどう使い分け</span>るんだ、と思いましたが、ドキュメントの図で棲み分けがわかりました。

<img width="356" alt="coreml.png" src="https://qiita-image-store.s3.amazonaws.com/0/3180/7fb3f1f2-3185-f6f1-23de-fa63c155fe59.png">


<b>Keras や Caffe で学習したモデルを BNNS や MPSCNN で使えるようにするのが Core ML</b>のようですね。

```swift
import coremltools
coreml_model = coremltools.converters.caffe.convert('my_caffe_model.caffemodel')
```

```swift
coreml_model.save('my_model.mlmodel')
```


実際、学習済みモデルを持ってくるところは扱いづらい仕様だったので、これは嬉しいです。


- [iOSのMPSCNNに渡すモデルパラメータのフォーマット / TensorFlowからの書き出し - Qiita](http://qiita.com/shu223/items/c735ab888a83f214f89a)
- [iOSのMetalで畳み込みニューラルネットワーク - MPSCNNを用いた手書き数字認識の実装 - Qiita](http://qiita.com/shu223/items/bdd537f38872a5af4e4c)


##Metal Performance Shader

上でMPSという略語を何度かもう出しましたが、MPS自体にもいくつか新規追加APIがあります。その中でも目を引くのが Recurrent Neural Networks（RNN / 再帰型ニューラルネットワーク）関連のAPI群。

- MPSRNNImageInferenceLayer
- MPSRNNMatrixInferenceLayer
- MPSRNNSingleGateDescriptor
- MPSGRUDescriptor
- MPSLSTMDescriptor
- MPSRNNSequenceDirection

RNNは、文書解析に向いていて、自然言語処理の分野で成果を挙げているとか。勉強します。


##Vision

これも新フレームワーク。<b>画像解析・コンピュータビジョンで顔を識別したり、シーンを分類したりするフレームワーク</b>のようです。APIを見てると Core Image の CIDetector の下回りがこれなのかなぁという品揃えです。

- Face Detection and Recognition
- Machine Learning Image Analysis
- Barcode Detection
- Image Alignment Analysis
- Text Detection
- Horizon Detection
- Object Detection and Tracking

ちなみにドキュメント冒頭で "detect faces" ではなく "identify faces" という言い方をしてるのと、"Face Detection <b>and Recognition</b>" とわざわざ書いてあるので、顔検出ではなく、「これは誰々だ」という顔の認識までしてくれるのかなと期待しましたが、今のAPIを見た限りだと従来の顔の矩形検出っぽいです。今のところは。


いや、それにしてもこれは嬉しいです。もっとAPI掘ってみます。


##ARKit

これは基調講演でも盛り上がってましたねー

<img width="690" alt="arkit.png" src="https://qiita-image-store.s3.amazonaws.com/0/3180/d4db5633-616d-13bf-c6fc-2afa1a96ed3a.png">


私事ですが、勤めている会社のアプリ [Fyuse](https://itunes.apple.com/app/fyuse-3d-photos/id862863329?mt=8) でこういうものを実装しました。


<img src="https://qiita-image-store.s3.amazonaws.com/0/3180/3428fe4d-93ba-3af2-e9db-e6adc699bf89.jpeg" width="500">


Fyuseというアプリは<b>スマホで3D的な写真を取る</b>アプリなのですが、実装した機能というのが、<b>タップして選んだ対象の周囲に3Dの「ARガイド」を表示して、撮影を補助するもの</b>です。


![arguide.gif](https://qiita-image-store.s3.amazonaws.com/0/3180/a7365b12-63fd-3a06-e157-f7d3640b0d0b.gif)


で、これがiOSの実装的に言うと、

- カメラからの入力画像を解析してリアルタイムに物体追跡
- カメラの姿勢と対象物体の位置・角度からARガイドを表示する

というところで、<b>AVFoundation、Metal、SceneKit</b>（＋コアとなる画像処理：弊社リサーチチームによる実装）が要素技術になってきます。


僕は3Dの取り扱いにまだ慣れてなくて、<b>カメラからの入力・iPhoneのスクリーンという2Dの世界</b>と、<b>デバイスの姿勢・SceneKitで構築する3Dの世界</b>とを行き来するのに苦労しました。


こういうのをARKitはやりやすくしてくれるものなのかなと思います。具体的なAPIはまた後ほど見たいと思います。


##Depth API

基調講演で「Depth API」って言ってて、「きたー！」と思いましたが、

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Depth API! <a href="https://twitter.com/hashtag/WWDC17?src=hash">#WWDC17</a> <a href="https://t.co/VEp1wLIeNw">pic.twitter.com/VEp1wLIeNw</a></p>&mdash; Shuichi Tsutsumi (@shu223) <a href="https://twitter.com/shu223/status/871790773091553281">2017年6月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<b>AVFoundationを見るも、新規追加APIはなし</b>。

どこにあるのか・・・と思ったらFacebookやTwitterで @hkato193 さん、@Gemmbu に教えていただいて、 `AVCaptureDepthDataOutput` という新規APIがあることがわかりました。（新しいドキュメントのdiffの見方を間違ってました）

##Core Bluetooth on watchOS

Core Bluetooth が watchOS でも使えるようになったようです。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Core Bluetooth on watchOS! <a href="https://twitter.com/hashtag/WWDC17?src=hash">#WWDC17</a></p>&mdash; Shuichi Tsutsumi (@shu223) <a href="https://twitter.com/shu223/status/871780446656278532">2017年6月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


ドキュメント見ると、核となるクラスである CBCentralManager や CBPeripheralManager が <span class="deco" style="color:#FF0000;">"watchOS 2 +"</span> となっていて、"4.0+" の間違いなのかほんとなのか謎ですが、いずれにせよ、<b>時計から外部デバイスを操作できる</b>って、ワクワクしませんか・・・？僕はします。またウォッチいじりたくなりました。


Core Bluetoothについて新たに勉強したくなった方にはこちらの書籍がおすすめです。

-[『iOS×BLE Core Bluetooth プログラミング』の紹介 - Qiita](http://qiita.com/shu223/items/e1c91f176a48475cd2ad)


##Core NFC

基調講演でチラッとNFCの文字が見えましたが、新フレームワークが追加されてました。何ができるようになったのか、あとでAPIを見ます。

→ その後FacebookでNoriaki Misawaさんより、以下のように情報いただきました。

> CoreNFCはType1-5までのNDEFが読めるようになりました。それだけみたいです。コード書いて試そうとしたら、7じゃないとダメだそうで、それ知る前に6sをiOS11にしてしまったので焼き直しです。。


##SiriKit

開発者ドキュメントでは"Lists and Notes"という、NotesやToDoリストを作成・管理するものが追加されてますが、基調講演では他にももっとたくさんできることが増えたって言ってたような。


##その他

###MusicKit

基調講演でチラッと行ってた気がするけどAPIリファレンスに見当たらないような。。。


いや、Musicライブラリまわりの連携って、実は結構苦しいこと多くないですか？なので、何が新たにできるようになったのかは知っておきたいなと。

→ FacebookでIkuya Omatsuさんより以下のように情報いただきました。

> AppleMusicAPI Refならありました

（今日のWWDCのMusicKitのセッションのResourceリンクにもこれが貼られてました）

###RPScreenRecorder（ReplayKit）

ReplayKitに追加された、アプリのスクリーンビデオを撮るためのクラス。そもそもReplayKitってそういうものじゃなかったでしたっけ？たまに画面を録画する機能をサクッとつくりたいケースはあるので、以前のと何が違うのか、見ておきたいなと。

→ ブログに @k_katsumi さんより以下のようにコメントをいただきました。

> ReplayKitのRPScreenRecorderは録画した結果をファイルなどで取得することはできなかったのですが、それが新しいメソッドが追加されてサンプルバッファを取得できるようになってるので、デバッグ用途とか使いどころが増えますね。

###SCNCameraController（SceneKit）

何をするものでしょうか？あとで見る。


###NEHotspotConfiguration

WiFi関連のAPIが今更新たに公開されるのって、どういう文脈に沿ってるんでしょうか？何にせよ外の物理的な何かと連携するAPIは好物なので、見ておきたいです。


###Xcode 9

いろいろ劇的に改善されましたね。


##関連

- [API Diffsから見る iOS 10 の新機能 #WWDC2016 - Qiita](http://qiita.com/shu223/items/9ac3261cdbf2a35468ed)
- [iOS 10の新機能のサンプルコード集「iOS 10 Sampler」 - Qiita](http://qiita.com/shu223/items/f371655c2b101f1b0218)