こんにちは。virapture株式会社でCEOしながらラグナロク株式会社でもCKOとして働いているもぐめっとです。
先月宮古島へ行ってみたのですが、梅雨でずっと雨でした。5月に南の島はお勧めしません。
本日はWWDC2022で発表されたplatforms state of the unionをまとめてみました。
みなさんkeynoteに目が行きがちですが、開発者はこちらに目を通してから各セッションに臨んでみるといい目印になります。
下記の三本で情報をお届けします!
-
- AppleのPlatformの現状と今後の方向性
-
- アプリをAppleのプラットフォームのシステム体験と統合する方法
-
- 新しいAPI
1. AppleのPlatformの現状と今後の方向性
Xcode Cloud
2023年末までは月々25時間のサブスクリプションが無料で使えます。(その後は月々14.99$と思われる)
Swift
並行性(async await)が導入されて扱いやすくなりましたが、今年は平行性をもたらす新たなパッケージとして、非同期アルゴリズムが追加されました。
例えば、2つの非同期シーケンスを圧縮してくれる実装ができます。
時間ユニットを表すクロックタイプを備えており、時間ベースのものもサポートしています。
アクターをつかえばスレッドセーフに並行して実行できるのでデータを分離できます。
アクター間のコミュニケーションはasync/awaitを使うと効率的にできます。
今回のアップデートで分散アクターを追加しました。
分散アクターは複数のプロセスやデバイス間で通信ができます。
distributedというキーワードがリモートでアクセスされるメソッドとマークで、異なるデバイスで通信ができます。
文字列
たとえばコーのコードをパースする方法について、実装すると大変ですが...
正規表現をアップデートしていい感じに取れるようになりました!!
Unicodeのサポートも最大限活用できます!
シンタックスもハイライトされてちゃんと使えてるかもわかります。
正規表現が複雑になると難しくなるので正規表現ビルダーを追加しました!
正規表現を選択してConvertすると。。。
Generics
Genericsは汎用的に作れるようになるため便利だが、細かいことをやろうとすると大量のコードを書かないといけない。
someキーワードを追加したのでこれを使うとより簡単に表せるようになりました!
anyキーワードを使うとどんな型のコレクションでも保持できる型を表現できます。
Swift Package Manager
Package PluginによってXcodeを拡張しビルドを強化できるようになりました!
チェックアウトしてすぐ自動でDLされビルドされます。
例えばSwiftLint、SwiftFormatなどや自動生成に使えます。
オンデマンドで使うコマンドプラグインとプロジェクトのビルド時に使えるビルドプラグインの2種類あります。
例えばインポートを文字列の長さ順にフォーマットするSwiftFormatの例。
修正されたファイルを見つけてフォーマットしてくれます。
ソースコードの生成やGit連携、エラーと警告の表示なども出来ます。
もちろん、プラグインを他の人に共有も可能です!
その他のパワーアップ
- リンク時間が最大二倍高速
- 非同期タスクの優先性を確実にしてアプリの効率性と反応良さを維持している。
- swiftで書かれたアプリは動的リンカーにおける改良のおかげでiOS16にて起動時間が劇的に早くなります!
他にも盛り沢山あります。
SwiftUI
ナビゲーション
新しいナビゲーションAPIはナビゲーションスタイルが表現しやすくなった。
簡単に選択範囲保存や復元、ナビゲーションスタックの内容を置換したりすることができます。
アプリケーションの起動状態の設定や、サイズクラス感の繊維の管理や、ディープリンクへの対応などに役に立ちます。
Custom Layout API
複数の行と列にわたって配置された一連のビューのレイアウトを容易にする APIを追加しました!
例えばビューを新聞記事のように配置しスペースが必要になった時に次の列に折り返されるフローレイアウトを作成ができます。
時計の文字盤の数字のように円形にビューを描く放射状レイアウトも作れます。
メインのビューの上にスライドするようなハーフシートも表現しやすくなりました。
共有シートにも対応したのでShare Extensionを使いやすくなりました。
UIKitからSwiftUIへ段階的に移行しやすくするようにしました。
例えばカスタムセルが描けるようになりました。
※UIKitとSwiftUIの話についてはこのセッションで詳しく語られそうです。
Swift Charts
SwiftUIをもとに作られた高度なカスタマイズが可能な図表作成フレームワークが追加されました!
こんな感じでかけます。
swiftUIに対応しているのでアニメーション表現もしやすいです。
SwiftUIとXcodeとの連携
棒グラフはこんな感じでできます。
source | view |
---|---|
![]() |
![]() |
線グラフ
source | view |
---|---|
![]() |
![]() |
新しいプレビューでは異なるデバイスやテーマによる違いを見やすくなりました。
ViewThatFits
ViewThatFitsを使うといい感じに要素を並べてくれます。
source | view |
---|---|
![]() |
![]() |
NavigationSplitView
ipadなどで縦と横の要素が別々であるときにNavigationSplitViewを使うといい感じに表現してくれます。
Sidebarの内容に合わせてNavigationStackがその内容を変更してくれる
サイドバー選択前 | 選択後 |
---|---|
![]() |
![]() |
MacOSの対応はSupported Destinationsから追加します。これだけでMacOS対応完了!
macOS用にメニューバーの追加もできます。
source | view |
---|---|
![]() |
![]() |
アプリをAppleのプラットフォームのシステム体験と統合する方法
ロック画面
新しくロック画面に情報が表示できるようになったが、WidgetKitを使って同じデザインをロック画面に統合できます。
Circular
Rectangular
今後の天気予報のような情報を表示できるキャンバスを提供します。
Inline
少ない文字とSF Symbolで情報を伝えます。
watchOS9からはコンプリケーションもWidgetKitを利用するようになったので同じコードでロック画面、AppleWatchどちらも表現できます。
実装例
最初にどんな形をサポートするかを宣言します。
(ちなみにwatchOSではsystemSmallは使えないため別条件で分岐されています。)
ゲージチャートを使って現在の注文数を表示するCircularウィゼットの例
source | view |
---|---|
![]() |
![]() |
Rectangularウィゼットの例
source | view |
---|---|
![]() |
![]() |
Live Activities
Live Activitiesはロック画面でリアルタイムで状態表示できる機能です。
これもWidgetKitを使って実装しますが、Live Activityのプレゼンテーションと状態をリアルタイムで更新する必要があります。
共同作業
新しく追加されたMessages Collaboration APIを使うことで共同作業ができるようになります。
やり方は2つあります。
共同制作ポップオーバーですぐにメッセージや通話に戻れたりもできます。
Messages Collaboration APIを使うことでメッセージやFaceTimeの構造に組み込まれるようになります。
App Intents
今まではショートカットは手動で登録しないといけなかったが、App Intentsがショートカットと連携することで、何も設定することなくSiriと共にショートカットが使えるようになりました。
例えばHeySiri, ルンバでキッチンを掃除して!というだけ。
IntentDefinitionファイル内の変換ボタンを押すだけでApp Intentに対応できます。
XcodeがApp Intentsのソースコードを生成するので、空欄の所にIntentをリンクコードで入れておきましょう。
App Shortcutsを使えるように定義しておきます。Siriの呼び出すフレーズもここに定義します。
(フレーズには変数としてアプリケーション名を含めないといけません。)
使う人がなんて呼べばいいかわかるようにSiriTipViewを定義しておきます。
source | view |
---|---|
![]() |
![]() |
SiriTipViewを追加するととSiriのShortcutsにも現れるようになります。
|
認証テクノロジー
Passkeysを使うと認証フローを効率化してセキュリティ問題に対処できるようになった。
Passkeysでアカウントを設定するとき、パスワードを作る必要はありません。
ユーザ名を入力して、Passkeysを自分のiCloudキーチェーンに保存される。
これだけで全てのAppleデバイスにPasskeysが安全に同期される
サインアウトしてもすぐにサインインしなおせます。
QRを使ったサインインもできます。
QRを読み取って | FaceIdでサインイン |
---|---|
![]() |
![]() |
Passkeysは公開鍵暗号に基づいているのでサーバーから認証情報が漏れることはございません!!
サーバは認証情報の代わりに公開鍵だけを保存する。
パスワードと違ってパスキーを入力したりコピーはできないため、Passkeysによりフィッシングサイトは撲滅できます!
実装方法は公開鍵をサーバに保管し、認証用のチャレンジを送れるようにした後、アプリやサイトでユーザにパスキーを使ってサインインするようにするだけ!
もちろんパスワードとの共存も可能です。
3. 新しいAPI
UITextViewに検索や置換のAPIが追加。
ナビゲーションバー、ツールバー、文書メニューもアップグレードされます。
iPad用にDriverKitが使えるようになったので、Macでも使っていた外部ハードウェアに接続されたUSBやオーディオデバイス、PCIデバイスなどが使えるようになった。
watchOS9のCallKitフレームワークにはVoiceOver IP Background Modeが含まれるようになったので、AppleWatchから直接音声通話を行うことができるようになりました。
Bluetooth接続された医療機器はより強力な持続性とデータ通信を得られ、緊急性の高い状態が検知された時にタイムリーに警告できるようになりました。
tvOS16は近くにあるAppleTVやiPhone, iPad, AppleWatchのアプリ間で繋がりのある体験を作れるようになりました。
例えばワークアウトにAPpleWatchのモーションデータを使うことやターン制ゲームのカスタムコントローラとしてiPhone/iPadを使うことができる。
また、tvOSはデバイス検出と接続を管理してくれるので、アプリを他のデバイスで実行している必要もないです。
SKAdnetworkを改善してプライバシーを侵害することなくデータを活用できるようになりました。
ScanKitとRoomPlanというAPIでARとLiDARスキャンを使って家具を自動的に認識するようになった
昨年、集中モードを導入したが、今年、通知を管理する方法としてFocusフィルタを導入した。
FocusフィルタはApp Intents上にあり、現在の集中モードに応じて、アプリのコンテンツを調整できます。
例えば仕事中は仕事のアカウントだけを表示するFocusフィルタを設定できる。
Metal
Metal3が今年登場します。
今まで以上に高いフレームレート、没入感のあるグラフィックスのレンダリングなど、新次元の演算性能を可能にする新機能を備えています。
機械学習フレームワークのPyTorchでは、パフォーマンスが劇的に向上した。
ゲームロードに関して、最新のゲームは高画質のアセットを提供することで、リッチなゲーム体験を実現している。
しかし、GPUに素早く読み込むのは難しい。
よくある手法としては低画質バージョンを読み込み描画することになる。
Metal3ではMetal iO APIで高速リソース読み込みを実現した。
全てのAppleシリコン搭載Macの高速SSDストレージが最大限のスループットを実現するように十分なリクエストをキューに保持します。
シェーダーのコンパイルに関して、オフラインでのコンパイルを活用することで、GPUシェーダーバイナリをプロジェクトのビルド時に生成できるようになりました。
これにより読み込み時間の圧縮とレンダリングのパフォーマンスが上がりました。
ジオメトリのメッシュを生成する方法に関して、Mesh Shading APIを使うことで、最適化されたジオメトリ処理パイプラインを単一のレンダーパスで、正確に制御できるようになります。
Objectシェーダーで生成するメッシュの数が決まり、Meshシェーダーで実際にジオメトリが生成され、ラスタライザーに直接送られます。
こうすることで、デバイスのメモリに送る必要がなくなり、パフォーマンスが向上します。
MetalFX Upscalingを使うことで1フレームあたりのレンダリング時間の短縮に役立ちます。
目標フレーム時間に収まるように同じ複雑なシーンをより低い解像度でレンダリングしてから、MetalFX Frameworkで一時的なアンチエイリアスとアップスケーリングを実行して目標解像度にすることができるようになります。
(もぐめっと的にはMetalの話は難しくて理解が追いつかない。)
MapKit
配布ターゲットをiOS16にするだけで3Dの都市体験を提供できるようになりました。
カメラの中心座標の距離を600mに設定して、どこまでズームインするかを選べます。
ピッチと方角を調整し、3D空間内でカメラを傾けることもできます。
デフォルト標高は平坦ですが、elevationStyleにrealisticを設定すると、3D標高を含められる。
MapKitのDirections APIから注釈や経路ソースを加えるときはMapKitが自動的に標高を管理して注釈や経路を3D地形上に配置して調整します。

スローパンを加えてカメラの向きに動きをつけるとマップ表示がいい感じになります。
Look Around
ストリートレベルで世界を探索できる機能を追加しました。(いわゆるGoogleStreatView)
高解像度の3D写真とスムーズなアニメーションでストリートを進むことができます。
ViewControllerででMapItemを指定すればマップのすぐ下にLookAroundプレビューを加えられます。
ユーザがタップすればフルスクリーンのLook Aroundビューを表示することも選べます。

Apple Maps Server APIs
- Geocode:経度緯度を住所に変換
- Reverse Geocode:住所を経度緯度に変換
- Search:検索
- Estimated Time of Arrival:到着予定時間
Apple Weather
機械学習と予測アルゴリズムを組み合わせた高解像度気象モデルを使った気温と降水量予報などの天気予報を取得できるようになりました。

過去のデータも含めて、10日分の一時間ごとと1日ごとの天気予報を提供します。
世界の一部では破天の通知と分単位の降水量も提供されます。
実装はこんな感じで、晴れた場所を提案する実装ができます。
source | view |
---|---|
![]() |
![]() |
Apple Developer Programメンバーシップに月々50万回のAPI呼び出しが含まれています。
さらに必要な方は追加で課金すればもっと使えるようになります。
テキスト認識表示
VisionKitを拡張して2つのAPIを追加しました。
一つはLive Text APIで画像コンテンツを解析する機能が可能になりました。
写真や一時停止したビデオの中のテキストやQRコードを使えるようになります。
さらに関連するデータをタップするだけでコピーや翻訳などのアクションを起こせる。
2つ目のAPIはData Scanner APIで、ライブカメラ映像を解析する機能が可能になりました。
テキストとバーコードの読み取りが劇的にシンプルになります。
Live Text APIの実装とデモはこんな感じ。
source | view |
---|---|
![]() |
![]() |
DataScannerを実装してQRコードをスキャンする実装をしてみます。
カメラを起動してQRをスキャン開始する場合はこんな実装。
スキャンが成功した場合の実装はDataScannerViewControllerDelegateを実装することで可能になります。
まとめ
怒涛の量の紹介でしたが、さらっとまとめると、、、
- XcodeCloudが使えます!
- swiftとswiftUIでAppleのプラットフォームに対応することがさらに簡単になりました!
- ロック画面ウィゼットとライブアクティビティがロック画面に表示できます!
- メッセージでの共同作業が簡単にできるようになりました!
- App IntentsはアプリケーションをSiriと連携させます!
- WeatherKitやMapKit、LiveTextやMetalなど既存のAPIにも大幅アップデートしました!
もぐめっと的にはLive Activityにアプリの可能性を感じたので、これ使ってリアルタイム鬼ごっことかしたいなとか思ったりしました。
最後に、ワンナイト人狼オンラインというゲームを作ってます!よかったら遊んでね!
他にもCameconやOffcha、問い合わせ対応が簡単にできるCSmartといったサービスも作ってるのでよかったら使ってね!
また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。
ラグナロクでもエンジニアやデザイナーのメンバーを募集しています!!楽しくぶち上げたい人はぜひお話ししましょう!!