ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
XcodeでマルチプラットフォームAppを開発する
Xcode 14を使用して、複数のAppleプラットフォーム用のAppをビルドする方法をご覧ください。Appターゲットを合理化する方法、共通のコードベースを維持する方法、デフォルトの設定を共有する方法を紹介します。また、設定やコードの条件設定により、各プラットフォームに合わせてAppをカスタマイズする方法についても解説します。
リソース
関連ビデオ
WWDC22
-
ダウンロード
こんにちは Xcodeチーム デザイナーのJakeです Xcode14ではマルチプラットフォーム App開発が進化しています 単一のAppターゲットで 複数のプラットフォームにわたって 対応できるようになりました 単一の共通コードベースを維持し デフォルトで設定を共有し 必要に応じて新しい方法で 条件付けができます まず マルチプラットフォーム Appのターゲットとは何か どのような場合に最適か について説明します
複数の実行先とプラットフォームに 対応するためにプロジェクトを修正し 新しいプラットフォームでビルドし 実行できるようプロジェクトを更新します
各対応プラットフォームで Appが美しく見えるよう設定し...
そして最後に Xcode Cloud をプロジェクト変更と統合します
Appをマルチプラットフォームに 対応させるために どのようなテクニックを 使うのかを理解しましょう Xcode 14以前では AppをiOSとmacOSに 対応させたい場合 2つのターゲットが必要でした プロジェクトが大幅に異なる コードベースを必要とする場合や 異なるプラットフォーム間で ほとんど設定を共有しない場合 各Appターゲットが異なる基礎技術に 大きく依存している場合に有効です
もし 現在もあなたのプロジェクトが そうであるなら 最善策は各プラットフォームごとに 別のターゲットを使い続けることです Xcode14では 1つのAppターゲットで iPhone iPad Mac Apple TVなど 多くの実行先への対応を 宣言することができます 共通のコードベースを使用し 全実行先で 設定の大部分を共有しながらも 必要に応じてカスタマイズを 行うAppに最適です Xcode 14でマルチプラットフォーム Appがどう機能するか見てみましょう ゼロから始める場合 Xcodeで 新規プロジェクト作成時に 改良された マルチプラットフォームApp テンプレートを 使用するのが良い方法です
このテンプレートはライフサイクルと インターフェースにSwiftUIを使い iPhone iPad Macをサポートするよう デフォルトで設定された ターゲットからスタートします 新規プロジェクトのための 素晴らしい構成です SwiftUIを 使用しているため 各プラットフォームの SDK全機能にアクセスでき 各プラットフォームが 提供するものを活用した 素晴らしい新Appを 作成することができます 既存のプロジェクトでも Appターゲットで 複数の実行先の サポートを宣言し SwiftUIで各プラットフォームの SDKのフルパワーにアクセスできます ここでは 既存のiOS Appに Macの実行先を追加する方法を説明します Food TruckのAppを作っていて iPhoneやiPadでうまく動作します このiOS Appには かなり満足しているので 今度はMacで プラットフォームと その機能を受け入れようと思います Xcodeでプロジェクトが どう見えるか見てみましょう
Appのターゲットを見ると 私のAppがサポートする 全実行先のリストが表示されます
iPad用にデザインされたMac用の 実行先があるのがわかります Appleシリコンを搭載した Macで iOS Appを動作できます これでMacのサポートを 始めることができましたが 私はMacのサポートを 次レベルに進めたいのです いわば「Mac用デザイン」 的な体験を加えましょう
対応する実行先リストを 簡単に編集し Macの実行先を Appに追加できます Macの実行先にはいくつか 選択肢があります: Mac Mac Catalyst Designed for iPadのうち 最後の1つはすでにサポートしており グレーアウトされています
MacとMac Catalystの どちらを選ぶかは 主にどちらの技術を 使いたいかで決まります AppのコアにUIKitやStoryboardsが 多用されている場合 Mac Catalystは既存のiPad Appを互換性のある MacApp変換する 素晴らしい方法となるでしょう しかし SwiftUIを使うため 「Mac」オプションが Mac Appを作るための 最良の選択となります macOS SDKの フルパワーで 制限なく 箱から出してすぐに Macの見た目と感覚が手に入ります iOS AppではUIKitを macOS AppではAppKitを 必要に応じて柔軟に使い分けることが できるようになるのです これを踏まえて SwiftUIで作業するのに 最適な「Mac」を 選んでみましょう 一度選択すると Xcodeはプロジェクトを Mac対応にするために いくつかの変更を警告します この場合 Xcodeは ターゲットを更新して Macでサポートされる 依存関係や構成のみを含めます Xcodeは私のコードに 変更を加えないので もしMacで利用できない APIを呼び出している場合は 自分でその問題を 解決する必要があります Macのオプションを選ぶと 対応する実行先リストに追加されます Xcodeで開発しているときに 複数のMacの 実行先があるのも 全く有効なことです 特に「Mac Catalyst」や 「Designed for iPad」から 完全なMacAppに 移行する場合 これは便利です
Xcodeの中でMacの各製品を テストし続けることができます また Appを開発する際 一つの選択肢に縛られません しかし ネイティブのMac AppをApp Storeに公開すると Designed for iPad Appは 私のユーザーが利用できなくなります そこでXcodeは この実行先を 削除する迅速な方法を提供します しかし Macのネイティブな 体験に満足したら この実行先を削除 することも考えています ゼロから始める場合でも 既存Appに新しい実行先を 追加する場合でも Xcodeで単一のターゲットを 使用すると デフォルトで コードとビルド設定を 共有することができます Appの表示名や最小 デプロイメントバージョンなど 個別の設定をカスタマイズ したい場合があります Xcode 14で改良されたターゲット エディタで その方法を見てみましょう 多くのAppのターゲット設定に その値の条件付け方法が含まれます サポートされている設定では プロジェクトの各ビルド構成に デフォルト値を設定できる エディタを表示できます 私は 新しいXcodeプロジェクト に付属する標準の DebugとReleaseの 構成だけでなく 追加した カスタムBetaの 構成を持っています ベータ構成でビルドしたとき Appに別の表示名を付けたいので ここで名前を編集 すればいいのです XcodeのApp表示名が 表示名が取り得る すべての値で 置き換えられて いることがわかります 必要であれば 条件を追加し どのSDKを使用するかに応じ 値を指定することもできます これにより Mac用にビルドする際に ベータ版の構成に 特定の名前を設定ができます
さて 「General」タブで行いたい 編集は終わったはずです Signing and Capabilitiesタブで 他に必要な変更を 確認しましょう
自動署名を オンにしておけば 余計な手間がかかりません Macの実行先を追加すると Macに必要な署名証明書と プロビジョニングプロファイルが 代理で生成されました iOSとmacOSのApp製品は 既定で同じバンドル識別子を使います これは素晴らしいことで App Storeに公開すると ユニバーサル購入で 利用できるようになります iOS Appを購入した人は 自動的にMac Appも手に入ります プッシュ通知などの 機能も活用しています iOS Appで使っていた機能が macOS Appにも適用され 余分な作業をすることなく 利用できるようになります さらに 1つのエンタイトルメント ファイルにまとめられます Appに複数の実行先の サポートが追加されたので 次の目標は ビルドすることです 新しいMacサポートのように 新しいSDKが関係する場合 新しい実行先でのビルド時に 問題が発生するのは よくあることです そのよくある問題点を ご紹介しましょう 一部のフレームワークは 全プラットフォームで使用できません 利用できないフレームワークを インポートやリンクしていないことを 確認する必要があります Xcodeは 新しい実行先の サポート追加時にコードを変えず App設定を条件付きに したのと同じように SDKに基づいてコードを 条件付きにする必要があります これはAPIにも 言えることです どのSDKで構築しているかで 利用できない機能が表示されます Swiftは 構築しているSDK で利用可能な機能のみを含むよう コードの一部を条件付けする 方法を提供します Xcodeでは一部のSDKビルド時に 個々ファイルをコンパイルするか 指定することができます もし今 プロジェクトをビルドしたら... 特に問題はないようです それは ツールバーでiOS SDKを使用する実行先が 選択されたままだからです macOS SDKにビルドするため リストから「My Mac」を選びます
今回ビルドを行い いくつか 新しい問題が明らかになり 予想通り それは主に 可用性に関するものでした あるファイルで Macでは利用 できないARKitをインポートしています このimport文を#if canImportで 包んで条件分岐させます
フレームワークが利用可能な 既知のプラットフォームの リストを管理せず 単に利用できない場合は 含めない場合に便利です ただ このファイル全体でARKitを 使用していることに変わりはないので SDKのためにファイル全体を 条件分岐させる方が 理にかなっています ターゲットに戻り 「Build Phases」タブを開くと ファイルを検索ができます...
iOS用にのみコンパイル されるよう指定します
ビルド後 それらの 変更を行った後 Xcodeは新しい 問題を報告します Macで利用可能なフレームワーク SwiftUIには 利用不可とマークされている 機能があります 具体的には iOSでは EditModeを使いユーザーが TableやListで編集や コンテンツの選択をできますが macOSではEditModeが 存在しません! Macではユーザーが自由にコンテンツの 行を選択・編集できるので このコードはiOSでのみ 実行されるようにしましょう 環境プロパティと 下のEditModeを 使っていたところなら どこでも条件出しができます
このonChange修飾子のように このプロパティを使用していた 場所も条件から外されて いることを確認します モディファイア全体を「if os」 の条件で囲えます
最後に ツールバーのEditButton ビューもiOS限定です
では Appを 実行してみましょう
動いています!私たちのAppが Mac上でビルド 動作します! 新プラットフォームで Appがビルド 動作しても 私たちの仕事は 終わりではありません 新プラットフォームの ユーザーの期待に合わせて App体験を洗練させたい ケースもあるはずです iOS専用の機能を切り捨てることは 私たちの旅の終わりではありません これでmacOS SDKの全機能を 遊べるようになりました 私のAppがMac上で 動いているのを見て 新しいコンテキストでは 私のAppが 自然でないと 感じる点がありました このグリッドビューのドーナツは 大きすぎるような気がします 私たちのグリッドアイテムが タッチ前提に設計されているためです このような状況は UI要素の ポイントサイズを宣言するなど 単一プラットフォームのみを 意識したカスタマイズで発生します Macでは より精密な ポインティングデバイスを使うため ボタンやサムネイルを 大きくする必要はありません プロジェクト内の定数を どのSDK向けにビルドしているかに 応じて変化させるための 条件付けに最適なケースです 私たちのAppを他の プラットフォームに移行時は 新プラットフォームの期待に合わせ 選択肢の多くの再考が重要です どのSDK向けに ビルドするかによって 異なる値の指定を 見てみましょう よく使う手法のひとつは 定数を計算されるプロパティにし #if osを使って返答を 条件付きで指定します これを計算された プロパティに変換して 以前は定数だったものを 返してみましょう... しかしiOSでは その値しか返しません
80はもっと自然な 大きさに感じますね
macOS SDKの活用ですが SwiftUIには メニューバーに独自のUI要素を 追加できる新機能があります Appにはサマリービューがあり ユーザーに素早く簡単に アクセスできるように したいと思っています App 宣言に移動して Menu Bar Extra 用に 新しいScene を追加します ただし これはmacOS だけの機能なので macOS SDKのために 条件付けの必要があります
ビルドして実行し 見てみましょう
すごい!トラックのアイコンが メニューバーに表示されました 私のMacユーザーは メニューバーから今日の情報を 一目で見ることが できるようになりました SwiftUIを使うと 各プラットフォーム のフルSDKにアクセスでき その素晴らしい機能を 利用することができます 重要なのは Appを他の プラットフォームに移行時 新プラットフォームの 文脈で作業する場合 過去の選択を再考する 必要があるということです SwiftUI はプラットフォームの 期待をAPI に直接実装します 多くのインターフェース要素が 各プラットフォームで見栄える 自動的な外観を 獲得できます 逆に コントロールなどのUIを 大幅にカスタマイズすると 自動的なスタイリングが 失われる可能性もあります よって UIが常に美しく見える ことを再確認する必要があります クールなAppを作るには ヒューマンインターフェース ガイドラインのベスト プラクティスに沿っていることを 確認する必要があります Appのローカル変更に満足したら App製品をアーカイブし App Store Connectに アップロードします Xcode から行うことも Xcode Cloudで自動化もできます 準備が整ったら TestFlightで社内外の テスターとAppを共有し App Storeにリリース することができます App Store Connectにアップロードする為 プロダクトをアーカイブする必要があります ターゲットが 1つだからといって 1つのプロダクトしかない わけではありません 各プラットフォームにアーカイブを作り 個別にアップロードする必要があります ローカルでビルドして アーカイブする場合 作成したい SDKがある保存先を 選択する必要があります macOS Appを作りたい場合 実行先リストから「My Mac」 を選択する必要があり そうでない場合 iOS Appを 作る為iOSデバイスを選択します
実行先を選択したら 「Product Archive」を選択し アーカイブを作成できます
アーカイブが完成したら XcodeのOrganizerウインドウで App Store Connectに アップロードできます
Xcode Cloudを使う場合 ワークフローにアクションを追加し プロダクトのビルドテスト アーカイブを行えます ワークフローのアクションリストでは 各プロダクトのビスと テスト 分析 アーカイブのための 新項目を作成できます 今回は iOS Appと macOS Appがあります 一歩進み App Store Connect へのAppアップロードを 自動化するための デプロイメント 準備を含められます これらのビルドを社内の TestFlightチームに送信し プレスからすぐに変更の フィードバックを得られます まとめると Xcode 14は マルチプラットフォームApp開発を 次レベルに引き上げ 合理化されたAppターゲットで 複数プラットフォームでさらに 多くの実行先をサポート可能です 単一のAppターゲットで 共通のコードベースと共有設定を デフォルトで 維持することができます ニーズに応じて設定や コードを条件付けすることで プラットフォームの期待に 最適にAppをカスタマイズできます あとは 皆様次第です 今年のXcodeの新機能や 改善点については 「Xcodeの新機能 」 をご覧ください XcodeとSwiftUIのパワーで どんな素晴らしいアイデアを 実現するのか 楽しみでなりません
-
-
8:48 - canImport
#if canImport(ARKit) import ARKit #endif
-
10:02 - Condition Property
#if os(iOS) @Environment(\.editMode) private var editMode #endif
-
10:13 - Condition View Modifier
#if os(iOS) .onChange(of: editMode?.wrappedValue) { newValue in if newValue?.isEditing == false { selection.removeAll() } } #endif
-
10:19 - Condition View
#if os(iOS) EditButton() #endif
-
11:48 - Computed Property
var thumnailSize: Double { #if os(iOS) return 120 #else return 80 #endif }
-
12:37 - Menu Bar Extra
#if os(macOS) MenuBarExtra { MiniTruckView(model: model) } label: { Label("Food Truck", systemImage: "box.truck") } .menuBarExtraStyle(.window) #endif
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。