こんにちは。virapture株式会社でCEOしながらラグナロク株式会社でもCKOとして働いている@mogmetです。
最近沖縄行きましたが、やっぱりめんそーれな感じで海もきれいでいいところですね。定期的に行きたくなります。
本日はWWDC2023が開催されたので、今年も開発者向けのキーノートであるPlatforms State of the Unionをまとめさせていただきました。
結構大長編なので気になるところは目次を使って飛んで見ていただければと思います。
ちなみに前回はこちら。
Swiftの新機能
Swift Macros
Swift Macrosは、プロジェクトと一緒に構築される新しいコードを生成するために、コードの構造を使用する注釈です。
例えば有効なURL文字列をチェックするURLマクロの例。空白があるとその時点でエラーとして出力してくれます。
コードを書いている途中にフィードバックをもらえるのでミスに気づきやすくなります。
async/awaitを使う例
before | after |
---|---|
Swiftパッケージを通して、コミュニティが作成したマクロの恩恵を受けたり、自分のマクロを他の人と共有したりすることができます。
C++への拡張
Swift-C++の相互運用性により、中間的なブリッジングレイヤーなしで、同じプロジェクトで両方の言語を使用することができます。コンパイラフラグを設定することで、クラスや関数、さらにはvectorのようなテンプレートの特殊化を両言語間で共有することができます。
SwiftからC++を使用することで、初期化される前の変数の使用など、コードにおける未定義の動作の多くの原因を取り除くことができます。
Swift UI Animation
SwiftUIでのアニメーションで、durationとbounceという2つの簡単なパラメータで設定できるスプリングベースのモーションがデフォルトになりました。
.sprint(durtaion: 0.5, bounce: 0.3)
SFシンボルの新しいアニメーション効果を利用することもできます。
マルチパートアニメーションを構築する必要がある場合、SwiftUIにはAnimationPhaseという新しいAPIがあり、わずか数行のコードで洗練されたアニメーションを構築するのに役立ちます。
source | animation |
---|---|
キーフレーミング
SwiftUIはキーフレーミングの完全サポートを追加しました。新しいSwiftUIベースのMapKit APIのプロパティを含む、あらゆるものをアニメーション化することができます。
キーフレームは、アニメーション内の特定の時間に複数のプロパティの値を定義し、そしてSwiftUIに中間値を補間させることができます。
アップルパークまでスムーズで連続した動きを実現するデモの紹介
source | animation |
---|---|
データフロー
ビューにデータを持ち込むためのプロパティラッパーの選択肢として、@Stateと@Environmentだけに集中できるようになりました。
before | after |
---|---|
SwiftUIにモデルを公開するときに、ObservableObjectに準拠し、各プロパティにPublishedプロパティラッパーを追加して、このようなコードを書いたことがあるかもしれません | Swiftの新しいマクロのサポートは、新しいObservableマクロがその代わりとなり、よりシンプルにします。クラスを@Observableでアノテートするだけで完了です。一般に公開されているプロパティはすべて自動的に公開されます。 |
SwiftUIのビューでObservableを使用するとき、ビューの更新をトリガーするためにプロパティラッパーを使用する必要はないです。
before | after |
---|---|
ObservableはSwiftUIがフィールドごとのレベルでアクセスを追跡することを可能にし、ビューによって使用される特定のプロパティが変更されたときにのみ、ビューのボディが再評価されるようにします。
ビューで使用されないフィールドを変更する場合、無効化はまったく起こりません。
SwiftData
SwiftDataは、データモデリングと管理のためのフレームワークです。Core Dataの実証済みの永続化レイヤーの上に構築されていますが、Swiftのために完全に再設計され、再創造されたAPIを備えています。SwiftUIのように、それは外部ファイルフォーマットなしで、コードに完全に焦点を当てます。代わりに、それは合理化されたAPIを提供するためにSwiftの新しいマクロシステムを使用しています。
SwiftDataでは、@Modelマクロでクラスをアノテートするだけです。
@Model
class Bird {
var name: String
var species: Species
var songs: [Song]
}
この1行のコードには、自動的に永続化、iCloud同期、UndoとRedoなどを有効にするような、多くの機能が詰め込まれています。
そして、値がすべてのインスタンス間で一意でなければならないことを示すような、追加の属性でプロパティをアノテーションすることによって、これらの自動動作を洗練することができます。
@Model
class Bird {
@Attribute(.unique) var name: String
var species: Species
var songs: [Song]
}
また、SwiftDataは構造体とenumを理解するためにCodableプロトコルを使用するので、すでに知っているツールでデータをモデル化することができます。
enum Species: Codable {
case houseFinch
case barnOwn
case baldEagle
case other(String)
}
struct Song: Codable {
var length: Duration
var volume: Int
}
Widget Kit
iOS 17にリビルドしたら、ほんの少しの簡単な変更で、既存のウィジェットがiPhoneのStandByで豪華に見えるようになります。
また、iPadのロック画面でも、背景が取り除かれ、エッジが立った状態で表示されます。
macOS Sonomaでは、デスクトップ上でフルカラーで表示され、ウィンドウにフォーカスが当たると背景に隠れます。
before | after |
---|---|
インタラクティブ機能を新たにサポートすることで、リマインダーのチェックオフなど、タップで実行できる簡単なアクションをウィジェットから直接操作できるようになりました。
アーキテクチャの解説
ウィジェットのコードは、コンテンツを生成するために非同期で実行され、それが構築するSwiftUIビューは、その後アーカイブに保存されます。その後、ウィジェットの描画が必要になると、アーカイブをロードし、バックグラウンドでレンダリングし、システムUIの一部として表示することができます。
ユーザーがボタンをタップすると、その拡張機能が再び実行され、アクションを処理し、UIを更新します。
このアーキテクチャにより、iPhoneのウィジェットをMac上でシームレスに表示することもできます。
Continuityの魔法により、ウィジェットのアーカイブはネットワークを介してMacに送信され、
ユーザーのインタラクションはiPhoneで処理されるように送り返されます。
使い方
ウィジェットの背景を特定し、WidgetKitによって提供されるデフォルトを使用するためにそのパディングを更新するだけです。SwiftUIのスタックベースのレイアウトは、システムがコンテキストに基づいてウィジェットの色と間隔を適応させることができます。
既存のウィジェットに新機能を含める方法についてデモ
ウィジェットのビューを見ると、背景がZStackの中にあることがわかります。
あとは、これを新しいコンテナ背景ビューモディファイアに移動するだけです。
そして、iOS 17から、ウィジェットのパディングが提供されるようになったので、前に追加していたパディングを削除します。
Swift Macrosのおかげで、私はXcodeのプレビューで直接全体のウィジェットタイムラインを見ることができます。
プレビューキャンバスの下部に、すべてのタイムラインエントリーがあります。そして、それらをクリックすると、ウィジェットが更新されるときにどのようにアニメーションするかが表示されます。
さらにエディタで、BirdViewにトランジションモディファイアを追加してみます。リーディングエッジのプッシュを試してみます。
source | animation |
---|---|
プレビューキャンバスが更新されたことで、新しいiPadのロック画面やiPhoneのStandByのように、異なるコンテキストで自分のウィジェットがどう見えるかを簡単に確認できるようになりました。
SwiftUI は新しい showsWidgetContainerBackground
変数を提供し、背景が取り除かれたときにウィジェットがどのように見えるかをカスタマイズすることができます。
source | preview |
---|---|
ウィジェットからアプリと連動できるようになったので、ボタンを追加してみます。
source | preview |
---|---|
simulatorで試してみるとボタンと連動していることがわかります。
App Intents
App Intentsは、単にウィジェットのインタラクティブ性を高めるだけでなく、Spotlight、ショートカット、Siriなど、システム全体であなたのアプリケーションの機能を向上させます。
インテントをApp Shortcutにまとめると、Spotlightの結果でアプリアイコンのすぐ隣に表示され、よりリッチでインタラクティブなプレゼンテーションができるようになります。
実装方法はアプリのショートカットに、短いタイトルと画像またはシンボルを用意します。
そして、アプリのInfo.plistに、アプリアイコンと相補的な背景色を指定します。
アプリのショートカットは、アップデートされたショートカットアプリケーションに表示され、ユーザーは自動的に実行するように設定したり、ホーム画面に追加したり、独自のショートカットを作るために使用したりすることができます。
TipKit
適切なタイミングで適切な機能についてユーザーを賢く教育するフレームワークです。
テンプレートをカスタマイズし、ターゲティングを追加するだけで、現在のコンテキストに関連した機能をユーザーに教育することができます。
また、全体の頻度を管理することで、ユーザーが別のデバイスで見たとしても、すでに見たことのあるTipを表示しないようにすることができます。
AirDrop
共有シートをスキップして、近くにある別のデバイスに素早くコンテンツを送ることができます。
アプリのUIKitビューコントローラーでactivityItemsConfigurationを採用することができます。
ShareSheetやQuickLookのようなシステムが提供するViewControllerは、すでにデフォルトで動作しています。
ゲーム
Game Mode on macOS Sonoma
Mac Sonomaで、ゲームをより良いものにするゲームモードを追加しました。
Game Porting Toolkit
Game Porting Toolkitを使用すれば、3つのステップでMacにゲームを持ち込むのがこれまで以上に簡単になります。
-
既存ゲームの評価
提供されるエミュレーション環境を使って、既存のWindowsゲームがMacでどの程度動作するかを評価することができます。
-
シェーダーの変換とコンパイル
Game Porting Toolkitには、新しいMetal Shader Converterが含まれており、これを使用すると、ジオメトリ、テッセレーション、メッシュ、レイトレーシング段階などのゲームの高度なシェーディングパイプラインを含め、既存のHLSL GPUシェーダをすべてMetalに自動的に変換できます。
このツールは、Xcodeでゲームを構築しているときにも、シェーダーコンパイル用のWindowsベースのカスタムツールチェーンでも使用できます。
-
グラフィックスコードの変換とゲームの最適化
Metalは、現代のハイエンドゲームで使用される高度なグラフィックスと計算機能をすべて提供するため、グラフィックスコードの変換は驚くほど簡単です。また、Xcodeに統合された強力なグラフィックスパフォーマンスとデバッグツールは、ゲームを完全に最適化するために必要なすべてのガイダンスを提供します。
カメラとディスプレイ
今年、下記の強力なパフォーマンスの向上が図られました。
Zero shutter lag: シャッターが押された瞬間を正確にキャプチャします。
Overlapping captures: シャッターが急激に押されたときにカメラが画質を動的に調整します。
Deferred processing: Deep Fusionを含む高品質な画像をバックグラウンドで処理することが可能です。
これらの改善により、高画質な画像を撮影しながらも、iOSまたはiPadOSアプリでシャッターを押す間のショット・トゥ・ショット時間が最大で3倍速くなります。
そして今年の後半には、ボリュームボタンと上下ボタンでカメラのシャッターを切ることもできるようになる予定です。
ISO HDR API
AppleはHDR業界全体の取り組みを推進し、HDR写真のエンコードと表示に関する仕様を策定し、国際標準化機構で承認されました。
そしてこれらの標準化されたHDRの機能がiOS、iPadOS、macOSのAPIとして提供され、数行のコードで対応する写真をアプリケーションに表示できるようになりました。
キャプチャから編集、共有まで、完全なHDRワークフローが可能になり、撮影者が体験したように、誰もがHDRの輝きを楽しむことができるようになります。
Video conferencing
Appleはリアクション、ジェスチャー、プレゼンターのオーバーレイ効果のように、ビデオ照明と効果に投資し続けてきました。これらのエフェクトは、あなたが受け取るカメラフィードに組み込まれているので、あなたのアプリの中でだけ機能します。
アプリは、これらのエフェクトが呼び出されたときに観察することができ、そのユーザーのタイルを宣伝して、リアクションしたことをみんなに見てもらうなど、追加のアクションを実行することができます。
ScreenCaptureKit
画面共有とカメラ機能に多くの改良が加えられました。
新しいScreenCaptureKitのピッカーは、ユーザーがよりプライベートで安全な方法で、画面共有を開始するのをよりシンプルにするものです。
また、ピッカーは、アプリが複数のウィンドウや複数のアプリを一度にキャプチャすることを容易にします。
ユーザーは、今いるアプリケーションからすぐに共有を開始でき、
新しいビデオエフェクトメニューで共有されるもののプレビューを見ることができるので、とても便利です。
ScreenCaptureKitのもう一つの利点は、単一のウィンドウを共有する際に、より見栄えの良い画面共有のための高解像度で共有ができます。
外部カメラとの接続
iPadで外部カメラをサポートするようになりました。あらゆるUSBカメラを接続し、iPadアプリ内で使用することができるようになりました。
tvOSにカメラとマイクの機能を追加しました。tvOSのContinuity Cameraを使えば、iPhoneやiPadを活用して、tvOSアプリにビデオとオーディオを初めて統合することができます。
例えば、会議アプリケーションはCenter Stageを使うことで、家庭で一番大きなスクリーンでグループビデオ通話をよりダイナミックにすることができます。
Continuity Cameraのデモ
Continuity Cameraの活用例としてPartyCamという楽しいフィルターを使って自撮りするアプリでSwiftUIを使ったデモを紹介。
まず、Apple TVをデスティネーションとして追加します。
次に、ピッカーを追加して、ユーザーがどの電話機から選べばよいかを知ることができるようにする必要があります。そして、ピッカーを提示するためのコードを追加します。
そして、実行します。そして今度は、リモコンを手に取って写真を撮るだけです。
Apple Watch (watchOS10)
Vertical TabView
Vertical TabViewではページサイズを変更することができ、貴重なコンテンツのためのスペースを犠牲にすることなく、アプリ内でスクロールするためのクラウンを有効に活用することができます。
source | simulate |
---|---|
containerBackgroundモディファイア
新しいcontainerBackgroundモディファイアを使えば、ユーザーがアプリ内のどこにいるのかを理解しやすくしたり、データをより見やすくするために、読みやすいグラデーションフィルで色を使うことができます。
tab1 | tab2 | tab3 |
---|---|---|
自動デザイン
画面いっぱいに広がるアプリのデザインでは、新しいToolbarItemの配置でコーナーを有効活用し、必要に応じて時間を自動的に中央に移動させることができます。
source | preview |
---|---|
NavigationSplitViewの改善
ソースリストとディテールビューの関連性が強いレイアウトでは、他のプラットフォームで使用するのと同じコードを使用して、Apple Watch上でNavigationSplitViewがこれまで以上に説得力を増しています。
source | preview |
---|---|
詳細ビューのピボットインとアウト
Apple Watchでの詳細ビューのピボットインとアウトは、SwiftUIの新しいインタラクティブなスプリングアニメーションを使用しています。
このアニメーションは、ユーザーの指の速度によって駆動されるビューのサイズと位置の両方をアニメーションさせるアニメーションプランのための12の別々のトラックで構成されています。もちろん、すべての主要なUIコンポーネントは、どんな背景でも読みやすいようにマテリアルトリートメントで更新されており、ハードウェアに合わせて自動的にサイズ調整されます。
すでにアプリにSwiftUIを採用している場合、watchOS 10 SDKでビルドすると、これらのアップデートが自動的に行われます。
watchOS 10でより快適にアプリを使うための編集のデモ
アプリを起動したときに、常にリストから選択するのではなく、プライマリー・ヤードの現在のステータスを確認したいと思います。
NavigationSplitViewは、ソースリストと詳細の関係が強いアプリに特化して設計されているので、NavigationStackをNavigationSplitViewに置き換えてみることにします。
一覧はもはやアプリのエントリーポイントではないので、ナビゲーションタイトルを削除し、デフォルトで開くべき詳細ビューを表示することにします。ソースリストは詳細ビューの後ろに隠れるようになり、詳細に集中できるようになりました。
そこで、リストを縦長のTabViewに変換して、各セクションに別々のページを作成し、コンテンツを分割することにします。
各ページはデフォルトで画面の高さになり、最後のセクションにはForEachループが含まれているので、それぞれの鳥が自分のページを持つことになります。
むしろ、すべての鳥のリストを1つのタブに表示し、画面の高さを超えたらスクロールするようにしたいので、このForEachをListに変更し、スクロール可能なビューにすることにします。
次に、タブを区別するために色を付けたいので、各タブに .containerBackground modifierを追加します。
また、食べ物や水が少なくなったときにすぐに分かるように、「Sustenance」の背景をダイナミックなものにします。供給量に応じて、緑、黄、赤の3色になります。ライブプレビューで変更点を確認すると、背景色によってアプリ内の位置関係がわかり、食料や水の補給が必要なタイミングがわかりやすくなっていることがわかります。
最後のタブでは、画面の枠を越えてコンテンツをスクロールすることができ、
「ソースリスト」ボタンをタップすれば、バックヤードのリストに到達できます。
その他の追加機能
watchOS 10 には、AppIntents の関連性によって、ウィジェットが適切なタイミングでスマートスタックに移動できるようになる新しいシステム空間もあります。
.containerBackground修飾子を使えば、ウィジェットを美しいカスタム背景で輝かせることができます。
ワークアウトアプリケーションを開発されている方は、アプリケーションからフィットネスプランを共有できる新しいカスタムワークアウトAPIや、ゴルフやテニスなどのスポーツのスイング解析を向上させるために、より忠実なモーションと加速度計データのキャプチャを可能にする新しいCoreMotion APIを使って、Apple Watchのフィットネストラッキング機能をユーザーに活用していただくことができます。
また、CoreMotion APIは、ゴルフやテニスなどのスポーツのスイング解析を向上させるために、より忠実なモーションと加速度センサーのデータを取得できるようにします。
アクセシビリティ
アニメーションや点滅する光に敏感なユーザーへのサポートの拡充のために2つのAPIを提供しました。
アニメーション画像の一時停止
SafariやメッセージなどのアニメーションGIFの動きを停止させます。
実装例として、SwiftUIのTimelineViewで一連の画像をアニメートしているとします。
新しい環境プロパティを使用して、ユーザーがアニメーション画像の一時停止を好むかどうかを理解し、もしそうなら、アニメーション画像を静止画像に置き換えて、その選択を尊重することができます。
Dim Flashing Lights
明るく点滅する光のシーケンスの間、ビデオの表示を自動的に暗くするものです。
AVFoundationのビデオレンダリングパイプラインに、点滅する要素を識別して暗くする新しいフェーズが追加されました。
アプリでメディアを再生するためにAVFoundationを使用している場合、この機能をサポートするための余分な作業は必要ありませんが、アプリがカスタムメディアプレーヤーを使用している場合、Dim Flashing Lights APIを使用して、点滅するビデオコンテンツを識別し、自動的に暗くすることができます。
Privacy
許可の拡充
カレンダーの追加アクセス許可
アプリでイベントを書き込むだけであればカレンダーへの読み取りアクセスは必要ありません。このような場合のために、新しい追加専用パーミッションを作成しました。これにより、必要なアクセス権を得ることができ、ユーザーは納得のいくプロンプトを得ることができます。
写真のアクセス許可の拡充
写真では、ユーザーがアプリに写真を提供する際に、共有する写真を選択するか、自分のライブラリ全体へのアクセスを提供するか、2つの選択肢を用意しました。
さらにアプリに埋め込むことができる新しいフォトピッカーを追加し、ユーザーはアプリの中から共有する写真を簡単に選択できるようにしました。
App Privacy
プライバシーマニフェスト
サードパーティーのSDKがどのようにデータを使用するかを理解するためのもの。
標準的なフォーマットで、アプリ内のサードパーティのコードのプライバシー慣行を概説するファイルです。
アプリを配布する準備をするとき、Xcodeは、あなたが使用しているすべてのサードパーティSDKにわたってすべてのマニフェストを1つの使いやすいレポートに結合します。
サードパーティーのSDKに署名を導入
アプリでサードパーティSDKの新しいバージョンを採用するとき、Xcodeは、それが同じ開発者によって署名されたことを検証し、より安心感を与えることができるようになりました。
サードパーティSDKのプライバシーマニフェストと署名により、ユーザーを保護し、データがどのように使用されるかを理解してもらうことがさらに容易になります。
Communication Safety
iOS 15では、メッセージにコミュニケーションセーフティ機能を導入し、Appleデバイスを使用する子どもたちをより安全に保護できるようになりました。
Sensitive Content Analysisフレームワークによって、Communication Safetyをプラットフォーム全体に導入できます。
このフレームワークは、わずか数行のコードで、ヌードを含む画像や動画を検出するのに役立ち、これは完全にデバイス上で行われます。
let sensitivityAnalyzer = SCSensitivityAnalyzer()
let analysisResult = try! await sensitivityAnalyzer.analyzeImage(at: imageURL)
// analysisResult.isSensitiveがtrueであればアプリの体験をカスタマイズする
このフレームワークは、画像や動画を完全にデバイス上で処理することで、ユーザーのプライバシーを保護します。
センシティブコンテンツ分析フレームワークは、ユーザーがコミュニケーションセーフティとセンシティブコンテンツ警告のどちらを有効にしているかを知らせてくれるので、どちらの機能が有効になっているかによって、アプリの体験をカスタマイズすることができます。
App Store (StoreKit)
SubscriptionStoreView
StoreKitを拡充してアプリの商品化UIを強化する新しいビューのコレクションを提供します。
ProductViewでは、App Store Connectで定義したデータを使って商品を表示することができます。アプリのルック&フィールに合うように簡単にカスタマイズできます。
SubscriptionStoreViewは、サブスクリプションのために作られたビューです。わずか1行のコードで、各レベルのサービスの説明、価格、期間がユーザーに明確に表示されます。
これらのビューは、iPhoneのためだけのものではありません。同じコードで、すべてのApple製デバイスのプラットフォームエクスペリエンスにマッチするビューが作成されます。しかも、Apple Watchのコンパクトなディスプレイに合わせて拡大縮小することもできます。
そしてもちろん、すべてのユーザーのためにアクセシビリティとローカライズを念頭に置いて作成されています。
SwiftUIを使ったSubscriptionStoreViewのデモ
Backyard Birds Passの定期購入の提供についてデモの紹介。
XcodeでSubscriptionStoreViewにいくつかの宣言を追加し、Backyard Birdsのルック&フィールに合わせます。マーケティングコンテンツをビューでカスタマイズし、コンテナの背景を追加し、購読オプションのスタイルを変更します。
さらに、シミュレーターで、ユーザーと同じ体験をすることもできます。
ここでは、オファーを選択し、購読をクリックし、購入を完了することができます。
これだけで、ユーザーが十分な情報を得た上で意思決定を行うために必要な情報をすべて表示する、カスタマイズされた購入体験を構築することができます。
SubscriptionStoreViewは、ユーザーの適格性を自動的に判断し、適切なオファーを表示することができます。新しいStoreKitビューは、アプリ内購入の商品化に最適な方法です。
SKAdNetworkの拡充
SKAdNetworkは、広告ネットワークがユーザーのプライバシーを守りながら、広告キャンペーンがアプリのダウンロードをどれだけ促進したかを測定するお手伝いをします。
SKAdNetwork 5では、リエンゲージメントを測定することができます。ユーザーがアプリをダウンロードした後のコンバージョン計測に加え、広告をタップしてアプリを開いた後のコンバージョン計測も可能になります。
バージョン5は、今年後半にリリースされるiOS向けリリースで利用可能になる予定です。
Xcode 15
コードの状況をみて、最も関連性の高い補完から始めることができます。
アセットカタログリソースのシンボルを自動的に生成するので、コード補完で表示され、コードで使用しやすくなります。これにより、タイプの安全性と、実行時に資産が利用できるという安心感が得られます。
プレビューは、swift macrosを使ってより使いやすくなりました。
before | after |
---|---|
異なるプラットフォームやデバイスでの作業がより簡単になりました。キャンバス上でそれらを選択できるので、あなたのビューがどこでも美しく見えることを確認できます。
すべてのUIフレームワークでプレビューを使用できるようになりました。SwiftUI、UIKIt、AppKitのいずれを使用している場合でも、コードのどこからでも一貫した体験でUIを反復することができます。
Xcodeにgitの機能が統合されました。diffを見たり、
diffのファイル一覧をみながら直接コミットなどをすることができます。
テストレポートの完全な再設計が含まれており、結果をよりよく理解し、行動を起こすための新しいツールを提供します。
同じアサーションメッセージを持つものなど、共通の失敗パターンを含むトップインサイトも表示できます。
UITestでは結果のスクリーンショットなども確認できます。テストが失敗するまでに何が起こったか確認することができます。
Xcode Cloud
TestFlightに配布する際、テスターノートを作成して共有できるようになり、最新の改善点をすべてのユーザーに知らせることができるようになりました。
Xcode Cloudは、DeveloperIDで配布する際にmacOSの公証をサポートするので、ユーザーと共有する前に、アプリに悪意のあるコンポーネントがないか自動的にチェックすることができます。
Mac App Store
Mac App Storeでは、Xcodeのサイズが50%小さくなり、すべてのシミュレータがオンデマンドでダウンロードできるようになりました。
vision OS
Apple Vision Proに搭載されるOSでの開発についての紹介です。
Shared Space
デフォルトでは、アプリは共有スペースに起動します。
共有スペースは、Macのデスクトップ上の複数のアプリケーションと同じように、アプリケーションが並んで存在する場所です。ユーザーは、アプリを好きな場所に配置し直すことができます。
Window / Volume / Space
空間コンピューティングの基本的な要素であるWindow、Volume、Spaceという空間コンピューティングの基本要素によって、没入感の連続に対応するアプリケーションを構築するための柔軟なツールセットが提供されます。
Window
visionOSでは、アプリは1つ以上のウィンドウを開くことができ、それはSwiftUIのシーンで、空間内の飛行機として動作します。
これらは従来のビューとコントロールを含むことができ、さらに、3DオブジェクトとRealityViewsをサポートし、3Dコンテンツが2Dコンテンツと一緒に座ることができます。
Volume
アプリはSwiftUIシーンでもある3次元ボリュームを作成し、ゲームボードや地球儀のような3Dオブジェクトを表示することができます。
ボリュームは、この空間の中を移動し、あらゆる角度から見ることができます。
Full Space
場合によっては、ユーザーがビデオを見たり、ゲームをしたり、プレゼンテーションのリハーサルをしたりするために、アプリの没入のレベルをよりコントロールしたいかもしれません。この場合は、専用のフルスペースを開き、アプリ、ウィンドウ、ボリューム、3Dオブジェクトだけをユーザーの視界に表示させることができます。
UIを構築するSDK
SwiftUI、RealityKit、ARKitは、visionOSのために拡張されました。
- SwiftUIとUIKit: ユーザーインターフェイスを構築
- RealityKit: 3Dコンテンツ、アニメーション、視覚効果を提示
- ARKit: ユーザーの周りの空間を理解する
導入方法
Xcodeで、プロジェクトにvisionOSのデスティネーションを追加します。
目や手の入力用に調整された間隔を持つフルリサイズ可能なウィンドウ
カスタムコントロールのハイライト調整へのアクセスを持ってます。
visionOS固有のコードを追加して、アプリをウィンドウ、ボリューム、またはスペースのコレクションに拡張することができます。
拡張内容
SwiftUIでは、深度を追加したり、ウィンドウの中に3Dオブジェクトを追加したりできるようになりました。
iOSやMacOSでは、ビューを重ねるためにZStackを使うのが一般的ですが、visionOSではさらに進んで、奥行きで分離することができます。これにより、2次元のアプリに3次元の感覚を与えることができます。
新しいz-offsetビューモディファイアを使えば、UI要素に微妙な奥行きの変化を加えることができます。
オフセット値を高くすると、低い値を持つビューの前にビューが表示されます。
また、選択項目の詳細を表示する場合など、強調表示やモダリティの変更を示すために使用することができます。
さらにビューモディファイアを追加することで、幅、高さ、奥行きをより自由にコントロールすることができます。
Vision Proでは、ジェスチャーでさえも、追加されたスペースを意識しています。私たちは皆、画面上でオブジェクトをドラッグすることに慣れています。物理的な空間のどこでもオブジェクトを動かしたり回転させたりできるようになるでしょう。
SwiftUIでボリュームを作成することもできます。アプリのウィンドウと一緒に存在することができ、共有スペースで実行されているとき、他のアプリと並んで座っています。
そして、SwiftUIのウィンドウとボリュームは、ユーザーの部屋のどこにでも3DオブジェクトとSwiftUIエレメントを配置できるFull Spaceの中にも入れることができます。
UI拡張
SwiftUIはRealityKitを通してレンダリングするようになったので、SwiftUIとRealityKitのAPIを簡単に混ぜることができるようになりました。オーナメント、マテリアル、ホバーエフェクトなどのUI拡張を利用することができます。
オーナメント
オーナメントを使えば、ウィンドウやボリュームのエッジにUIコンポーネントを貼り付けることができます。ツールバーやメニューのようなものに最適です。
ホバーエフェクト
ホバーエフェクトは、ユーザーの視線に反応してUI要素を強調表示します。システムコントロールは自動的にこれらの効果を得ますが、カスタムコントロールにハイライトやグローを表示するかどうかは、オプションで決めることができます。
マテリアル
マテリアルは、ユーザーを取り巻く世界に適応します。ダイナミックなぼかしと鮮やかさで、どんな状況でもアプリを読みやすくします。
UIKit on visionOS
UIKitで構築された既存のアプリもvisionOS用に再コンパイルすることができ、オーナメント、ホバーエフェクト、マテリアル、ネイティブのルック&フィールにアクセスすることができます。
RealityKit on visionOS
恐竜のような3Dシーンへのポータルを作成する機能や、驚くほどシャープなテキストをレンダリングして快適に読めるようにする機能、魅力的な視覚効果を生み出すカスタマイズ可能なマテリアルシステムなど、大きな新機能もあります。
Dynamic foveation
Apple Vision Proでは、Dynamic foveationと呼ばれる技術を使うことで、レンダリングがさらに効率化されています。
RealityKitはアイトラッキングを活用して、ユーザーが注目している領域を選択的に非常に高い忠実度でレンダリングするため、周辺部のコンテンツのレンダリングコストを削減し、アプリケーションがデバイスの処理能力を最大限に発揮できるようにします。
RealityKitは、反射率や金属性などの物理特性を指定することで、3Dモデルを驚くほどフォトリアリスティックにレンダリングします。デフォルトでは、RealityKitは、その照明が物理的な部屋の照明条件に接続されるように仮想コンテンツをレンダリングします。
before | after |
---|---|
創造的な意図に基づいてリアルさをカスタマイズしたり、さらに拡張したい場合は、画像ベースの照明アセット(IBL)を提供して見た目を個性的にすることができます。
Material X
RealityKitは、マテリアルのオーサリングに、映画、視覚効果、エンターテインメント、ゲームの大手企業が使用するサーフェスおよびジオメトリシェーダーを指定するためのオープンスタンダードであるMaterialXを採用しました。
シェーダーを書くのが非常に簡単になりました。MaterialXでは、シェーディングプロパティを定義することで、個々のマテリアルの外観をデザインし、迅速に反復することができます。
マテリアルのリポジトリがあり、そこから選ぶことができます。
また、HoudiniやMayaのような便利なツールを使って、独自のカスタムシェーダーを作成することができます。
RealityView
RealityKitはRealityViewと呼ばれる新しいSwiftUIビューを提供します。
RealityViewは、ウィンドウ、ボリューム、スペース内で使用することができ、あなたがコントロールするシーン内の好きな場所に3Dコンテンツを配置することができます。
また、3Dコンテンツに2DのSwiftUIビューを埋め込むことができるAttachmentsもサポートしています。
ARKit on visionOS
visionOS上のリアルタイム・アルゴリズムをホストし、コア・システム機能のホストをパワーアップさせます。これらのアルゴリズムは常に実行されているため、アプリがどのように構築されても、共有スペースでARKitの恩恵を自動的に受けることができます。
パーシステンスとワールドマッピングは、システムによって処理されます。
セグメンテーション、マット、環境ライティングは、空間全体に自動的に適用されます。
ユーザーの許可があれば、ARKitの機能をあなたのFull Spaceアプリで直接利用できるようになります。
Full Space内では、iOSのARKitと同じAnchorの概念を用いたARKitの平面推定、シーン再構成、画像アンカリング、ワールドトラッキングを活用し、アプリ内の部屋でリアルに対話できます。これにより、既存のARKitアプリをvisionOSに簡単に移行することができます。
さらに、visionOSでは、平面推定、シーン再構成、画像アンカリング、ワールドトラッキングに加えて、Skeletal Hand Trackingにもアクセスできるようになりました。ハンドトラッキングを使用して、アプリ体験のためのカスタムジェスチャーを作成したり、ユーザーの手をデジタル情報で補強したりすることもできます。
ARKitは、iOSで導入されたのと同じスケルタルモデルで、関節の位置と向きを提供します。
アクセシビリティ on visionOS
Apple Vision Proでは、身体や運動に障害のあるユーザーは、目、声、またはその両方を組み合わせて、デバイスと完全に対話することができます。また、Vision Proを操作するための代替ポインターとして、人差し指、手首、または頭で選択することもできます。
visionOSでは、当社の他のプラットフォームで長年使用してきたのと同じ手法で、アプリケーションをアクセシブルにすることができます。
アクセシビリティ・インスペクターは、visionOSアプリケーションのアクセシビリティ問題を分析・報告し、よりアクセシブルにする方法を提案します。
オブジェクトの物理的な外観などの情報を伝えるラベルや説明を追加することで、目の見えないユーザーや弱視のユーザーに対して、VoiceOverがアプリケーション内のオブジェクトを説明できるようにすることができます。
Xcodeでの開発
Xcode Previewsを使えば、エディタを離れることなく、外観を素早く反復することができます。
アプリ全体のテストを開始する段階になったら、シミュレータに移動して、アプリを実行し、デバッグするための強力な環境を提供します。
シミュレーターでは、キーボード、トラックパッド、互換性のあるゲームコントローラーを使って、シーンを移動したり、見回したりすることができます。また、システムのジェスチャーをシミュレートすることで、アプリと対話することができます。
また、シミュレーターには、昼と夜の照明条件を備えた3種類のシミュレーションシーンが用意されており、アプリを視覚化するのに役立ちます。
Vision Proを使った開発では、デバイス上でアプリをビルドして実行し、動作を確認することになります。
Mac Virtual Display
Macの高忠実度の4Kバーチャルモニターを、見るだけでVision Proに取り込むことができます。
デバイスの中からMacの全機能を使うことができ、その中にはXcodeも含まれています。コーディング、テスト、デバッグをVision Pro上で行いながら、中断や文脈の喪失が一切ない、エンドツーエンドの素晴らしい開発体験ができます。
Xcodeは、あなたの3Dコンテンツに関連する衝突、オクルージョン、およびシーンの理解を調べるのに役立つ実用的なデバッグの視覚化を備えています。これらのビジュアライゼーションは、シミュレータとVision Proの両方で機能します。
Reality Composer Pro
Reality Composer Proは、visionOSアプリ用の3Dコンテンツをプレビューして準備するためのアプリケーションです。
3Dモデル、アニメーション、画像、サウンドなどのアセットをインポートして整理することができます。
Xcode のビルドプロセスと緊密に統合され、Vision Pro で使用するためにアセットを最適化します。
コンテンツをVision Proに送信して、プレビュー、サイズ調整、回転を簡単に行うことができます。いつでも新しい変更を加えることができ、コードを入力する前にコンテンツの外観を確認することができます。
Reality Composer Proを使った3Dコンテンツの更新デモ
3Dモデリングアプリケーションで作成した衛星モデルと画像をインポートします。
このモデルは、細部まで作りこまれていますが、マテリアルはありません。Reality Composer Proでカスタムマテリアルを作成し、
それをカスタマイズできるShader Graphにて、簡単な画像や関数ノードを追加して、ノーコードでオブジェクトの見た目を変えられます。
また、シェーダーを手打ちすることによるコンパイラーエラーも発生しないので、いろいろ試してすぐに結果を見ることができます。他のノードについても、これを繰り返していきます。
いつでも、Vision Pro上で自分の作品をプレビューすることができます。スケールを変えたり、動かしたり、回転させたりして、思い通りに見えるか、感じられるかを確認することができるのです。
Xcodeに戻り、変更がプロジェクトに反映され、Xcode PreviewsやSimulatorで使用する準備が整ったところで、このように、コードを読み込んでアプリで使用することができます。
Reality Composer Proを使えば、VisionOSの開発プロセスに、Xcodeと並んで動作する強力な新しいツールが加わり、3Dコンテンツのプレビューと準備が、コードの構築と実行と同じくらい簡単にできるようになりました。
VisionProアプリの配信
アプリのベータテストの準備ができたら、TestFlightは最初からVision Proで使用できるようになります。
App Store Connect、Xcode、またはXcode Cloudを通じて配信するのと同じように、新しいビルドをTestFlightに提出すると、テスターはそれをインストールして、ネイティブのTestFlightアプリケーションから直接貴重なフィードバックを提供することができます。
テスターは、Vision Pro上で互換性のあるiPadおよびiPhoneアプリケーションのベータ版ビルドにアクセスすることができます。
Unity対応
アプリをVision Proで簡単に使えるようにするために、AppleとUnityは深く協力し、UnityのリアルタイムエンジンをRealityKitの上に重ね、開発ツールがvisionOSをターゲットにできるようにしました。
つまり、Unityで作成されたアプリは、Shared Spaceで他のvisionOSアプリと共存し、Apple Vision Proのユニークな利点を最大限に活用することができます。
知っておくべきvisionOSの基本的な機能
Vision Pro用のアプリケーションを作成するために使用するフレームワークは、2つの目標を念頭に置いて設計されています。それは、最小限の労力でプラットフォームの強力なハードウェアとソフトウェアを活用できるようにすること、そしてユーザーのプライバシーを保護することです。
周辺環境
visionOSは、ユーザーの周囲の3Dモデルを構築し、リアルな照明と影を実現します。その結果、アプリはカメラデータにアクセスすることなく、周囲の世界に自然に溶け込むことができます。
空間オーディオ
visionOSは同じ3Dモデルを使って、アプリのための次世代の空間オーディオを実現します。現実の世界では、音は壁や家具にぶつかって跳ね返り、人の耳に届くまで、空間内や周囲で反響します。アプリのバーチャルサウンドも、これと同じように振る舞う必要があります。
そのためには、ユーザーの周囲を高度に理解する必要があります。visionOSのPHASE空間オーディオエンジンは、音響センシングと3Dシーン理解を融合させ、空間の音波特性の詳細なモデルを作成します。音源とユーザーが環境を移動すると、PHASEはリアルタイムでオーディオレイトレースシミュレーションを更新します。
このモデルは、Appleのパーソナライズド・スペーシャル・オーディオ・テクノロジーと組み合わされ、一人ひとりとその周囲の環境に合わせた体験を自動的に提供します。
RealityKitを使えば、どこから音を出すかを決めるだけで、visionOSがそれを自然に現実の世界に混ぜ込んでくれます。
ユーザ入力
visionOSのユーザー入力は自動的に機能し、デザインによってプライベートなものとなっています。
SwiftUIやRealityKitを使って作られたUI要素には、ホバーエフェクトが自動的にレンダリングされます。ユーザーがボタンを見た場合、タップする前にハイライトされます。
マウスのクリックやiPhoneのタップのように、ユーザーが指をタップすると、あなたのアプリに選択したことが通知されます。ユーザーがタップする前にどこを見ているかを知る必要がなく、ユーザーは必要な視覚的フィードバックを得、あなたは期待通りのインタラクションを受け取ることができます。
Sharing and collaboration
SharePlayを使えば、次世代の共有体験が可能になります。
あなたのアプリケーションがGroupActivities APIでSharePlayを採用すると、各ウィンドウの共有コントロールに、通話中の全員にあなたのアプリケーションを起動させるオプションが追加されます。これにより、真の意味での共有体験に、リアルタイムで一緒に参加することができます。
FaceTime通話中のVision Proユーザーは、高度な機械学習技術によって作成された自然な表現であるペルソナとして他の参加者に表示され、顔や手の動きとダイナミックにマッチします。
AppleはVision ProでFaceTimeを次のレベルに引き上げ、どこにいるユーザーでも、実際に部屋にいるような対話ができるようにしたいと考えています。
空間ペルソナによって、Vision Proのユーザーは、慣れ親しんだFaceTimeのタイルから抜け出して、同じ物理的な空間に集まっているような臨場感を味わうことができます。
Getting start visonOS
visionOS SDK、アップデートされたXcodeとSimulator、Reality Composer Proは、今月末に利用可能になる予定です。
また、豊富な技術資料、新しいデザインキットやツール、visionOSのための最新のヒューマンインターフェースガイドラインにもアクセスすることができます。
この夏、Apple Vision Pro Developer Labsを開設し、Vision Proのハードウェアでアプリをテストできるようにします。Vision Proがお客様にリリースされる前に、ハンズオンのサポートと体験のプレビューを行うことができます。このラボは、ここクパチーノにあるデベロッパーセンターを含む、世界中のいくつかの場所(London, Munich, Shanghai, Singapore, Tokyo, Cupatino)に設置される予定です。
そして、どこにいても、あなたのアプリとVision Proの互換性を評価するリクエストを提出することができます。
まとめ
ざっくりまとめると、
- xcodeがより使いやすくなった
- WidgetKitでアプリを表示する場所を増やした
- 各種アクセシビリティの改善
- Continuity Cameraを拡張
- watchOSの新しいデザインを作れるようになった
- SwiftではMacrosとSwift Dataが大きく強化
- Xcode Previewsが大きくアップグレード
- visionOSの追加と、それに伴う各種フレームワークの強化
今年は新デバイスのVision Proがリリースされたことによって焦点はおもにvisionOSに当たっていたと思います。
しかし、細かいところにも改善が加わってより開発体験もユーザ体験も向上していることがわかる年でした。
個人的にはStoreKitがかなり使いやすくなって課金実装しやすくなったのが好印象でした。
最後に、スノボの楽しく滑るコツを掴める cotsume というアプリを作ってます!よかったらDLしてみてね!
また、ワンナイト人狼オンラインというゲームを作ってます!よかったら遊んでね!
他にもCameconやOffcha、問い合わせ対応が簡単にできるCSmart、フリーランスのコミュニティのNextFreelanceといったサービスも作ってるのでよかったら使ってね!
また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。
ラグナロクでもエンジニアやデザイナーのメンバーを募集しています!!楽しくぶち上げたい人はぜひお話ししましょう!!