WWDC Quick Look 💓 By SwiftGGTeam
Bring your driver to iPad with DriverKit

Bring your driver to iPad with DriverKit

元の動画を見る

ハイライト

DriverKit が iPadOS 16 に追加され、M1 iPad が初めて Thunderbolt オーディオ インターフェイスとその他の周辺機器をサポートします。既存の macOS DriverKit ドライバーは変更せずに iPad 上で実行でき、Mac バージョンと iPad バージョンは Xcode 14 のマルチプラットフォーム ターゲットを通じて同時に配信できます。

主要内容

ユーザーがiPadで求めていたプロフェッショナルなオーディオインターフェイスを開発しましたね。ただし、iPad はこれまでサードパーティのドライバーをサポートしていなかったので、ハードウェアを iPad エコシステムに接続できませんでした。

(04:02) iPadOS 16 ではそれが変わります。 DriverKit は macOS から iPad まで拡張されており、すべての M1 チップ iPad でサポートされています。 USB、PCI、およびオーディオ ドライバー ファミリが最初に利用可能になり、初めて Thunderbolt オーディオ インターフェイスが iPad 上で動作します。

DriverKit とは何ですか?

(00:39) 2019 年、Apple は従来の IOKit カーネル ドライバーを置き換える DriverKit を発売しました。ドライバー拡張機能 (dext) はユーザー空間で実行され、システム拡張機能メカニズムを通じてロードされます。カーネル ドライバーよりも安全で信頼性が高くなります。クラッシュはシステム全体には影響しません。

dext はアプリ内にパッケージ化されており、Mac App Store を通じて配布されます。ユーザーはアプリケーションを検索することでドライバーを見つけることができ、アプリケーションを削除するとドライバーが自動的にアンインストールされます。

DriverKit で現在サポートされているドライバー ファミリには、ネットワーク、ブロック ストレージ、シリアル、オーディオ、SCSI コントローラーおよび周辺機器、さらに USB、PCI、HID などのトランスポート層が含まれます。

AudioDriverKit の新機能

(02:01) AudioDriverKit にはリアルタイム操作機能が追加されました。リアルタイム コールバックを登録できます。これは IO 操作が発生するたびにトリガーされ、信号処理などのリアルタイム スレッド上のオーディオ バッファーを変更するために使用されます。

(02:25) リアルタイム コールバックを登録する方法:

io_operation = ^kern_return_t(IOUserAudioObjectID in_device,
                              IOUserAudioIOOperation in_io_operation,
                              uint32_t in_io_buffer_frame_size,
                              uint64_t in_sample_time,
                              uint64_t in_host_time)
{
    if (in_io_operation == IOUserAudioIOOperationWriteEnd) {
        // 处理输出缓冲区
    } else if (in_io_operation == IOUserAudioIOOperationBeginRead) {
        // 处理输入缓冲区
    }
    return kIOReturnSuccess;
};
this->SetIOOperationHandler(io_operation);

(03:02) AudioDriverKit には、新しい資格も導入されています。 macOS 12.1 より前ではオーディオ ドライバーが必要ですallow-any-userclient-accessの場合は、専用のオーディオ ファミリ資格に移行する必要があります。この権利は開発にオープンであり、使用するためにアプリケーションは必要ありません。

macOS から iPad へ

(04:26) 既存の macOS DriverKit ドライバーはそのまま iPad に取り込むことができます。 USB、PCI、およびオーディオ ドライバー ファミリはすべて、ソース コードを変更することなくサポートされます。

Xcode 14 のマルチプラットフォーム ターゲットにより、このプロセスが簡単になります。単一のターゲットで Mac と iPad の両方をサポートできるため、両方のプラットフォームの署名構成が自動的に処理され、手動署名の必要がなくなります。

(05:51) iPad 上のドライバーは、アプリ内購入などの機能を備えた App Store を通じて配布され、ユーザーは検索を通じてドライバーを見つけることができます。

iPad でのドライバーのインストールプロセス

(07:09) macOS とは異なり、iPad には SystemExtensions フレームワークがありません。ドライバーはアプリケーション内にパッケージ化されており、システムによって自動的に検出されます。

ユーザーは設定でドライバーを有効にする必要があります。

  • ドライバーを含むアプリケーションが少なくとも 1 つデバイスにインストールされている場合、「ドライバー」メニューが「一般設定」に表示されます。
  • アプリに設定バンドルが含まれている場合、アプリ自体の設定ページにドライバーのリンクが表示されます。
  • 各ドライバーは個別にオンまたはオフに切り替えることができます

(08:36) アプリケーションは、ドライバーを有効にするために [設定] に移動するようにユーザーを積極的に誘導する必要があります。 iPad バージョンの UI では、ビュー モデルと SystemExtensions フレームワーク間の対話は必要なく、ボタンのアクションは設定を開くように変更されます。

// iPad 版本:打开应用设置
Button("Enable Driver in Settings") {
    if let url = URL(string: UIApplication.openSettingsURLString) {
        UIApplication.shared.open(url)
    }
}

(11:06) ドライバーはオンデマンドで起動します。ユーザーが設定でドライバーを有効にした後、対応するハードウェアが接続されるまでドライバーは実際には実行されません。これは、Xcode のワイヤレス デバッグを通じてドライバー プロセスに接続することでデバッグできます。

アプリケーションとドライバーの通信

(12:17) アプリケーションはユーザー クライアントを通じてドライバーと通信します。 macOS でのアプリケーション要件driverkit userclient-accessiPadOS では、新しい「ドライバーと通信する」権限が使用されます。

Xcode に追加します: [署名と機能] > [機能の追加] > [ドライバーとの通信] を検索します。

(13:43) 他の開発者のアプリケーションがドライバーと通信できるようにする場合、ドライバーは「サードパーティ ユーザー クライアントを許可する」権限を追加する必要があります。この資格がない場合、同じチームのアプリケーションのみがユーザー クライアントを開くことができます。

ドライバー更新メカニズム

(15:01) ドライバーを含むアプリケーションが更新されても、ドライバーはすぐには置き換えられません。

  • アプリケーションは自動的に新しいバージョンに更新されます
  • ドライバーの承認ステータスは更新後も維持されるため、再度有効にする必要はありません
  • ただし、従来のドライバーはハードウェアが切断されるまで実行され続けます。
  • 新しいドライバーは、ハードウェアが再接続された場合にのみ起動します。

これは、アプリケーションの新しいバージョンが古いバージョンのドライバーと通信する必要がある可能性があり、プロトコルを設計するときに下位互換性を考慮する必要があることを意味します。

デバイスの機能制限

(17:01) アプリケーションの唯一の機能がドライバーをインストールすることである場合、ドライバーを Info.plist に追加する必要があります。UIRequiredDeviceCapabilities含むDriverKit、サポートされていないデバイスへのインストールを防ぎます。

詳細

リアルタイムオーディオコールバック

(02:25) AudioDriverKit のリアルタイム コールバックは、低遅延信号処理に適したオーディオ IO のリアルタイム スレッドで実行されます。

// 声明 IOOperationHandler block
io_operation = ^kern_return_t(IOUserAudioObjectID in_device,
                              IOUserAudioIOOperation in_io_operation,
                              uint32_t in_io_buffer_frame_size,
                              uint64_t in_sample_time,
                              uint64_t in_host_time)
{
    // 根据操作类型处理缓冲区
    if (in_io_operation == IOUserAudioIOOperationWriteEnd) {
        // 音频输出完成,可以修改输出缓冲区
    } else if (in_io_operation == IOUserAudioIOOperationBeginRead) {
        // 音频输入开始,可以处理输入缓冲区
    }
    return kIOReturnSuccess;
};

// 将回调设置到音频设备
this->SetIOOperationHandler(io_operation);

キーポイント:

  • コールバックはリアルタイム スレッドで実行され、ブロックできません。
  • IOUserAudioIOOperationWriteEnd出力操作が完了したことを示します
  • IOUserAudioIOOperationBeginRead入力操作の開始を示します
  • 合格in_io_buffer_frame_sizeバッファフレーム番号を取得する
  • in_sample_timeそしてin_host_timeタイムスタンプ情報を提供する

マルチプラットフォーム ドライバー アプリケーションの構造

(06:36) Xcode 14 マルチプラットフォーム ターゲットを使用する場合、Mac と iPad 用に UI を個別に準備する必要があります。

// macOS 视图:使用 SystemExtensions 框架
#if os(macOS)
import SystemExtensions

struct MacDriverView: View {
    @StateObject private var viewModel = DriverViewModel()
    
    var body: some View {
        VStack {
            Text(viewModel.statusText)
            Button("Install Driver") {
                viewModel.installDriver()
            }
        }
    }
}
#endif

// iPad 视图:引导用户去 Settings
#if os(iOS)
struct iPadDriverView: View {
    var body: some View {
        VStack {
            Text("Driver bundled with app")
            Button("Enable Driver in Settings") {
                if let url = URL(string: UIApplication.openSettingsURLString) {
                    UIApplication.shared.open(url)
                }
            }
        }
    }
}
#endif

キーポイント:

  • macOS は、SystemExtensions フレームワークを使用して、ドライバーをインストールするためのユーザー認証を要求します。
  • iPad には SystemExtensions フレームワークがないため、アプリケーションのインストール後にドライバーが自動的に検出されます。
  • ビルドフェーズのプラットフォームフィルター制御ファイルを通じてターゲットをコンパイルします。
  • iPad アプリには、アプリ設定にドライバー リンクを表示するための設定バンドルが含まれている必要があります

資格の構成

iPad アプリとドライバーの通信に必要な権限:

<!-- 应用的 entitlement:与驱动通信 -->
<key>com.apple.developer.driverkit.communicates-with-drivers</key>
<true/>

<!-- 驱动的 entitlement:允许第三方应用通信 -->
<key>com.apple.developer.driverkit.allow-third-party-user-clients</key>
<true/>

キーポイント:

  • これらの権利は開発にオープンであり、申請は必要ありません ・App Storeに配信する場合は開発者Webサイトからの申請が必要です
  • オーディオドライバーの使用方法com.apple.developer.driverkit.family.audio古いものを交換するallow-any-userclient-access

重要ポイント

  • 内容: 既存の Thunderbolt オーディオ インターフェイス ドライバーを iPad に導入します

  • 価値がある理由: M1 iPad ユーザー ベースは膨大であり、オーディオ プロは外出先でも使い慣れたハードウェアを使用したいと考えています。

  • 開始方法: ドライバーが USB、PCI、または Audio ファミリを使用していることを確認し、Xcode で iPad の宛先を追加します。ドライバー コードを変更する必要はありません。

  • 内容: iPad 用のプロフェッショナルなオーディオ コントロール パネル アプリを開発します。

  • 実行する価値がある理由: AudioDriverKit のリアルタイム コールバックにより、低レイテンシの信号処理が可能になり、iPad のタッチ インターフェイスと併用して直感的なコントロール パネルを作成できます。

  • 開始方法: を使用しますSetIOOperationHandlerリアルタイム コールバックを登録し、ユーザー クライアントを介してアプリケーションとドライバーの間で制御パラメーターを渡します。

  • 内容: クロスプラットフォームのハードウェア構成ツールを構築する

  • 実行する価値がある理由: 1 つのコード セットで Mac と iPad ユーザーの両方にサービスを提供し、マルチプラットフォーム ターゲットを通じてメンテナンス コストを削減します。

  • 開始方法: を使用します#if os()プラットフォーム固有の UI コードを分離し、ドライバー コア ロジックを共有する

  • 内容: 既存のハードウェア製品に iPad サポートを追加します。

  • 価値がある理由: DriverKit により、iPad が初めてサードパーティの Thunderbolt/USB 周辺機器をサポートできるようになり、新しい市場が開拓されます

  • 開始方法: ハードウェアがサポートされているトランスポート層 (USB/PCI) を使用しているかどうかを確認し、macOS ドライバーが iPad でコンパイルできるかどうかを確認します。

関連セッション

コメント

GitHub Issues · utterances