自分視点でまとめるWWDC2020の発表まとめ

自分用メモなので結構バッサリカットしたりしながらまとめてます。

# WWDCとは
Worldwide Developers Conferenceの略。
Appleが毎年開催している開発者向けイベント。
大体夏開催で、2020年は6月22日開催。

# Keynote（基調講演）
動画：https://developer.apple.com/videos/play/wwdc2020/101/

KeynoteはWWDCの開幕と共に行われる基調講演のことで、新バージョンのiOSなどが発表されます。
このKeynoteについては詳細がいくつものまとめ記事としてWeb上に存在するので、詳細はそちらを参照してください。

https://www.itmedia.co.jp/news/articles/2006/23/news063.html
https://japanese.engadget.com/wwdc2020-230039110.html
https://mobilelaby.com/blog-entry-wwdc-2020-matome.html
https://iphone-mania.jp/news-297291/

この記事ではざっくりと抜粋して箇条書きで記載します。

## iOS14
- （Androidのように）ウィジェットがホーム画面に追加可能に
- アプリ一覧が自動カテゴライズされたAppライブラリが追加され、アプリやページの表示/非表示が選択可能に
- 全画面表示の多くがカード表示などのユーザ操作を阻害しない表示に変更（着信、Siriなど。動画のピクチャーインピクチャーもおそらくその一貫）
- ミニアプリのように軽く使い捨てできる感じのApp Clip
- 翻訳機能の追加
- メッセージやMapの機能追加、改善
- NFCによるCarKey機能（BMW 5シリーズから搭載される）

## iPad14
- iOSと同様の各種改善、機能追加、UI変更（ホーム画面へのウィジェット追加やSiri/着信時の表示など）
- 写真アプリなどの標準アプリに「サイドバー」が搭載され、Macのような使い心地に
- Scribble機能：あらゆるテキストフィールドにApple Pencilを使って手書きで入力可能に
- 検索機能の改善（アプリ、ウェブなど一貫して検索が可能に）

## その他
- AirPods：Bluetooth接続するデバイスの自動切り替え機能
- AirPods：「Spatial Audio」機能（頭とデバイスとの相対位置から自動で空間オーディオの音源位置を調整）
- WatchOS 7：「Sleep」（睡眠）追跡機能、手洗いサポート、より細やかな各種運動への適応など
- プライバシーを全体的に強化（クロスアプリトラッキングするアプリの通知義務化など）
- tvOS 14とHomeKit：新しいコントロールセンター、HomeKitのホームカメラの顔認識など
- MacOS 11.0：UIリニューアル、Safariリニューアルなど
- Mac：[Apple Siliconへ移行](https://www.apple.com/jp/newsroom/2020/06/apple-announces-mac-transition-to-apple-silicon/)。2020年末にはApple Silicon搭載Macが出荷予定。

# Platforms State of the Union
動画：https://developer.apple.com/videos/play/wwdc2020/102/

macOSやiPadOS、watchOSの話はざっくり省略したりしてます。

## keynoteのおさらい
<img width="400" alt="スクリーンショット 2020-07-11 10.12.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/61649666-902c-3874-074e-699be022d262.png">
MacのAppleシリコンへの移行と、macOS Big Surでのルックアンドフィール刷新。

<img width="400" alt="スクリーンショット 2020-07-11 10.08.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/5553513b-72cd-f819-1343-4db3be7524fa.png">
iPadは多数のアプリの改良とApple Pencilを使ったスクリブルで、macOSと同じくルックアンドフィールが刷新されている。

<img width="400" alt="スクリーンショット 2020-07-11 10.08.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/64c589fe-bcfd-125b-7446-6ddb16da92a4.png">
iOSではホーム画面のウィジェットでアプリにアクセスできるようになった。

<img width="400" alt="スクリーンショット 2020-07-11 10.08.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/36643b76-ac42-5782-5165-b570292e05ff.png">
また、iOSでは必要なアプリを必要なタイミングでApp Clipによって発見し、アプリを全てダウンロードせずとも試すことができるようになった。

<img width="400" alt="スクリーンショット 2020-07-11 10.08.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/94ef9edf-69f8-401b-8875-925a50a7358c.png">
WatchOSでは最新情報をユーザに届けるための柔軟性ある[コンプリケーション](https://rich-watch.info/327/)が提供されるようになる。

## 開発者向けの話
<img width="400" alt="スクリーンショット 2020-07-11 10.08.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/a84852dd-8b0f-29c3-7c5d-733ed5785097.png">
フレームワーク、API、デザインランゲージに一貫性を持たせることにより、Apple製品に共通する体験を簡単に作れるようになっている。
全ての機能は新しいAPIによってされており、それらもXcodeのツールでサポートされている。
多くは最も重要なプラットフォームに渡る基盤であるSwiftUIに基づいている。

### デフォルトアプリが変更可能な話
<img width="400" alt="スクリーンショット 2020-07-11 10.32.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/1b9150a5-d311-8ac7-17d8-a1e3b0ffb0d3.png">
今年からユーザはiOSとiPadOSのメールやブラウザのデフォルトアプリを変更できるようになる。

<img width="400" alt="スクリーンショット 2020-07-11 10.39.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/64c57416-2851-41be-bab3-eb247ce6ccd1.png">

他のブラウザの拡張機能をSafari WebExtensions APIを使ってMacのSafari用に拡張ができる。
Xcodeのシンプルなコマンドラインツールを使えばプライバシーに考慮したSafariの拡張機能とし、Mac App Storeで提供できる。

### 探すネットワークの話
<img width="400" alt="スクリーンショット 2020-07-11 10.39.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/6f4c4256-6f8c-d8da-c97e-af2ee8b01757.png">
<img width="400" alt="スクリーンショット 2020-07-11 10.39.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/b41fce4d-5e8f-33fe-4053-d70e3d0c7979.png">
https://developer.apple.com/find-my/
5億以上のAppleデバイスからなるエンドツーエンドで暗号化されたFind My（日本語だと探す）のネットワークに、他社製アクセサリやデバイスもアクセス可能になった。

### Appleシリコン搭載Macの話
<img width="400" alt="スクリーンショット 2020-07-11 22.40.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/0ee6d68d-9471-8a78-a587-030efa2fbdfb.png">
ここで再度MacへのAppleシリコン搭載の話。Appleシリコン搭載によってiOS/iPadとの親和性が高まるだけでなく、数多くのメリットがあることが紹介される(Up to Date Content、4:4:4 Sidecar Encode、Best-In-Class Securityなど)。
Appleシリコン搭載MacのmacOS Big Sur対応に向けてアプリの構築、テストなどのために[Quick Start Program](https://developer.apple.com/programs/universal/)にてDTKの提供が開始されている。

Appleシリコン搭載Mac対応のためには、アプリケーションのUniversal化が必要となる。
Universal化を行うことで、単一バイナリの中でAppleシリコン用のバイナリとIntelプロセッサ用のバイナリが含まれるようになり、ハードウェアに合わせて自動的に切り替えてくれるようになる（画像などのリソースは共通化される）。
Universal化は最新のXcodeから行うことが可能。

標準搭載のアプリやプロ向けのアプリなどはWWDCの前には既にAppleシリコン向けのアプリへのコンバートが完了している。
Macのオープンソースプロジェクトにおいても、広く使用されているものについては既に取り組みを開始しており、近々パッチを公開する。
また、Unityも対応を進めており、来月Appleシリコン搭載Mac用ソフトウェアのプレビュー版をリリース予定で、今年後半にはエディタランタイムツールの製品版がリリース予定。

Appleシリコン用に最適化されていないアプリのためには、新しいエミュレーションソフトウェアRosetta 2が用意される。
Rosetta 2はInterチップ用の命令語をAppleシリコン用にコンバートする。
これは主に実行中の話ではなく、事前コンパイル、すなわち起動前に多くは実行されるため高速にアプリのエミュレーションを実行できる（起動前にできない場合でも、静的なコードは初回起動時に変換される）。
一方で、動的にコードをロードするような場合や、JavaScriptの実行時コンパイラなどでは実行中に変換される。
Rosetta 2はmacOS Big Surに標準搭載であり、特別な設定などは不要である。

App Extension、DriverKitなどもUniversal化が可能。
kextはより安全なAPIへの置き換えを継続する。
macOSでのKextsのサポートは継続するが、エミュレーション下では動かない。
また、Appleシリコンの安全性を高めるために全てのKextsに公証を求める。
仮想化プロダクトのためにもKextsの廃止を目指している。

Appleシリコン搭載のMacではKeynoteでもあったようにiPhone/iPad用のアプリケーションが実行可能となる。
Appleシリコン搭載Mac発売時にはAppleシリコン用に最適化されていない未修正のiPhone/iPadでもMac App Storeで提供される。
（確認したところ、App Store ConnectでデフォルトでMacに配信する状態になっており、開発者は必要な場合のみ配信可能にしないにチェックをいれるようになっている）

### macOS Big Surの話
<img width="400" alt="スクリーンショット 2020-07-12 10.06.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/b86a1a72-978c-8db6-08c6-4e58490f17e2.png">

macOS Big Surではアイコンのデザインなどが一新されたので、デザインを合わせられるようにテンプレートが提供される。
アイコンだけでなくメニューなども見た目が変わり、全体的に角丸のテーマで統一され、それに合わせてFinderで表示される書類アイコンも画像とテキストを選択するだけで独自の書類アイコンが表示できるなど見た目の改善が進んだ。
Big Surからはコントロールセンターが実装され、システムコントロールへのアクセスが容易になる。
通知センターもUIが刷新され、通知とウィジェットが同時に表示されるようになる。
iOSの通知と同じようにアプリごとに通知はグループ化され、UINotifiationContentExtensionによって通知APIを活用したカスタムコンテンツの表示が可能になる。

macOS Big Surの修正内容についての残りと、この後のiPadOSの内容については省略（普段Mac/iPad用のアプリを作ってないため）

### iOS14の話
<img width="400" alt="スクリーンショット 2020-07-12 10.14.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/ae4b9536-2d89-28d2-04aa-568eb7bf671d.png">
iOSの更新におけるメインといえばApp ClipとWidget。

#### Widget
<img width="300" alt="スクリーンショット 2020-07-12 10.18.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/5686b4ab-f497-97ab-5ba2-16b978f2a564.png">　→　<img width="300" alt="スクリーンショット 2020-07-12 10.18.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/b5eef106-428c-f1b0-bf1e-35afc7924a60.png">
<img width="400" alt="スクリーンショット 2020-07-12 10.18.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/b3be1668-3f45-3902-3160-45f0c5b525c2.png">
Widgetは完全に刷新され、Mac/iPad/iOSのそれぞれでシームレスに動作する。

<img width="300" alt="スクリーンショット 2020-07-12 10.19.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/819e3437-f473-856e-c273-f6fc01608f7c.png">　<img width="300" alt="スクリーンショット 2020-07-12 10.19.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/26485a06-d516-fda2-99f7-56024d7f4801.png">
ホーム画面へのWidget表示導入にあたり、パフォーマンスとメモリ効率が重要となるため、SwiftUIの機能を利用してウィジェットの外観をレンダリング方法とは別に記述し、さらにSwiftUIの表示をアーカイブするシリアル化の方法を追加。
アーカイブは軽く、GPUで非同期的にレンダリングすることでホーム画面でのパフォーマンスを確保できる。
新しいウィジェットAPI、WidgetKitはタイムラインエントリーを基に構成され、それぞれが新しいSwiftUIアーカイブ、日時、関連性スコアを含む。
画面への実際の描画に必要なView階層の構築、レンダリングはOS側で自動的に実行される。
アプリ側は通常複数のタイムラインエントリーを提供するため、アプリを実行し続けることなくこのプロセスを繰り返すことができる。
システム側は提供されたタイムラインエントリーに基づいて適切なタイミングでレンダリングを行う。

![widget-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/9e418709-3b9e-ff2c-8ba4-4be15c2869ba.gif)
ウィジェットの挙動デモ部分をgifで抜粋したものが上記になる。
ユーザはウィジェットをまとめてスタックすることができ、フリップして表示の切り替えが可能。
手動でのカスタマイズによってこのスタックを行うこともできる一方で、スマートスタックと呼ばれる自動的にスタックを構成する方法もある。
スマートスタックではiOSが必要なタイミングで必要なウィジェットをスタックの一番上に表示する。

![スクリーンショット 2020-07-12 11.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/6152447f-73d2-5e65-809d-9062459d7a27.png)
![スクリーンショット 2020-07-12 11.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/9e1c173c-c08a-a095-a989-7908834bf937.png)
![スクリーンショット 2020-07-12 11.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/efc3d475-450c-2854-a801-18113066c220.png)
![スクリーンショット 2020-07-12 11.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/f7090760-6989-ab58-dc6a-ac0c2b33d985.png)

Widgetの開発の様子は上記の通り。
Widgetプロトコルに適合するようにWidgetを構成し、プロバイダーを作成する。
上記画像にあるsnapshot関数は単一エントリーを表示する際に使用される。timeline関数にて一連のエントリーを作成し、指定した日付を基に個別エントリーを表示するように伝える。
複数のエントリーがある場合、relevanceプロパティの値の大きい方が表示される。
Intentsフレームワークによって、ウィジェットの表示内容の切り替えを簡単に提供できるようになっている（WWDCではConfiguration機能と呼んでいる）。
Configuration機能はウィジェットの長押しからアクセスできる機能で、開発側でConfiguration対象として必要なパラメータを渡すことで選択用のUIが表示されるようになる。

#### App Clip
App Clipはアプリの一部であり、軽くて早く、見つけやすいのが特徴。
必要なタイミングで必要なものを素早く使えるものとして開発されており、10MBのサイズ制限がある。
スピードが重要なため、カードの表示も瞬時に行われる。
カードの表示自体はApp Storeに提供されるメタデータから自動生成される。
カードが表示されると、裏では自動的にダウンロードが開始され、タップするとApp Clipを起動できる。
App Clipは支払い方法としてApple Payが使えるので、Appleでサインインしてあれば手動でのパスワード入力やカード情報の入力は不要。
App Clipはホーム画面上には残らず、Appライブラリに最近使ったアプリとして残り、一定期間が経過すると削除される。
App Clipでは利用開始から8時間経過まではPush通知を送ることが可能。
App Clipからフルバージョンアプリのインストールを促すことも可能で、フルバージョンアプリをインストールした際にはApp Clipで設定したものが全て反映される。