WWDC Quick Look 💓 By SwiftGGTeam
Qualities of great iPad and iPhone apps on Macs with M1

Qualities of great iPad and iPhone apps on Macs with M1

元の動画を見る

ハイライト

100 万を超える iPad および iPhone アプリがすでに M1 Mac 上で実行でき、システムは自動的に iOS API を Mac 機能にブリッジするため、開発者はいくつかのベスト プラクティスに従うだけで高品質のエクスペリエンスを得ることができます。

主な内容

M1 Mac では、何も変更を加えていない iPad および iPhone アプリをそのまま実行できます。これは、アプリの範囲を拡大する最も簡単な方法です。

システムでは多くの互換性作業が行われています。キーボード入力、メニューバー、ドラッグアンドドロップ、印刷、設定パネルなどの機能が自動的に Mac にブリッジされます。共有拡張機能、WidgetKit、写真編集拡張機能、VPN ネットワーク拡張機能、オーディオ ユニットなどもすべて同様に機能します。

しかし、「走れる」と「経験が豊富」は別です。このセッションでは、iOS アプリを Mac 上で本当に優れたものにする方法を、API ブリッジング、コーディングの実践、システムの改善、ストアのリリースの 4 つの側面から説明します。

##詳細

キーボードとメニューバー

Mac の物理キーボードは、テキスト入力や UIKeyCommand ショートカットに直接使用できます。より詳細なキー処理が必要な場合は、次を使用します。UIPress API。

メニュー バーの構造は起動時に決定され、メニュー項目の追加または削除ではなく、有効/無効ステータスによって変更されます。新しいウィンドウの作成、リッチテキスト操作、デバイスの向きの切り替えなど、アプリの機能に基づいてシステムがメニュー項目を自動的に生成します。

iOS 13で導入されましたUIMenuBuilderAPI は、UIKeyCommand にセマンティック構造を追加できます。これらのカスタム構造は Mac のメイン メニューに反映されます。

// UIKeyCommands 通过 responder chain 寻找目标
// 这决定了菜单项是否可用

キーポイント:

  • UIResponder に直接アタッチされますkeyCommandsメニューバーには表示されませんが、メニュー項目よりショートカットキーが優先されます(04:00)
  • UIMenuBuilderのカスタム構造が Mac のメイン メニューに表示される (04:37)
  • メニュー項目の有効状態は、レスポンダー チェーン内の実行可能ターゲットの存在によって決まります (04:52)

ドラッグアンドドロップして印刷する

UIDragInteractionそしてUIDropInteraction自動的に Mac にブリッジします。ユーザーはアプリ間でコンテンツをシームレスにドラッグ アンド ドロップできます。

UIPrintInteractionControllerMac の印刷ダイアログに自動的にマッピングされます。に追加UIApplicationSupportsPrintCommandInfo.plist キーを押して対応するアクションを実行すると、印刷および PDF エクスポートのメニュー項目がメニュー バーに自動的に表示されます。

複数のシーンとウィンドウ サイズ

複数のシーンをサポートするアプリ。各シーンは Mac 上で独立したウィンドウになります。システムは「新しいウィンドウ」メニュー項目を自動的に追加します。

iPad でのマルチタスクのサポートは、Mac 上のサイズ変更可能なウィンドウに自動的に変換されます。このアプリはすでに iPad での動的なレイアウト変更をサポートしているため、Mac でのリアルタイムのウィンドウ サイズ変更も機能します。

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)
}

キーポイント:

  • 使用UIWindowScene.sizeRestrictionsウィンドウ サイズの範囲を制限する (07:16)
  • ウィンドウのサイズを変更すると、シーンのサイズのみが変更されます。UIScreen寸法によりデバイスの寸法は変更されません
  • 使用しないでくださいUIScreenレイアウト計算用の寸法
  • マルチタスクをサポートしていないアプリは固定のシーン サイズとアスペクト比を使用し、コンテンツは自動的にスケーリングされます。

コーディングのベスト プラクティス

一部のコーディング習慣は、クロスプラットフォーム互換性に影響を与えます。

公式にサポートされている API のみを使用してください。文書化されていないメソッドは Mac には存在しない可能性があります。

ファイル システムのパスをハードコーディングしないでください。Mac と iOS ではパスが異なります。使用FileManagerAPI は実行時にパスを決定します。

UI の画面上の位置について推測しないでください。ビューの階層とポップアップの場所は、Mac と iOS では大きく異なる場合があります。

Mac ではカメラの解像度と方向が異なる場合があります。iPhone でポートレート モードで写真を撮影すると、カメラが水平に配置されているため、Mac では風景画像が返される場合があります。使用AVCaptureDeviceDiscoverySession利用可能なカメラの実際のプロパティをクエリします。

一部のハードウェア機能は Mac では利用できません。ARKit は Mac をサポートしていません。ARKit がオプション機能の場合は、チェックを入れてください。ARConfiguration.isSupported。CoreMotion または Multi-Touch に依存している場合は、Mac のキーボードとトラックパッドの代替品を検討してください。

Touch Alternatives

macOS 11.3 では、キーボードとトラックパッドをさまざまなタッチ操作 (クリック、スワイプ、スクロール、チルト、トラックパッド キャプチャ) にマッピングするタッチ オルタナティブが導入されています。

アプリは、最初の起動時にタッチ代替機能を自動的に有効にし、起動ダイアログを表示できます。

<?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>
        <string>Tap</string>
        <string>Arrow Swipe</string>
        <string>Scroll Drag</string>
        <string>Tilt</string>
        <string>Trackpad Capture</string>
    </array>
</dict>
</plist>

キーポイント:

  • ファイルには名前が付けられていますcom.apple.uikit.inputalternatives.plist(15:03)
  • requiredOnboarding無関係なガイダンスの表示を避けるために、アプリに役立つ機能のみを含めます
  • デモのレーシング ゲームでは WASD を使用して、デバイスの傾きとトラックパッドのスロットル ボタンのクリックをシミュレートします。

macOS モントレーの新機能

Apple Pay が M1 Mac で iPad および iPhone アプリをサポートするようになりました。Mac Catalyst と同じクロスプラットフォーム API を使用します。

optional func paymentAuthorizationController(
    _ controller: PKPaymentAuthorizationController,
    didRequestMerchantSessionUpdate
    handler: @escaping (PKPaymentRequestMerchantSessionUpdate) -> Void)

キーポイント:

  • 実装する必要がありますdidRequestMerchantSessionUpdateデリゲート メソッド (17:17)
  • 1 セットのコードで Apple Pay をサポートするすべてのプラットフォームをカバー

AVKit の全画面ビデオが別のウィンドウで再生されるようになりました。アプリ ウィンドウには固定サイズ制限がありますが、ビデオは Mac ディスプレイを全画面表示にすると最大限に活用されます。HDR再生とストリーミングをサポートします。

SiriKit ショートカットは、macOS Monterey 上の M1 Mac iPad および iPhone アプリをサポートします。

Mac App Store で公開

ほとんどのアプリは Mac App Store に自動的に表示されます。以前にオプトアウトした場合は、App Store Connect で [このアプリを利用可能にする] を再度チェックできます。

互換性を検証すると、「macOS では検証されていません」というラベルが「iPad 向けに設計」に変わり、ユーザーにより良い信頼シグナルを与えることができます。

カスタムの最小 macOS バージョンを設定することができます。たとえば、ビデオ アプリでは、Monterey の AVKit フルスクリーンの改善が必要になる場合があります。2 つの方法: App Store Connect の価格と提供状況ページで設定する (再送信する必要はありません)、または Info.plist で設定しますLSMinimumSystemVersion(次回の更新時に送信してください)。

iPadと同じ方法でテストしました。Xcode の実行ターゲットとして「My Mac (Designed for iPad)」を選択します。macOS Monterey は、M1 Mac を使用するテスターに​​ベータ ビルドを配布するための TestFlight をサポートしています。

重要ポイント

  1. コストゼロでユーザーベースを拡大: すでに iPad アプリを持っている開発者は、互換性を確認し、公開オプションをチェックするだけで Mac ユーザーにアプローチできます。

  2. キーボードファーストの設計: iPad に物理キーボードのサポート (UIKeyCommand、UIMenuBuilder) を追加すると同時に、Mac でのエクスペリエンスも向上します。

  3. ゲーム移植のショートカット: タッチ代替機能と仮想ゲーム コントローラー (キーボード/トラックパッド マッピング) を使用すると、入力ロジックを書き換えることなく、iOS ゲームを M1 Mac でプレイできるエクスペリエンスを得ることができます。

  4. 統合された支払いエクスペリエンス: 1 セットの Apple Pay コードは iOS、iPadOS、macOS をカバーし、クロスプラットフォームのビジネス ロジックを簡素化します。

  5. ビデオ アプリの Mac エクスペリエンス: AVKit の全画面改善により、iOS ビデオ プレーヤーで Mac 上でプロフェッショナル グレードの視聴エクスペリエンスを提供できるようになりました。

関連セッション

コメント

GitHub Issues · utterances