ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
M1搭載Macにおける優れたiPad/iPhone Appの条件
既存のiPad/iPhone AppをM1搭載のMacで動作させることがこれまでになく簡単になりました。AppをmacOSに移植する方法を説明し、Appのさまざまな機能をどのようにシステムが自動的にブリッジしてMacで動作させるかについて検証します。macOS Montereyの改良点(Apple Payのサポート、AV処理の改善、ショートカットなど)と合わせて、iPad Appのベストプラクティスについてもガイダンスを行い、M1搭載のMac上での完全な体験を提供する方法について解説します。
リソース
関連ビデオ
WWDC21
- ショートカット、Siri、提案のための優れたアクションのデザイン
- 優れたMac Catalyst Appの条件
- iPad Appを次のレベルに
- iPadキーボードナビゲーション
- Mac Catalystの新機能
- Mac用TestFlightについて
- macOSのショートカットについて
- Xcodeのおける高度なプロジェクト設定
WWDC20
-
ダウンロード
〔アップテンポな音楽〕
こんにちは ニルス・ベックです 「M1搭載Macにおける優れた iPad/iPhone Appの条件」へようこそ
100万を超える iPad・iPhone Appが App Storeにあります Big Surの性能を Montereyで さらに向上させました 本動画ではいくつかのiOS APIを 対応するMac機能に マッピングする 方法について説明します M1搭載Macで Appを活躍させるーー 最適な方法を紹介します Big SurとMontereyでの ソフトウェアの アップデートと 改善点もお話しします Mac App Storeでの 今後の展開もお話しします M1搭載Macなら iPadとiPhone Appを 簡単にMacで展開できます 変更されていないAppでも iOS App Storeで承認され Mac App Storeで 提供されれば M1搭載Macで使用可能です そのため 互換性を 重視しています システムAPIは可能な限り Macと同等のものに マッピングされています 我々の目的は 皆様が変更作業することなく Mac上でスムーズに Appを利用できることです ほとんどの既存Appが 機能します iPhoneの小さな ユーティリティから 最先端のiPadゲームや Pro Appまで含みます 様々な Extension にも 対応しています 共有機能 WidgetKit 写真編集機能 VPNネットワーク オーディオユニットなどです ほとんどの既存の iPad・iPhone Appは そのままMacでも動作します テキストインタラクション コピー&ペースト メニューバーなど 基本的な機能だけでなく バックグラウンドでの Appの更新 ユーザー通知 カメラへのアクセス Siriのインテントなど 高度な機能も充実しています "iPad and iPhone apps on Apple silicon Macs" で 詳しく説明されています そちらの動画も参照ください Macの機能を さらに活用したい場合は Mac Catalystバージョンの 構築を検討してください 「優れたMac Catalyst Appの条件」と 「Mac Catalystの新機能」の動画で 詳しく説明しています さらに詳しくAPIについて 説明します すでに iPad・iPhone Appに これらの機能を 使われているでしょう Macでもシームレスに 使えるようにしました 当然 Macのキーボードで テキスト入力や UIKeyCommandの キーボードショートカットを 使用することができます コントロールや 独自のキープレス処理が さらに必要な場合も 対応可能です UIResponderのUIPress APIを 使ってください Macには物理キーボードが 搭載されています iPadやiPhoneで 対応を追加したAppは Macでも同時に 大幅に改善されています 次は メニューバーについてです メニューバーは Appの機能や キーボードショートカットを 見つけやすくします メニューバーの構造は 起動時に決定され その後は ほぼ一定に保たれます 項目は追加や削除が されるのではなく 適用状況に応じて 有効性が決まります
メニューバーには 機能を考慮して 自動的にメニューが 表示されます 新規ウインドウの作成 リッチテキストの操作 デバイスの向きの変更などの メニュー項目が 追加されます UIkeyCommandプロパティを 通じて UIRespondersに直接接続された UIKeyCommandは メニューバーには 表示されませんが キーボードショートカットは メニューアイテムの ショートカットよりも 優先されます iOS 13で導入された 最新のUIMenuBuilder APIを ご使用の場合ーー UIKeyCommandsに意味を持った 構造が付加されます キーボードを搭載したiPadで Commandキーを長押しして キーボードショートカット メニューで 確認することができます ビルダーにパスされる デフォルトの構造が Macの場合 異なるため 構造をカスタマイズし メインメニューに反映します UIKeyCommandは レスポンダチェーンに依存し アクションの 適用対象を見つけ メニュー項目が有効かを 決定します 詳しくは 以下の動画をご覧ください 「iPad Appを次のレベルに」 「iPadキーボードナビゲーション」 「Mac Catalystの新機能」 UIDragInteractionや UIDropInteractionを使って ドラッグ&ドロップを使用する Appは 自動的に Macにも引き継がれます QRコードをQrafter Appから デスクトップに ドラッグしているように コンテンツをシームレスに App間でドラッグできます Appがーー UIPrintInteractionControllerを 使って印刷する場合 コード内で印刷が開始すると Macの印刷ダイアログに 自動的にブリッジされます さらに 新しい Info.plistキーを追加します UIApplicationSupports PrintCommandは 対応する標準の 印刷アクションを実装すると “プリント”と“PDFとしてエクスポート” の項目が メニューバーに 自動的に追加されます この新しいAPIの詳細は 「Mac Catalystの新機能」 をご覧ください Appは 設定バンドルを使用し 自動的にMacスタイルの 環境設定パネルを生成します 設定バンドルに クレジットを入れる場合は そのテキストを “About box”に 移動します Macの“About box”の 表示内容を 細かく設定したい場合 クレジットファイルを バンドルに追加する オプションがあります Mac Appと同様にRTF RTFD HTMLファイルが使用できます 優れたiPad Appに するために iPadを中心としたAPIが 数多くあります Mac上で見事に表現されます つまり 優れたiPad Appは M1搭載のMacでも 優れたAppなのです UIApplicationSupports MultipleScenes Info.plistキーにより Appが複数のシーンを サポートしている場合 各シーンは別のウインドウに 変換され 新しいシーンを 作成するための メニュー項目が 自動的に追加されます Macでは システムワイドの設定により Appの終了時に 全ウインドウを閉じるか 再開時に既存のウインドウを 復元するか決まります 複数のシーンを サポートしている場合 この設定が優先されるため シーンが切断されたり 復元されない場合があるので ご留意ください iPadのマルチタスク機能は macOSの リサイズ可能なウインドウに 自動的に変換されます AppはiPadでのレイアウト 変更をサポートしていれば Macでそのままサイズ変更可能な ウインドウが得られます UIWindowSceneのminimumSize 及び maximumSize APIを 使用し シーンサイズの 許容範囲を制限できます ウインドウのサイズが 変更されると シーンサイズのみが 変更されます UIの画面サイズは 変更されずーー デバイスのサイズを レポートし続けます そのため iPadであっても レイアウトの計算に スクリーンサイズを 使用しないでください Appで デバイスの画面全体を コントロールする場合は 固定のシーンサイズと アスペクト比を使用します しかし ウインドウの コンテンツは必要に応じて Appには透過的な方法で 拡大・縮小できます 複数のユーザー インターフェースの向きを Appが サポートしている場合は 自動的に追加される メニューバーの項目の使用や ウインドウの端を ドラッグすることで ウインドウの向きを 変更できます ここでは メニューバーの項目を使って Chess.comの向きを変えます ユーザーインターフェースは 各デバイスの向きに合わせて 最適化されています 様々なマッピングで iPad・iPhone Appの Macへの対応の摩擦を 軽減できます ここでは Macを含むすべての プラットフォームで Appが うまく動作するための コーディングプラクティスに ついて いくつか お話しします Appleのフレームワークを 使用する際には 公式にサポートされている APIのみを使用してください 当社のフレームワークで 文書化されていないものは Macに存在しないか 変更の可能性があります
ファイルシステムの 場所へのパスを ハードコーディングするのは 避けてください 例えば パスの前に “/private”や “/var/mobile”を 付けてはいけません 代わりに 適切なAPIを使用し 実行時に 各パスを決定します 同様に 自分で直接 コントロールできないUIは 画面上のビューや アラートの位置 ビュー階層の 正確な設定などを 仮定してコーディングしない方が よいでしょう Macでは大幅に異なる場合が あります 利用可能なカメラの 解像度や向きも Macでは 大きく異なる可能性が あるので ご注意ください 例えば iPhone Appで 写真を撮る時に 縦向きにすると カメラで撮った写真も 縦向きになると 思われるかもしれません しかし MacでAppを 縦向きにしても 必ずしもそうはなりません カメラの位置が横向きだと 画像が横向きになることが あります 多くのAppとの互換性を 高めるため 試行錯誤を 繰り返してきました 例えば 背面カメラを 要求された場合でも Macの前面カメラの画像を 提供します しかし AVCaptureDevice DiscoverySessionと関連する AVFoundation APIを使用して 利用可能なカメラと プレビュー寸法などの プロパティの情報を 収集する方が はるかに優れています あらゆる設定をUIで うまく処理することを 目指してください Macでは利用できないーー ハードウェア機能があります そのような状況を 適切に処理し 代替案を使えるコードで なければなりません 例えば ARKitによる拡張現実は Macでは サポートされていません ARKitがAppの コア機能である場合は 必須のデバイス機能に設定している 可能性が高く Mac App Storeに Appが表示されません しかし ARKitが オプション機能である場合は 適切なARConfiguration サブクラスの isSupportedプロパティを チェックしているはずです Macなどで 最高の体験をするためには AR機能がある デバイスでのみ UIに表示するように してください
ダイレクトなマルチタッチや Core Motionに依存する場合 Macのキーボードや トラックパッドに適した 代替手段を追加することを 検討してください Touch Alternativesが 役に立つかもしれません 後ほど詳しく説明します 正確な位置情報が 得られなくても Core Locationを使えば Appを使用できます Lowe'sのAppのように 代替手段として 手動での 位置情報の入力もできます 次に M1搭載Macの出荷を 開始してからの改善点を ご紹介します Big Sur 11.3では iPad・iPhone Appの Mac上でのウインドウの 動作を改善しました マルチタスクには非対応だが 大きなデバイスサイズには 対応するという理由で コンテンツサイズが 固定されるAppの場合 起動時に Appが起動する 画面に収まるーー 最大のデバイスサイズを 選択します Appに関しては デバイスサイズは セッション全体で 固定されたままですが ウインドウは利用可能な スペースを有効に活用します サポート範囲内の 最小のデバイスサイズを 使用する設定になっています ウインドウの内容は 必要に応じて 拡大・縮小されます 例えば ウインドウを フルスクリーンにすると 元のアスペクト比を 維持したまま スペースに合わせて 自動的に拡大されます 起動後 小さな画面に 移動させた場合 必要に応じて自動的に ウインドウが収まるように 縮小します ウインドウズーム機能を使い UI要素のーー 自然な大きさを 優先したズームと ピクセル単位の正確さを 優先したズームの 2つの要素の切り替えが 可能になりました ここでは この機能を使い Chess.com Appの 2つのズームファクターを 切り替えています ゲームコントローラは GameController.frameworkで 初日からサポートされており ゲーム対応したプラット フォームで利用できます Big Sur 11.3からは Macのキーボードと トラックパッドを仮想の ゲームコントローラーとして 使用できるようになりました そのため 実際の コントローラーがなくても コントローラーに マッピングされている機能に キーボードから簡単に アクセスできます Montereyでは感度スライダと ポインタの非表示を追加し この環境設定パネルのように フレームワークを より洗練させました このフレームワークの詳細は 「ゲームコントローラーの 進化」 をご覧ください Touch Alternativesは 当初から マルチタッチ ドラッグ タップ スワイプなど Macでは使いにくい インタラクションスタイルに キーボードと トラックパッドを マッピングしてきました macOS 11.3では 改良した点があります 例えば デバイスを仮想的に 傾けることが 可能になりました これにより ゲームの可能性が広がります キーボードや トラックパッドを使い 5つのインタラクション スタイルへのアクセス方法を 環境設定パネルで 図解表示するようにしました Touch Alternativesに Appを自動的に 登録できます オプトインすると 初回起動時に オンボーディング ダイアログが表示され この機能の 見つけやすくします グラフィックは 環境設定パネルと 似ていますが 選択したインタラクション スタイルだけが強調されます この例ではマルチタッチと チルトが表示されています
Touch Alternativesの いずれかを利用できると 判断した場合 AppのTouch Alternativesを 次の方法で 最初から有効にできます 新しい.plistファイルを バンドルに追加するだけです ファイル名前は次の通り “com.apple.uikit. inputalternativ es.plist” 次に スニペットの キーと値を追加します requiredOnboarding配列には Appにとって 有用な機能のみを入れます すると オンボーディング ダイアログで その機能だけが 強調表示されます 実際に試してみましょう 例えば このiPad用ゲーム Assoluto Racingは M1搭載のMacで そのまま動作しています 最初から Touch Alternativesが 自動的に有効なので オンボードダイアログで キーボード操作を 最初の起動時に確認できます まずは ソフトウェア キーボードを表示し ウインドウを フルスクリーンにしてみます コンテンツは 画面に合わせて拡大され iPadのアスペクト比も 維持されています
Airportレベルで フリースタイルのドリフトを 体験しましょう
本AppはCore Motionを 採用しているので iPadではデバイスを傾けて 操作が可能です Touch AlternativesをM1 搭載のMacで有効にすると W A S Dのキーで 傾きをシミュレートできます トラックパッドを使い 画面上のアクセルボタンを クリックしながら 車をコントロールします この操作は Appからは 完全に透過的に行われます さて どうでしょうか
うまく いきました ドリフトの技術が いまいちですが Montereyでは さらに改良を加えました Big SurfのMac Catalyst App用と同等に 強化されたクロス プラットフォームAPIを使い iPad・iPhone用Apple Payが 利用できます つまり ひとつの実装を使い Apple Payが利用可能な 全プラットフォームで 支払いの対応が できるようになりました PKPaymentAuthorization Controller Delegateに paymentAuthorizationController, didRequestMerchantSessionUpdateの デリゲートコールを 実装していることを 確認してください 動画「WalletとApple Payに 関する新機能」で 詳細をご確認ください AVKitのフルスクリーン ビデオもより良くなりました AVPlayerViewと AVPlayerViewControllerは 別のウインドウを使い 動画の自動的な フルスクリーン表示が 可能になりました そのため ウインドウが 起動時の解像度と アスペクト比に 制限されるAppでも ビデオコンテンツに合わせて Macのディスプレイを 最大限に活用できます 新しいAPIを AVPlayerViewDelegateと AVPlayerViewController Delegateに追加し フルスクリーン体験の コントロールを助けます
さらに AVFoundationが M1搭載のMacでの HDR再生とストリーミングを サポートします AppでのMac特有の作業は 必要ありません iPad・iPhone Appの AVKitコントロールは 他のMacのAppと 同じように表示されます 新しいジェスチャーを サポートし Macのトラックパッドを 最大限に活用できます 詳細については 動画でご確認いただけます 「AVKitの新機能」を ご覧ください Intentでカスタムの SiriKitショートカットを 提供するAppは MontereyのM1搭載Mac上の iPad・iPhone Appで サポートされます ショートカットについては 「macOSのショートカットについて」 と 「ショートカット、Siri、提案のための 優れたアクションのデザイン」を ご覧ください 素晴らしいことに Mac App Storeへの登録は 簡単です 多くのAppが自動的に 登録されています 先述したように ほとんどの場合 Macであることに 意味があります 携帯電話を持たずに 家から閉め出されても モバイル用のBluetoothの ドアロックAppの代わりに M1搭載のMacを 使えるかもしれません これまでMac App Storeから Appを除外していた方は 今こそ再考の時かも しれません Touch Alternativesや フルスクリーンビデオ再生の 強化などの改良により あなたのAppはMacに ぴったりかもしれません Mac App StoreでAppを 利用可能にするには App Store Connectで “Make this app available” を選ぶだけです 事前のオプトアウトの 有無に関わらず M1搭載のMac上での Appの動作を 確認してください ユーザーエクスペリエンスが 基準に合っているか確認し App Store Connectの “Verify Compatibility”を クリックします Mac App Storeでの表示が 「macOSでは検証されていません」 から 「iPad対応」になります Mac上でAppを 快適に利用できるよう 時間をかけて 対応してくれたと 利用者に伝わるでしょう 1回の作業で完了します Mac App Storeでの iPad・iPhone用Appの 検索性も大幅に 向上しました Appを検索する際に タブの切替えが 不要になりました 互換性のある 最低限のmacOSバージョンを 自動的に選択します ほとんどの状況で これで対応できます ごくまれに カスタムのmacOS対応を指定して 上書きしたい場合があります 例えば ビデオAppが Big Surで動作する場合も AVKitによる フルスクリーン機能の向上を 確実に利用したい場合は 利用可能な範囲を Monterey以降に 限定するといいでしょう この場合 選択肢は2つあります App Store Connectの “価格および配信状況”で 最小のmacOSバージョンを まもなく 選択できるようになります 新しいバージョンの再提出が 不要のため 登録済みのAppに最適です LSMinimumSystemVersionを Info.plistで指定し 次回の アップデートの一部として 提出することもできます これは 開発中のAppに 推奨される方法です iOSの最小システム バージョンを指定するーー MinimumOSVersionキーの 代わりにはなりません この2つが必要になることは 滅多にないでしょう 最後に テストについて お話しします macOSとiPadでのテストは よく似ています 慣れ親しんだ方法を そのまま使えます Xcodeのローカルテストでは 実行先として “My Mac(Designed for iPad)” を選択するだけで デバッグや ユニットテストなどが 他のデバイスと同様に 動作します ベータテストでは Montereyの全Appに対し TestFlightを サポートしてるので M1搭載のMacを使用している テスターに Appを 配布することができます 詳細は動画で ご確認いただけます 「Mac用TestFlightについて」を ご覧ください Macへようこそ! Appを オプトインしてください とても簡単です iPad・iPhone Appを 改善し続けることで M1搭載のMacでも Appを改善できます ぜひ覚えておいてください ありがとうございました 〔アップテンポな音楽〕
-
-
7:16 - Limit the range of allowable scene sizes
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = scene as? UIWindowScene, let sizeRestrictions = windowScene.sizeRestrictions else { return } sizeRestrictions.minimumSize = CGSize(width: 640, height: 480) sizeRestrictions.maximumSize = CGSize(width: 1920, height: 1080) }
-
15:03 - Automatically enable Touch Alternatives
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>defaultEnablement</key> <true/> <key>version</key> <real>1</real> <key>requiredOnboarding</key> <array> <!-- Only include applicable features! --> <string>Tap</string> <string>Arrow Swipe</string> <string>Scroll Drag</string> <string>Tilt</string> <string>Trackpad Capture</string> </array> </dict> </plist>
-
17:17 - Required delegate method to enable Apple Pay support
optional func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didRequestMerchantSessionUpdate handler: @escaping (PKPaymentRequestMerchantSessionUpdate) -> Void)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。