1年遅れのWWDC 2015 Tour

これは [iOS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ios) 18日目の投稿です。
昨日17日目は[@tarappo](http://qiita.com/tarappo)さんの[ipaファイルの中身を調べる](http://qiita.com/tarappo/items/9600677bd02eb8558a49)でした。ちょうどfastlaneのresignについて調べようと思っていたところなので、事前知識がまとまっていてありがたかったです！

# 背景
10月の勉強会で[@takasek](https://twitter.com/takasek)さんと話している時に、「去年のWWDC2015見直すといいよ」と言われ、
"うちまだiOS8対応してるもんなぁ" 
なんて思っていたのですが、その2日後に予期せずして突然のiOS8切りが決定したので、約1.5ヶ月の間に見直したビデオ中からピックアップして、学んだことなどを書きます。

# この投稿で紹介するセッション
* App Frameworks
    * [Advanced Touch Input on iOS](https://developer.apple.com/videos/play/wwdc2015/233/)
    * [Introducing Safari View Controller](https://developer.apple.com/videos/play/wwdc2015/504/)
    * [Mysteries of Auto Layout, Part 1](https://developer.apple.com/videos/play/wwdc2015/218/)
    * [Mysteries of Auto Layout, Part 2](https://developer.apple.com/videos/play/wwdc2015/219/)
    * [New UIKit Support for International User Interfaces](https://developer.apple.com/videos/play/wwdc2015/222/)
    * [What's New in Storyboards](https://developer.apple.com/videos/play/wwdc2015/215/)
    * [What's New in UIKit Dynamics and Visual Effects](https://developer.apple.com/videos/play/wwdc2015/229/)
* Media
    * [What's New in Core Image](https://developer.apple.com/videos/play/wwdc2015/510/)
* System Frameworks
    * [Your App and Next Generation Networks](https://developer.apple.com/videos/play/wwdc2015/719/)

他に [What's New in Core Data](https://developer.apple.com/videos/play/wwdc2015/220/) とかも見たんですが、前提知識がなさすぎてついていけませんでした...


##### 前提
**この投稿内のSwiftコードはSwift 3に書き換えています。**

# [WWDC 2015 Videos](https://developer.apple.com/videos/wwdc2015/)

## App Frameworks
### [Advanced Touch Input on iOS](https://developer.apple.com/videos/play/wwdc2015/233/)
iOSでCore Animation, Metal, OpenGLがどのように内部処理されているかのセッション
結論から言うと、iOS 8では4/60秒フレームかかっていた描画処理が、iOS 9では3/60秒フレームになったらしい。さらにデバイスのスペックがいいものだと2.5/60秒フレームにまで短縮できるようになった。
またMetal, OpenGLはGPUで処理後に上位レイヤーであるCore Animationに処理を渡すことなく、直接LCDにパイプラインを繋げるようになったとのこと。
![233_advanced_touch_input_on_ios.jpg](https://qiita-image-store.s3.amazonaws.com/0/78710/78c5039d-6ce3-cb04-b422-deecd3850bf5.jpeg)

![233_advanced_touch_input_on_ios.jpg](https://qiita-image-store.s3.amazonaws.com/0/78710/3b7f5421-724b-cf23-742f-90463d948be1.jpeg)
(https://developer.apple.com/videos/play/wwdc2015/233/)

iPad Air 2ではタッチスキャンが60Hzから120Hzになったので、指が動いた軌道をより滑らかに追うことが可能になりました。iPhone 7ではどうなのか調べてみたのですが見当たらず。どなたか情報をお持ちでしたら、教えてください。
また、2つのAPIが追加されました。
`UIEvent.coalescedTouchespredictedTouches(for:)` はMain touchを引数に軌道上の間を埋めるUITouch取得でき、`UIEvent.predictedTouches(for:)` はMain touchの先の軌道を予測したUITouchを取得できます。

```swift
for touch in touches {
    let line = line(for: touch)
    for coalescedTouch in event.coalescedTouches(for: touch) {
        addSample(for: coalescedTouch, to: line)
    }
    removePredictedSamples(from: line)
    for predictedTouch in event.predictedTouches(for: touch) {
        addPredictedSample(for: predictedTouch, to: line)
    }
}
```

## [Introducing Safari View Controller](https://developer.apple.com/videos/play/wwdc2015/504/)
タイトル通りSFSafariViewControllerについてのセッション
今考えるとATSによって、WebViewでWebサイトを開けなくなることを防ぐためにできたのかと思いますが、ATS対応をした今になって、ありがたみを感じました。
iOS 8を切る前からも使ってはいましたが、 iOS 9以上サポートにしたので、 `#available(ios 9.0 *)` を排除できました。

このセッションの中で一瞬だけWKWebViewの追加API `load(_:mimeType:characterEncodingName:baseURL:)` の紹介もされていました。

### [Mysteries of Auto Layout, Part 1](https://developer.apple.com/videos/play/wwdc2015/218/)
タイトルがすごいですね。ミステリアスって...
UIStackViewの概要とAuto Layoutの制約のTips&Tricksについてのセッション

* Maintainable Layouts
* Changing Constraints
* View Sizing
* Self-Sizing Table View Cells
* Priorities
* Alignment

iOS 9以上サポートにしてから、ガンガンUIStackViewを使っています。iOS 8を切った恩恵はこれが1番大きいと思っています。
また、Auot Layoutの制約の動的付け替えについても、`Add and remove` ではなく、`Activate and deactivate` がいいとのことが明示されています。
個人的にはInterface Builder上で `ctl + shift + クリック` で重なり合ったコンポーネントを一気に下れることを知れたのが学びでした。
<img width="361" alt="Screen Shot 2016-12-17 at 21.10.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/78710/d6cf15b3-c94f-d21b-7c82-0e55d9c21266.png">

そういえば、このセッションでのデモはObjective-Cだったのですが、スピーカーの好みで選択されているんでしょうか。

### [Mysteries of Auto Layout, Part 2](https://developer.apple.com/videos/play/wwdc2015/219/)
Layoutの決定、描画に関する説明とAuto LayoutのデバッグについてのTips&Tricksについてのセッション

* The Layout Cycle
* Legacy Layout
* Constraint Creation
* Constraining Negative Space • Unsatisfiable Constraints
* Resolving Ambiguity

Layoutの描画に関しての説明は一見の価値があると思います。 (自分ももう1度見ようと思っています。)
Auto Layoutのデバッグについては、「Logを見て、適切に調整してね」って感じですが、accessibility identifiersを設定するといいよとのこと。[@dealforest](https://twitter.com/dealforest)さんが[前に言っていました](https://twitter.com/dealforest/status/786925040965070848?ref_src=twsrc%5Etfw)が、一個一個手作業で付けるのはめんどうなので、スクリプトがあるといいですね。

### [New UIKit Support for International User Interfaces](https://developer.apple.com/videos/play/wwdc2015/222/)
国によって違う文章等が左右に流れる方向を、Auto Layoutが吸収してくれるよという紹介のセッション
想定していたものと違いましたが、コンテンツとしておもしろかったです。
中でも `UIImage.imageFlippedForRightToLeftLayoutDirection()` を用いることで、画像の左右反転にも対応しているというのは驚きです。 (使う場面はRTL国対応しか思いつきませんが...)
Playground上では以下のコードで確認できます。

```swift
import UIKit

let image = #imageLiteral(resourceName: "icon.JPG") // 何かの画像
let imageView = UIImageView(image: image)

imageView.semanticContentAttribute = .forceRightToLeft // 強制的にRTL環境に変更
image.flipsForRightToLeftLayoutDirection

imageView.image = image.imageFlippedForRightToLeftLayoutDirection()
```

### [What's New in Storyboards](https://developer.apple.com/videos/play/wwdc2015/215/)
Storyboard ReferenceとCustom Segueについてのセッション
Scene Dockの存在を全く知らなかったんですが、めちゃくちゃ便利ですね。所属するUIViewControllerの生成時にはViewの生成だけ行われて、addSubViewされていない状態で存在し、そのViewを任意のタイミングで表示することができます。今まではIB上に直接Viewを置いてHiddenにしていたので、これは非常にありがたい。
<img width="370" alt="Screen Shot 2016-12-18 at 9.16.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/78710/90ab89c1-cf88-7602-c101-94a3751563fe.png">

このセッションの本質ではないのですが、[前に疑問に思っていた](https://twitter.com/yutailang0119/status/786934105162194944)iOS標準のRemindersアプリに近い画面構成のTipsを見れたのも収穫でした。

### [What's New in UIKit Dynamics and Visual Effects](https://developer.apple.com/videos/play/wwdc2015/229/)
DynamicItemに依る重力操作とUIVisualEffectViewを使ったBlurエフェクトについてのセッション
DynamicItemのサンプルは[ここ](
https://developer.apple.com/library/content/samplecode/StickyCorners/Introduction/Intro.html)からダウンロードできます。(Xcode 8.1で確認、Swift 3にコンバート済み)
デモの中でやっていた力場 (のようなもの) の可視化の方法がわからなかったですが、Panでの操作で近い四隅に動かすサンプルは確認できました。LINEのビデオ通話でも使われているのを見たことがありますが、結構簡単なコードで実現できそうです。
Blurエフェクトについては、わざわざコードで付けんでもという思いもありますが...


## Media
### [What's New in Core Image](https://developer.apple.com/videos/play/wwdc2015/510/)
CIImageとAVFoundationについてのセッション
セッション内で使われているらしいサンプルアプリ **CIFunHouse** は[ここ](https://developer.apple.com/library/content/samplecode/CIFunHouse/Introduction/Intro.html)からダウンロードできますが、Last Revisionが2013-06-13だったので、確証がありません。
残念ながら、使ってみたかった `TextDetector` のサンプルがなかったので、`PixellatedPeople.m` の103行目の

```swift
detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:options];
```

を

```swift
detector = [CIDetector detectorOfType:CIDetectorTypeText context:nil options:options];
```

に書き換えて実行し、Filtersで **Input Video** と **Pixellate People** で使ってみたところ、
![IMG_1791.PNG](https://qiita-image-store.s3.amazonaws.com/0/78710/4a215457-b3e3-5a7c-483d-ef5c28614512.png)
となりました...
認識してるのかすごく微妙なので、きちんと自分でサンプルを作って検証してみようと思います。
 (Xcode 8.1で確認)

## System Frameworks
### [Your App and Next Generation Networks](https://developer.apple.com/videos/play/wwdc2015/719/)
IPv6やTCPについてのセッション
アプリがIPv6に対応できているかの確認のためのTipsの紹介がされていましたが、もう今さらでしたね。
一応確認方法の参考: [IPv6対応期限目前!!アプリが対応しているか確認する方法](http://qiita.com/mfks17/items/3350f5f34dcda571bc34)
正直1回見ただけでは、「へー」としか思えず、ネットワーク層やセッション層についての知識も必要だなと感じました...

# まとめ
当たり前ですが、1年以上経っていると情報が古くなっていたり、すでに周知の事実になっていることもありますが、その中にも新しい発見が数多くありました。
iOS 10がリリースされ3ヶ月経ち、iOS 8を切るというアプリも多くなってきた今、再度WWDC 2015のセッションを見てみると幸せになれるかもしれません！！！
次はWWDC 2016を見直そうと思います！