[WWDC22概要] Platforms State of the Union

WWDC22で発表される機能の概要を説明したビデオ「Platforms State of the Union」のまとめ記事になります。皆様のご参考になれば幸いです。

[https://developer.apple.com/videos/play/wwdc2022/102/](https://developer.apple.com/videos/play/wwdc2022/102/)

# Xcode Cloud

今日から利用可能。
XcodeCloudは2023年末まで月々25時間以下なら無料。
この夏の後半からデベロッパアプリケーションで、どのXcodeCloudサブスクリプションレベルにも登録できるようになる。

# 3つのトピック

- Vision for Platform
    - プラットフォームの現状そして今後の方向性について
- System Experience
    - アプリをAppleのプラットフォームのシステム体験と統合するための新しい方法
- New APIs
    - 新しいAPIについて

# Vision for Platform

## Swift

### Concurrency

Concurrencyで非同期アルゴリズムを導入

```swift
for await (number, letter) in zip(numbers, letters) {
	pring(number, letter)
}
```

分散アクター

```swift
distributed actor networkClient
```

distributedキーワードがこれらのアクターとリモートでアクセスされるメソッドを示します。
分散アクターはプラガブルトランスポート機構を使ってそれらをプロセスの外で使えるようにする。

### 正規表現

新しい正規表現リテラル
Swiftコンパイラで正規表現が正しいか確認できるようになる。

サンプルアプリ
注文受付から売上追跡までの全てを管理するFood Truckというアプリを使用。
PlayGroundで正規表現の確認が出来る。

Regex Builders
ログの解析にも使える。

### プレースホルダ型

これまでは、意図を表すために大量のコードを書かなければなりませんでした。

```swift
func playSongs<PlayList>(in playlist: Playlist) where Playlist: Collection, Playlist.Element == Song
```

今後は some キーワードで簡潔に記載できるようになる。

```swift
func playSongs(in playlist: some Collection<Song>) {...}
```

anyキーワードでどんなコレクションでも保持できる型を表現できるようになる。

```swift
func playSongs(in playlist: some Collection<Song>)

struct MusicLibrary {
	var playlists: [any Collection<Song>]

	func playAll() {
		for playlist in playlists {
			playSongs(in: playlist)
	}
}
```

Swiftで汎用コードを書くのはかつてないほど簡単になります。

### Swift Package Plugins

新しいパッケージプラグイン
コードを作成してビルドする方法を強化します。
パッケージプラグインの呼び出しはコマンドラインやXcode内から、ビルドフェーズの一環として、またはオンデマンドで行えます。
アプリケーションのビルドに役立つプラグインを作成可能。

サンプルのコマンドプラグイン用のコード
インポートを文字列の長さ順にソートする。
ローカルで修正されたファイルを見つけて、インポート文をソートする。
他にもソースコードの生成やGitでの連携、カスタマイズしたエラーと警告の表示も行える。
コードが適切にドキュメント化されているか確認できるプラグインのサンプルも。
プラグインはXcodeCloudまで拡張するので、ビルドの一環として実行することも可能。
SwiftPackagePluginで独自のコマンドを作成でき、ビルドをカスタマイズでき、プラグインを他の人とも共有できます。

他にもSwiftなら、iOS16で起動時間が劇的に速くなります。

## SwiftUI

### 新しいナビゲーションAPI

```swift
NavigationStack(path: $navPath) {
	MusicLibraryView()
		.navigationDestination(for: Album.self) { AlbumDetail($0) }
		.navigationDestination(for: Artist.self) { ArtistDetail($0) }
}
```

アプリのニーズに最適なナビゲーションスタイルを表現しやすくなる。
簡単に選択範囲の保存や復元をしたり、ナビゲーションスタックの内容全てを置換することもできる。

### グリッドAPI

複数の行と列にわたって配置された一連のビューのレイアウトを容易にする、新しいグリッドAPIを追加。

### カスタムレイアウトAPI

全く新しいカスタムレイアウトAPI。
あらゆるタイプのレイアウトを柔軟に構築できるようなる。
新聞記事のように配置して、スペースが必要になった時に、次の列に折り返されるフローレイアウトを作成することが可能。
時計の文字盤の数字のように、円形にビューを描く放射状レイアウトを作ることも可能。
レイアウトロジックの再利用が簡単になり、ビューコードがよりシンプルで、より読みやすくなります。

### ハーフシート

メインビューの上にスライドする第二のビューを定義するハーフシートにもSwiftUIで対応。

### 共有シート

SwiftUIで共有シートにも対応。

### 段階的なSwiftUIの採用

SwiftUIビューをホストできる特別なコレクションビューセルと共に既存のアプリでの段階的なSwiftUIの採用をより簡単にした。
すでにUIKitアプリケーションにコレクションビューがある場合、SwiftUIの宣言型シンタックスを使ってカスタムセルを作成可能。

```swift
cell.contentConfiguration = UIHostingConfiguration {
	VStack(alignment: .leading) {
		Text(song.title)
		Text(song.artist.name)
			.font(.caption)
			.foregroundStyle(.secondary)
	}
}
```

### Swift Charts

SwiftUIをもとに作られた、カスタマイズ可能な図表作成フレームワークで簡単に美しい可視化を行えるようになる。
SwiftUIと同じ宣言型シンタックスを使っている。

```swift
Chart(data) { element in
	BarMark(
		x: .value("Product", element.product),
		y: .value("Sales", element.sales)
	)
}
```

SwiftUIをもとに作られたということは図表をアニメーションにして、アプリにぴったりな見た目と雰囲気を持たせることも意味します。
Swift Charts はすべてのデバイスで使えます。

### ViewThatFits

使えるスペース（端末の向き）に応じて縦のスタックと横のスタックを切り替えます。

```swift
var body: some View {
	ViewThatFits {
		VStack {
			// 端末が縦向きの時に表示する
		}
		HStack {
			// 端末が横向きの時に表示する
		}
	}
	...
}
```

### NavigationSplitView

メイン画面から移動できるようにつなげるAPI。
NavigationSplitView には選択を辿れる Sildebar があり、NavigationStack はサイドバーの選択の変更に合わせて内容を変更する。

```swift
var body: some View {
	NavigationSplitView {
		Sildebar(selection: $selection, city: model.track.city)
	} detail: {
		NavigationStack(path: $path) {
			DetailColumn(selection: $selection, model: model)
		}
	}
```

Apple純正アプリはSwiftUIで書き換えられているので、新規アプリを作るならSwiftとSwiftUIがベスト。

# System Experience

## ロック画面

WidgetKitを使って同じデザインのいくつかをロック画面上のウィジェットに使えるようにした。

Circular
小さな画像やゲージチャートや少ない文字を表示します。

Rectangular
今後の天気予報のような情報を表示する広いキャンパスを提供します。

Inline
少ない文字とSFSymbolで情報を伝えるためのパワフルな方法を提供します。

WdgetKitはiOSとWatchOSで使える
widgetKitはプラットフォームの違いを自動的に調整し、デフォルトで適切なシステムフォントを使用し、ロック画面上のWidgetを読みやすく色付けします。

iOSとWatchOSで共通のWidgetを作るデモ

Live Activities
リアルタイムで起きていることをロック画面に表示できる。
試合の最新のスコアやライドシェアやワークアウトの途中経過など、Widgetと同様WidgetKitでLive Activitiesを作成可能。

## Message Collaboration API

アプリでの既存の共同作業体験をメッセージとFacetimeに導入することが可能。
既存の二つの方法で共有できる。
- 共有シート
- ドラッグ&ドロップ

## App Intents

これまではショートカットを使用する前に手動でショートカットを追加する必要がありますが、iOS16のApp Intentsではこれを自動化します。
数行のコードでIntentを定義すれば、ショートカットアプリに自動でショートカットが追加される。
Siriとショートカット向けにカスタムのIntentを作るなら、SiriKit Intentsフレームワークから App Intents にアップグレードしてください。
IntentDefinitionファイル内の変換ボタンを押すだけでApp Intentsにアップグレードできる。
Objective-CのコードでもSwiftでラッピングすることで使用可能。

## Passkeys

パスワードからのシームレスな移行を可能にする。
パスワードを作る必要がない。

ユーザ名を入力して、パスキーを自分のiCloudキーチェーンに保存する。
すべてのAppleデバイスにこのパスキーが同期される。
友達のパソコンからWebSiteにログインも可能。
WebSiteで自分のユーザー名を入力して、iPhoneを使ったサインインを選びます。
表示されたQRコードをiPhoneでスキャンする。
iPhoneと友達のパソコンが安全に接続されて、生体認証を使ってサインインする。
パスワードベースのアカウントのユーザー名を入力してもサインインできる。

パスキーを使うとWebSiteやアプリ用に作られた独自のキーをデバイスが生成し、生体認証の背後で保護します。
脆弱なパスキーを持つのは不可能です。
サーバーからの認証情報の漏洩は過去のものになります。
サーバーは公開鍵だけを保持します。
WebSiteのオーナーであれば漏洩リスクが大幅に減ります。
パスキーを使えば、フィッシングがなくなる。
パスキーは設定されたWebSiteやアプリに紐づいているので、不正なWebSiteでパスキーを使わされることは絶対にありません。

「全てをまとめると、今ここで話しているのはつまり、アカウントセキュリティの新時代です。」

移行期にはパスワードと共存できる設計になっている。

# New APIs

## 概要

### iPadOS

UITextViewのためのシームレスな検索と置換体験が自動的に追加される。
ナビゲーションバーとツールバー、文書メニューもアップグレードされます。
外部ハードウェアに接続されたiPad用のアプリを実現するためにiPadでDriverKitが利用可能になる。

### watchOS

CallKitフレームワークには新しいVoiceOver IPバックグラウンドモードが含まれ、アプリはApple Watch から直接音声通話を行うことができる。
BlueTooth接続された医療機器は緊急性の高い状態が検知された時にタイムリーに警告できます。

### tvOS

近くにあるAppleデバイス上のアプリ間でつながりのある体験を作る新しい方法を提供します。
tvOSはデバイス検出と接続を管理してくれます。
アプリを他のデバイスで実行している必要さえありません。

### Ads and Privacy

SKAdNetworkに多くの改善を施し、プライバシーを侵害することなく、はるかに柔軟に活用できるようにしました。

### ScanKit, RoomPlan

iPhone, iPad でARとLiDARスキャンを使う新しい機能。
USDとUSDZ形式のパラメトリック室内3Dモデルを作れます。

### 集中モード

Focusフィルタで集中モードをさらに進めます。
FocusフィルタはAppIntents上にあり、ユーザーの現在の集中モードに応じてアプリのコンテンツを調整できます。

## 詳細

### Metal3

機械学習フレームワークのPyTorchではパフォーマンスが劇的に向上します。
今回GPUによる機械学習トレーニング可能にするためPyTorchには新しいMetalバックエンドが採用されています。
Metalで一番注力したのはゲームです。
Metal iO API で高速リソース読み込みを導入。

Offline compilation
オフラインでのシェーダーコンパイルでGPUシェーダーバイナリをプロジェクトのビルド時に生成できます。
これにより読み込み時間を短縮しレンダリングのパフォーマンスを上げるため、ゲーム内でのシェーダーコンパイルを省くことが可能になります。

Mesh shagers
最適化されたジオメトリ処理パイプラインを単一のレンダーパスで制御できるようになります。
デバイスのメモリに送る必要がなくなり、パフォーマンスが向上します。

MetalFX Upscaling
没入感のあるグラフィックスの1フレーム当たりのレンダリング時間の短縮に役立ちます。

### MapKit

MapKitはAppleが一から作り上げたものになる。

3D
全てのデベロッパーに3D都市体験を提供します。
これまで不可能だったコンテキストと精度を提供することができます。
配布ターゲットとしてiOS16以上を選択すれば自動的に3D表示される。
MapKitには正確にマップを表示するため、3D空間でカメラの位置を定めることができる。

Look around
高解像度の3D写真とアニメーションでユーザーはタップするだけでLook Around 上の通りを進めます。
マップのすぐ下に静的なLook Aroudプレビューを追加できる。
フルスクリーンのLook Aroundプレビューも表示可能。

Apple Maps Server APIs
REST API で4つの関数をサポート

- Geocode
- Reverse Geocode
- Search
- Estimated Time of Arrival

ユーザーのデータと身元を紐づけることも履歴を残すこともありません。

### WeatherKit

どこからでも使えるREST APIで以下をサポート

- 10日分の1時間ごとの天気予報
- 1日ごとの天気予報

過去の天気データも提供するので傾向も確かめられる。
一部の国では荒天の通知と分単位の降水量も提供。
プライバシーを保護するため、位置情報は天気予報を提供するためにのみ使用されます。
Apple Developer Program メンバーなら月々50万回のweather API呼び出しが無料。
さらに必要な方はこの秋からデベロッパのアプリで追加レベルのサービスを購入可能。
1M calls $49.99/mo.

### VisionKit API

Live Text API
画像コンテンツを解析する機能が利用可能になり、ユーザーが写真や一時停止したビデオの中のテキストやQRコードを使えようになった。
クイックアクションを提供。
ユーザーは関連するデータをタップするだけでアクションを起こせます。

Data Scanner API
ライブカメラ映像を解析する機能。
ユーザーにとってテキストとバーコードの読み取りが劇的にシンプルになります。

今年追加される日本語と韓国語を含めた9ヶ国語の自動検出をサポート。

デモ
文字やQRコードやバーコードを探して強調表示。
QRコードをタップしたら、スキャンの成功イベントを追加。

# 最後に
デベロッパーモードの話がここ（Platforms State of the Union）ではされなかったなぁ。
セッションビデオかドキュメントで確認した方が良さそうだな。