Platforms State of the Union WWDC2022をまとめてみたら大量のアップデートがあってすごいことになっていた件について

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[もぐめっと](https://mogmet.com)です。

![mogmet](https://user-images.githubusercontent.com/1166342/172364673-f3aabf4e-c2fa-4aa2-866e-839205d1ded1.jpg)
先月宮古島へ行ってみたのですが、梅雨でずっと雨でした。5月に南の島はお勧めしません。

本日はWWDC2022で発表されたplatforms state of the unionをまとめてみました。
みなさんkeynoteに目が行きがちですが、開発者はこちらに目を通してから各セッションに臨んでみるといい目印になります。

https://developer.apple.com/videos/play/wwdc2022/102/

下記の三本で情報をお届けします！

- 1. AppleのPlatformの現状と今後の方向性
- 2. アプリをAppleのプラットフォームのシステム体験と統合する方法
- 3. 新しいAPI

## 1. AppleのPlatformの現状と今後の方向性
### Xcode Cloud
Xcode Cloudが今日から使えるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/c340bbc6-4b28-8ab4-5a5a-a068553b433c.png)

2023年末までは月々25時間のサブスクリプションが無料で使えます。（その後は月々14.99$と思われる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/1bd7e81b-f269-18d6-997e-db998a7a5f3b.png)

### Swift
並行性(async await)が導入されて扱いやすくなりましたが、今年は平行性をもたらす新たなパッケージとして、非同期アルゴリズムが追加されました。

例えば、２つの非同期シーケンスを圧縮してくれる実装ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/c278a857-2818-ae5e-8e36-fafece2cd541.png)

もちろんネットワーク障害などtry catchもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/8fac37df-a316-9b39-2001-87fdd31f74c2.png)

時間ユニットを表すクロックタイプを備えており、時間ベースのものもサポートしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/560e26cd-b6f9-9101-19c6-72da0c08013f.png)

アクターをつかえばスレッドセーフに並行して実行できるのでデータを分離できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/60e42735-416a-5776-30bd-97cb57da36d5.png)

アクター間のコミュニケーションはasync/awaitを使うと効率的にできます。
今回のアップデートで分散アクターを追加しました。
分散アクターは複数のプロセスやデバイス間で通信ができます。

distributedというキーワードがリモートでアクセスされるメソッドとマークで、異なるデバイスで通信ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/1eca3976-4253-c6f3-88d2-bf3acfb962e0.png)

### 文字列

たとえばコーのコードをパースする方法について、実装すると大変ですが...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/dd115cf7-b684-e42c-217a-72bfdcd61153.png)

正規表現をアップデートしていい感じに取れるようになりました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/fa162b31-8d25-dba7-d4e6-d7ebec6d05b6.png)
Unicodeのサポートも最大限活用できます！

シンタックスもハイライトされてちゃんと使えてるかもわかります。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/5b02b4c0-003c-f8f8-1c53-001d43bc7f54.png)

playgroundではマッチした内容も表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/cccc1d19-27bf-bebc-799d-f8d93f30a8f7.png)

正規表現が複雑になると難しくなるので正規表現ビルダーを追加しました！
正規表現を選択してConvertすると。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/e409d4c1-439b-0760-0223-42c5b7bb907a.png)

より読みやすく変換されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7524808a-08e7-8509-e6f7-a2ec09c29d1d.png)

16進数を読み取るようなクラスを使用することも可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/2f15a34e-e164-e392-28fc-a51ef0cc627c.png)

#### Generics

Genericsは汎用的に作れるようになるため便利だが、細かいことをやろうとすると大量のコードを書かないといけない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/1d14e9cf-1a01-1be7-8ba1-82f4e5e74808.png)

someキーワードを追加したのでこれを使うとより簡単に表せるようになりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/5a53a9d3-adc9-7c0d-4685-1bc40b400fe8.png)

anyキーワードを使うとどんな型のコレクションでも保持できる型を表現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/9a18d6a0-00df-92b0-0274-21a58225cffb.png)

#### Swift Package Manager

Package PluginによってXcodeを拡張しビルドを強化できるようになりました！
チェックアウトしてすぐ自動でDLされビルドされます。

プラグインはサンドボックス環境で動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/e93b406b-e672-d8b8-f80f-1711fe3d9fcc.png)

例えばSwiftLint、SwiftFormatなどや自動生成に使えます。

オンデマンドで使うコマンドプラグインとプロジェクトのビルド時に使えるビルドプラグインの２種類あります。

例えばインポートを文字列の長さ順にフォーマットするSwiftFormatの例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/595d64ba-2fc9-5dba-b017-26c0e3315252.png)

修正されたファイルを見つけてフォーマットしてくれます。

手動で実行する場合はファイルを選んで実行が可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/87192ba9-c192-f075-61ee-f6863a8b1f00.png)

ソースコードの生成やGit連携、エラーと警告の表示なども出来ます。

もちろん、プラグインを他の人に共有も可能です！

#### その他のパワーアップ
- リンク時間が最大二倍高速
- 非同期タスクの優先性を確実にしてアプリの効率性と反応良さを維持している。
- swiftで書かれたアプリは動的リンカーにおける改良のおかげでiOS16にて起動時間が劇的に早くなります！

他にも盛り沢山あります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/9c99bba5-74d0-2778-31a3-a52fcd077c77.png)

### SwiftUI
#### ナビゲーション
新しいナビゲーションAPIはナビゲーションスタイルが表現しやすくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/956fe1ec-a016-058e-2f67-c48c89ea8923.png)

簡単に選択範囲保存や復元、ナビゲーションスタックの内容を置換したりすることができます。
アプリケーションの起動状態の設定や、サイズクラス感の繊維の管理や、ディープリンクへの対応などに役に立ちます。

#### Custom Layout API
複数の行と列にわたって配置された一連のビューのレイアウトを容易にする APIを追加しました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/941e3f11-7a9b-4bd2-64e5-fd9bb1fb85d3.png)

例えばビューを新聞記事のように配置しスペースが必要になった時に次の列に折り返されるフローレイアウトを作成ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/bb7b7ccd-6e53-6623-445b-41cb52221310.png)

時計の文字盤の数字のように円形にビューを描く放射状レイアウトも作れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/c9dd82a6-df90-c167-2e09-1cd9912ac4bd.png)

メインのビューの上にスライドするようなハーフシートも表現しやすくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/6b963890-b106-bcbf-7424-6c4ad608ef89.png)


共有シートにも対応したのでShare Extensionを使いやすくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/1530e69d-3b96-3aef-c520-891e649addb4.png)

UIKitからSwiftUIへ段階的に移行しやすくするようにしました。
例えばカスタムセルが描けるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/f08a1077-2477-0d80-78c7-5bd63294bc76.png)

※UIKitとSwiftUIの話についてはこのセッションで詳しく語られそうです。

https://developer.apple.com/videos/play/wwdc2022/10072/

#### Swift Charts
SwiftUIをもとに作られた高度なカスタマイズが可能な図表作成フレームワークが追加されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/83fd931e-9a52-0d98-57de-20b2c4e80b81.png)

こんな感じでかけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7b3957a8-a3e1-b6bc-3c35-133ed340c603.png)

いろんなタイプの図表が作れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/4eb84170-65e5-5050-39b9-6365b14401d1.png)

swiftUIに対応しているのでアニメーション表現もしやすいです。
![Jun-07-2022 15-04-09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b2297110-f43a-72d5-bde3-a33c97ada904.gif)

#### SwiftUIとXcodeとの連携

新しいTableViewも含めたXcodeのプレビュー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/4dee5d89-7edb-972d-ebb4-06578919a70d.png)

棒グラフはこんな感じでできます。
|source|view|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/4a57af5c-643b-43e5-0e4a-ae23b157dbd8.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/50187bb0-d3d7-755d-c54c-09d04071c092.png)|

線グラフ
|source|view|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/6116b4d5-a51d-c939-3008-a7ffe0b2e99b.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b99ef520-3956-ec20-8192-7b992d5e5ab5.png)|

新しいプレビューでは異なるデバイスやテーマによる違いを見やすくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/bd9fa073-fb55-2951-bbed-795dcc3cf840.png)

例えばライトモードとダークモードの比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7228ec81-489a-8c68-df0d-35e8d5127c54.png)

向きの比較などが可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7ef329cc-af95-50a8-04bb-89789c7e025d.png)

#### ViewThatFits

ViewThatFitsを使うといい感じに要素を並べてくれます。
|source|view|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/8e01f015-6297-0ca9-8b7c-68f66eae8616.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/2d3bd175-8355-fcdf-6bd5-bb54263f1ca3.png)|

#### NavigationSplitView

ipadなどで縦と横の要素が別々であるときにNavigationSplitViewを使うといい感じに表現してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/f7309d27-21be-2e83-eb60-f428b11725cc.png)

Sidebarの内容に合わせてNavigationStackがその内容を変更してくれる
|サイドバー選択前|選択後|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/4350d5ef-387b-a8e8-9d77-483c75140e8b.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/62df7ad6-23f7-b9a0-99b4-1943fb6f9fde.png)|


MacOSの対応はSupported Destinationsから追加します。これだけでMacOS対応完了！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/5c90fa62-c06e-7ce6-fc56-8d8914f91504.png)


macOS用にメニューバーの追加もできます。

|source|view|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/0001a0ae-0ae4-5426-728f-eb9bf0d449c8.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b393248f-a38d-a335-5cb9-98b3ff39b8ba.png)|


## アプリをAppleのプラットフォームのシステム体験と統合する方法

### ロック画面

新しくロック画面に情報が表示できるようになったが、WidgetKitを使って同じデザインをロック画面に統合できます。

**Circular**

小さい画像やゲージチャートや少ない文字を表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/07aa4465-1d15-6898-ba6e-8d4b356f8af3.png)

**Rectangular**

今後の天気予報のような情報を表示できるキャンバスを提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/f983dd40-4e17-8d18-0577-6ad06b1f2c37.png)

**Inline**

少ない文字とSF Symbolで情報を伝えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7afb79bf-e3fb-1cd7-f2ad-bbda5cb1056a.png)

watchOS9からはコンプリケーションもWidgetKitを利用するようになったので同じコードでロック画面、AppleWatchどちらも表現できます。

#### 実装例

最初にどんな形をサポートするかを宣言します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/77440718-ad6c-e0b7-aee5-80ea0b78d5d6.png)
（ちなみにwatchOSではsystemSmallは使えないため別条件で分岐されています。）

ゲージチャートを使って現在の注文数を表示するCircularウィゼットの例
|source|view|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b24ae3d2-82b4-e890-6d39-9b709f69d8be.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/8e39c1bb-5715-9103-ef03-8e709b1f73d6.png)|

Rectangularウィゼットの例
|source|view|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/50659f08-bb35-f21f-6641-3a7a6e1bba89.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/095158f5-a80b-4e6b-05b3-d32004d49467.png)|

### Live Activities

Live Activitiesはロック画面でリアルタイムで状態表示できる機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/aae6ac43-f9a5-2691-c338-6923946fa614.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/09ae8f62-5f14-20c3-e916-4dddcf6dbf13.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/dddfc86b-237d-1d31-1c97-9a9be68a8583.png)

これもWidgetKitを使って実装しますが、Live Activityのプレゼンテーションと状態をリアルタイムで更新する必要があります。

### 共同作業

新しく追加されたMessages Collaboration APIを使うことで共同作業ができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/2a57ac4d-f169-ea2f-5f3c-4d1afe124cb2.png)

やり方は２つあります。

一つは共有シートから始める方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b8392261-92f2-f331-df1b-d7c95ce2fb2d.png)

もう一つはドラッグ&ドロップで始める方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/335eade1-3a92-abc3-58fb-5bcff3f88e0b.png)

共同制作ポップオーバーですぐにメッセージや通話に戻れたりもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b49a0fa4-cb65-48da-2156-c37e08597dac.png)

Messages Collaboration APIを使うことでメッセージやFaceTimeの構造に組み込まれるようになります。

### App Intents

今まではショートカットは手動で登録しないといけなかったが、App Intentsがショートカットと連携することで、何も設定することなくSiriと共にショートカットが使えるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/3842f0a5-49b4-4712-3481-a7aabcbb9e90.png)

例えばHeySiri, ルンバでキッチンを掃除して！というだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/23e1021a-b86e-8da3-d23a-8dd7670618b2.png)

IntentDefinitionファイル内の変換ボタンを押すだけでApp Intentに対応できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/6e868b15-9e87-bbde-e6f4-45e404a68452.png)

XcodeがApp Intentsのソースコードを生成するので、空欄の所にIntentをリンクコードで入れておきましょう。

App Intentsで表示するコンテンツ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/91649d5d-7eda-e1b8-2024-6bc369cbc455.png)

App Shortcutsを使えるように定義しておきます。Siriの呼び出すフレーズもここに定義します。
（フレーズには変数としてアプリケーション名を含めないといけません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/06520ba9-7960-a240-5956-329d6ab02143.png)

使う人がなんて呼べばいいかわかるようにSiriTipViewを定義しておきます。
|source|view|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/dd06bed7-6220-d1d7-af62-0a5ba26d9723.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/925bace8-b284-915e-55e4-3bb94f9dd5fb.png)|

SiriTipViewを追加するととSiriのShortcutsにも現れるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/dda2e372-3b82-dc34-f3e9-c4535aa1efd8.png)|

パラメータ値に対応するバリエーションも表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/20a2aadb-58dd-81ac-580d-532048a44c0b.png)

実際実行するとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/35b76145-bf44-7d36-2012-194528c4b5bb.png)


### 認証テクノロジー
Passkeysを使うと認証フローを効率化してセキュリティ問題に対処できるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/a9eef34e-ae7c-1345-bae0-6baf4417da9d.png)

Passkeysでアカウントを設定するとき、パスワードを作る必要はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/cfcbb49f-d540-9cec-16b1-3699d836c34c.png)

ユーザ名を入力して、Passkeysを自分のiCloudキーチェーンに保存される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/632ee74f-e524-c888-0a85-68606da737a5.png)

これだけで全てのAppleデバイスにPasskeysが安全に同期される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/6db2d2c9-2058-371e-fbac-3e276f7f0ab8.png)

サインアウトしてもすぐにサインインしなおせます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/5011c243-8544-3ca2-cae8-18ac2fb30b92.png)

QRを使ったサインインもできます。
|QRを読み取って|FaceIdでサインイン|
|-|-|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/d173df08-b62f-acb2-127a-417918ca5aa0.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/c4a33c05-e699-1107-e4b8-a90e70156a37.png)|

safariの場合はより簡単にサインインできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/3cc804b5-75f3-3ab9-dd9d-e9a23bba6aa2.png)

Passkeysは公開鍵暗号に基づいているのでサーバーから認証情報が漏れることはございません！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/132e6d7a-ab8c-f878-1b67-505f154d35cd.png)

サーバは認証情報の代わりに公開鍵だけを保存する。

パスワードと違ってパスキーを入力したりコピーはできないため、Passkeysによりフィッシングサイトは撲滅できます！

実装方法は公開鍵をサーバに保管し、認証用のチャレンジを送れるようにした後、アプリやサイトでユーザにパスキーを使ってサインインするようにするだけ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/441b7990-c1be-1b3f-8593-03860a4bba54.png)

もちろんパスワードとの共存も可能です。

## 3. 新しいAPI

UITextViewに検索や置換のAPIが追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/89574b61-7420-8b77-edf3-8aadcf70fe30.png)

ナビゲーションバー、ツールバー、文書メニューもアップグレードされます。

iPad用にDriverKitが使えるようになったので、Macでも使っていた外部ハードウェアに接続されたUSBやオーディオデバイス、PCIデバイスなどが使えるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/36b7a78a-ce48-9db4-862e-585d81c40469.png)

watchOS9のCallKitフレームワークにはVoiceOver IP Background Modeが含まれるようになったので、AppleWatchから直接音声通話を行うことができるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/9bf7b44d-8641-b47b-259a-1b1d489a14b0.png)

Bluetooth接続された医療機器はより強力な持続性とデータ通信を得られ、緊急性の高い状態が検知された時にタイムリーに警告できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/638aad8b-0ce6-e200-bc1b-7fc71c4e0983.png)

tvOS16は近くにあるAppleTVやiPhone, iPad, AppleWatchのアプリ間で繋がりのある体験を作れるようになりました。
例えばワークアウトにAPpleWatchのモーションデータを使うことやターン制ゲームのカスタムコントローラとしてiPhone/iPadを使うことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b63f0ceb-aba6-0151-79ae-f912234cbc66.png)

また、tvOSはデバイス検出と接続を管理してくれるので、アプリを他のデバイスで実行している必要もないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/4c45be7b-cd16-7b4f-0424-f4b24dd61561.png)

アプリがなければ直接DLするように自動的に促されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/527c77a4-8fbd-b0f9-711a-aa445edd34ad.png)

SKAdnetworkを改善してプライバシーを侵害することなくデータを活用できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/91543bb8-e4f0-1772-51b7-85711a2dc3c4.png)

ScanKitとRoomPlanというAPIでARとLiDARスキャンを使って家具を自動的に認識するようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b600370b-82e1-dd61-207d-c18382dc9c55.png)

昨年、集中モードを導入したが、今年、通知を管理する方法としてFocusフィルタを導入した。
FocusフィルタはApp Intents上にあり、現在の集中モードに応じて、アプリのコンテンツを調整できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7a4f9a8a-b3da-668f-969c-b65abfac3f80.png)

例えば仕事中は仕事のアカウントだけを表示するFocusフィルタを設定できる。

### Metal

Metal3が今年登場します。
今まで以上に高いフレームレート、没入感のあるグラフィックスのレンダリングなど、新次元の演算性能を可能にする新機能を備えています。

機械学習フレームワークのPyTorchでは、パフォーマンスが劇的に向上した。

ゲームロードに関して、最新のゲームは高画質のアセットを提供することで、リッチなゲーム体験を実現している。
しかし、GPUに素早く読み込むのは難しい。

よくある手法としては低画質バージョンを読み込み描画することになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/55dd9b61-51e8-effd-b733-54406a3602d9.png)

Metal3ではMetal iO APIで高速リソース読み込みを実現した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/d50bdce0-7c77-332e-bdaa-ca6dc8019ba1.png)

全てのAppleシリコン搭載Macの高速SSDストレージが最大限のスループットを実現するように十分なリクエストをキューに保持します。

これによりロード体験が向上しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/1e9c36c5-60b0-8589-29f0-00523dde2523.png)

シェーダーのコンパイルに関して、オフラインでのコンパイルを活用することで、GPUシェーダーバイナリをプロジェクトのビルド時に生成できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/09ba29a3-8e76-f6dc-7b91-c435a11dcb4c.png)

これにより読み込み時間の圧縮とレンダリングのパフォーマンスが上がりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/0f63d7c3-9309-27c1-a33e-0152104d3413.png)

ジオメトリのメッシュを生成する方法に関して、Mesh Shading APIを使うことで、最適化されたジオメトリ処理パイプラインを単一のレンダーパスで、正確に制御できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/a25b3dad-8936-a497-e5f3-dd6dc45912ab.png)

Objectシェーダーで生成するメッシュの数が決まり、Meshシェーダーで実際にジオメトリが生成され、ラスタライザーに直接送られます。
こうすることで、デバイスのメモリに送る必要がなくなり、パフォーマンスが向上します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/628b956a-8199-b861-c467-604242f8e11a.png)

MetalFX Upscalingを使うことで1フレームあたりのレンダリング時間の短縮に役立ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/1308ff4e-0048-17bd-75ac-c65cb197023f.png)

目標フレーム時間に収まるように同じ複雑なシーンをより低い解像度でレンダリングしてから、MetalFX Frameworkで一時的なアンチエイリアスとアップスケーリングを実行して目標解像度にすることができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/4a37886c-05dc-a3c2-f550-5a218891f48a.png)

（もぐめっと的にはMetalの話は難しくて理解が追いつかない。）

### MapKit

配布ターゲットをiOS16にするだけで3Dの都市体験を提供できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/0a320fea-2cf6-c30f-0d11-ba70028b81ff.png)

カメラの中心座標の距離を600mに設定して、どこまでズームインするかを選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/a8f66870-3843-d316-b5a5-4f6ce326cd8a.png)

ピッチと方角を調整し、3D空間内でカメラを傾けることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/3c05c706-647a-4547-a0b6-efa574adaac4.png)

デフォルト標高は平坦ですが、elevationStyleにrealisticを設定すると、3D標高を含められる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/c14e8da0-07fe-6ea9-12da-42d480b6fbe2.png)

MapKitのDirections APIから注釈や経路ソースを加えるときはMapKitが自動的に標高を管理して注釈や経路を3D地形上に配置して調整します。

<img width="1327" alt="image" src="https://user-images.githubusercontent.com/1166342/172355503-8a9c02c9-0e88-4a46-8575-406a6a3b6d9f.png">

スローパンを加えてカメラの向きに動きをつけるとマップ表示がいい感じになります。

![Jun-07-2022 19-14-13](https://user-images.githubusercontent.com/1166342/172355878-903c21dc-bf1d-403b-ba6e-281dd238a632.gif)

dark modeにも対応
<img width="1569" alt="image" src="https://user-images.githubusercontent.com/1166342/172355940-fe77f28a-a024-4ead-892e-2e22813db4b2.png">

#### Look Around

ストリートレベルで世界を探索できる機能を追加しました。（いわゆるGoogleStreatView）
<img width="1786" alt="image" src="https://user-images.githubusercontent.com/1166342/172356176-828e787f-1804-4dcc-8956-c2328f03bd5a.png">

高解像度の3D写真とスムーズなアニメーションでストリートを進むことができます。

![Jun-07-2022 19-18-25](https://user-images.githubusercontent.com/1166342/172356750-55874849-c659-404d-a16e-494b7af133cd.gif)

ViewControllerででMapItemを指定すればマップのすぐ下にLookAroundプレビューを加えられます。
<img width="1581" alt="image" src="https://user-images.githubusercontent.com/1166342/172356838-38bd528f-05da-4964-a206-656691122729.png">

ユーザがタップすればフルスクリーンのLook Aroundビューを表示することも選べます。

<img width="1568" alt="image" src="https://user-images.githubusercontent.com/1166342/172357141-6db8406d-cf07-46f9-97b3-aad886c034d7.png">

#### Apple Maps Server APIs

RESTfulで４つの関数をサポートしました！
<img width="1771" alt="image" src="https://user-images.githubusercontent.com/1166342/172357700-791e5101-0ca8-4f61-9f6d-64d613e559d8.png">

- Geocode：経度緯度を住所に変換
- Reverse Geocode：住所を経度緯度に変換
- Search：検索
- Estimated Time of Arrival：到着予定時間

### Apple Weather

機械学習と予測アルゴリズムを組み合わせた高解像度気象モデルを使った気温と降水量予報などの天気予報を取得できるようになりました。

<img width="1139" alt="image" src="https://user-images.githubusercontent.com/1166342/172358227-cb3e8211-0305-483c-9651-6d762773c158.png">

過去のデータも含めて、10日分の一時間ごとと1日ごとの天気予報を提供します。
世界の一部では破天の通知と分単位の降水量も提供されます。
<img width="1786" alt="image" src="https://user-images.githubusercontent.com/1166342/172358265-c98ba124-cdf3-47cb-8bc5-de7dc63297bb.png">

たくさんの天候データを取得できます。
<img width="1845" alt="image" src="https://user-images.githubusercontent.com/1166342/172358677-9e1442af-0c61-411f-b49e-f039388bd16a.png">

取得するときはWeatherKitを使います。
<img width="642" alt="image" src="https://user-images.githubusercontent.com/1166342/172358798-9438acf1-4e4e-4f1a-a6ec-8feb26a40955.png">

実装はこんな感じで、晴れた場所を提案する実装ができます。
|source|view|
|-|-|
|<img width="1194" alt="image" src="https://user-images.githubusercontent.com/1166342/172359033-b380c859-22b2-49cb-a50a-1f2156afe771.png">|<img width="298" alt="image" src="https://user-images.githubusercontent.com/1166342/172359163-0ccc9c81-aecb-4ff8-aacd-76572cebec30.png">|

Apple Developer Programメンバーシップに月々50万回のAPI呼び出しが含まれています。
<img width="828" alt="image" src="https://user-images.githubusercontent.com/1166342/172359502-ee532122-c23f-4cdd-bba5-1d8e48f965bc.png">

さらに必要な方は追加で課金すればもっと使えるようになります。
<img width="1666" alt="image" src="https://user-images.githubusercontent.com/1166342/172359612-982b242a-e331-48a9-a22e-1d085090ce8e.png">


### テキスト認識表示

VisionKitを拡張して２つのAPIを追加しました。

一つはLive Text APIで画像コンテンツを解析する機能が可能になりました。
写真や一時停止したビデオの中のテキストやQRコードを使えるようになります。
<img width="1136" alt="image" src="https://user-images.githubusercontent.com/1166342/172359999-a8c406df-7829-4fe4-9a08-061cdcd4ef78.png">

さらに関連するデータをタップするだけでコピーや翻訳などのアクションを起こせる。
<img width="1185" alt="image" src="https://user-images.githubusercontent.com/1166342/172360198-99ed7eff-9f43-42ca-a882-8f1cf9591c35.png">

２つ目のAPIはData Scanner APIで、ライブカメラ映像を解析する機能が可能になりました。
テキストとバーコードの読み取りが劇的にシンプルになります。
<img width="1240" alt="image" src="https://user-images.githubusercontent.com/1166342/172360304-cfa4b302-091b-4e43-928d-9a7fb88f2fd7.png">

日本語含めて9ヶ国語サポートされます！！やったぜ！！
<img width="1350" alt="image" src="https://user-images.githubusercontent.com/1166342/172360575-4e38e883-c766-4597-bd14-d0d6ea9af4e6.png">

Live Text APIの実装とデモはこんな感じ。
|source|view|
|-|-|
|<img width="1000" alt="image" src="https://user-images.githubusercontent.com/1166342/172360862-2c50ac50-53f6-439a-a1a3-74657a963728.png">|<img width="565" alt="image" src="https://user-images.githubusercontent.com/1166342/172360953-a585e6db-35df-4eb3-b54d-678d08e85d81.png">|

住所の場合はクイックアクションを使えます。
<img width="452" alt="image" src="https://user-images.githubusercontent.com/1166342/172361038-bd5488f3-61ea-4ba6-868d-f5658a23191c.png">

DataScannerを実装してQRコードをスキャンする実装をしてみます。
カメラを起動してQRをスキャン開始する場合はこんな実装。
<img width="845" alt="image" src="https://user-images.githubusercontent.com/1166342/172361466-8b970afb-5af3-4631-8212-651c0d790734.png">

スキャンが成功した場合の実装はDataScannerViewControllerDelegateを実装することで可能になります。
<img width="1234" alt="image" src="https://user-images.githubusercontent.com/1166342/172361638-a3986320-5e1b-4bb0-8e13-d39d6a11f6c6.png">

QRを読み取るカメラはこんな感じで動きます。
<img width="553" alt="image" src="https://user-images.githubusercontent.com/1166342/172361800-519e01ef-314d-4c55-a479-12b6db8d0d98.png">

## まとめ

怒涛の量の紹介でしたが、さらっとまとめると、、、

- XcodeCloudが使えます！
- swiftとswiftUIでAppleのプラットフォームに対応することがさらに簡単になりました！
- ロック画面ウィゼットとライブアクティビティがロック画面に表示できます！
- メッセージでの共同作業が簡単にできるようになりました！
- App IntentsはアプリケーションをSiriと連携させます！
- WeatherKitやMapKit、LiveTextやMetalなど既存のAPIにも大幅アップデートしました！

もぐめっと的にはLive Activityにアプリの可能性を感じたので、これ使ってリアルタイム鬼ごっことかしたいなとか思ったりしました。

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com