ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
DriverKitでドライバをiPadに導入する
DriverKitを使用して、ThunderboltやUSBアクセサリをiPadに簡単に接続する方法をご覧ください。コードを変更せずに既存のMacドライバを変換する方法、AudioDriverKitでリアルタイムオーディオのサポートを追加する方法、iPad用ドライバを開発するベストプラクティスやヒントを紹介します。
リソース
- Communicating between a DriverKit extension and a client app
- Implementing drivers, system extensions, and kexts
- System Extensions and DriverKit
関連ビデオ
WWDC21
WWDC20
-
ダウンロード
♪ ♪
こんにちは「DriverKitで ドライバをiPadに 導入する」へようこそ Souvikです DriverKitの素晴らしい 新機能についてお話します まず DriverKitの概要を 簡単に説明します そして AudioDriverKitの アップデートを説明します 最後に ドライバをiPadに 対応させる方法を紹介します それでは 概要から説明します 2019年 IOKitの デバイスドライバに代わる DriverKitを発表しました DriverKitはユーザー空間で 動作し より信頼性が高く 安全なシステムを拡張する 新しい方法をもたらしました 自身のプロセスがカーネルに ないため 開発がしやすいのです このドライバ拡張はdexts と呼ばれ Appにバンドルされ Mac App Storeで簡単に Appとドライバを配布できます 検索で簡単にドライバを 見つけることができ ドライバが 不要になった場合は Appを削除し アンインストール可能です DriverKit導入以来 さらに多くの新しいドライバに対応し USB ・ PCI ・ HIDなど転送に加え ネットワーク・ブロックストレージ シリアル・ オーディオ・ SCSI のコントローラおよび ペリフェラルドライバの サポートが可能になりました DriverKitで構築できる ドライバの種類については WWDC2021の 「DriverKitで オーディオドライバを作成」 WWDC2020の 「DriverKitによるPCI SCSIドライバの近代化」 をご覧ください 次に AudioDriverKitに 最近追加された いくつかの新機能を 紹介します その1つが リアルタイム オペレーションです AudioDriverKitの新機能として リアルタイムコールバックを 登録することが できるようになりました このコールバックは IO操作が 発生する度に呼び出されます 信号処理などリアルタイムスレッドで オーディオバッファを 変更する必要がある場合 このコールバックを使用できます
AudioDriverKitに リアルタイム コールバックを登録するには IOUserAudioDeviceに 設定するIOOperationHandler ブロックを宣言します このブロックは デバイスの IOUserAudioStreamバッファで IO操作が発生したときに リアルタイムコンテキストから 呼び出されることになります
ブロックの内部では 操作内容を確認し 必要に応じてデータの 変更ができます 最後にSetIOOperationHandlerを呼び オーディオデバイスにブロック設定します 次は エンタイトルメント についてです AudioDriverKit 導入当時はドライバに allow-any-userclient-accessという エンタイトルメントが必要でした macOS 12.1では AudioDriverKit専用の 新しいエンタイトルメントが 導入されました オーディオドライバをアップデートし allow-any-userclient-accessではなく 新オーディオファミリー エンタイトルメントの使用をお勧めします どのAppでもドライバと 通信できるようにしたい場合は allow-any-userclient-access 権限を保持することもできます この新しいエンタイトルメントは 開発用に公開されているため 申請することなく今日から 利用を開始できます DriverKitファミリの全エンタイトルメント が開発用に使用できます この権利の配布を 希望される場合は developer.apple.comのSystem Extension ページにアクセスしてください 今回はiPadのDriverKit についてお話します プロが最高の仕事をするため iPadをの使用が増えています しかし多くは iPadで使用不可の 外部ハードウェアに依存しています そこで本日 DriverKitがiPadに 登場することを発表します
macOSのDriverKitは 安全かつ確実な方法で システムを拡張することを 可能にしましたが 同じ技術をiPadに導入します Mac上のDriverKitですでに ドライバを作成している場合 そのドライバと 全く同じものをiPadに そのまま 持ち込むことができます USB ・ PCI ・ Audioは iPadOS 16でサポートされる予定です iPadや多くのデバイスでThunderbolt オーディオインターフェイスを 初めて利用できるようになります これを可能にしたのは M1チップの力です M1を搭載した全てのiPadは DriverKitに対応します iPadOSのDriverKitは macOSと同じです 1つのDriverKitドライバ をビルドすれば 両プラットフォームで動作し ソースの変更は必要ありません Xcode 14の新機能である マルチプラットフォームApp機能を 使えば 1つのAppターゲットでMacとiPadの 両方にドライバを 簡単に配信できます マルチプラットフォームAppの詳細については 「Xcodeでマルチプラットフォーム App開発」をご覧ください
XcodeはDriverKitドライバの 自動署名にも対応しました XcodeはiPadOS上のDriverKitの 扱い方を熟知しており MacとiPadの両方に プロビジョニングできます DriverKitドライバの手動署名を 設定する必要はもうありません iPadOS用Appとドライバは macOSと同様にApp Storeで 配布することができます App内課金などの 機能を活用したり ユーザーから 発見されやすいドライバに することができるのです 既存のmacOSのドライバや AppをiPadに導入するのが どれだけ簡単か 見てみましょう DriverKitSampleAppという Appを用意しました ユーザーがドライバを インストールすることを 可能にするラベルとボタンを 持つSwiftUIのビューがあります ドライバは NullDriver と呼ばれています ドライバが起動すると メッセージを表示し 1秒ごとに タイマーを起動し timerCountというカウンタ をインクリメントします iPadAppにするためには XcodeでDriverKitSampleApp ターゲットを選択し
「Supported Destinations」に iPadを追加します
実行先をMacに接続している iPadに変更ができました
iPadで 実行してみましょう これがiPad Appです Xcodeで見たビューのように ラベルとボタンがあります 「Install Dext」ボタンをタップして 「Settings」に移動し この新しいドライバの リンクが表示されます リンクをタップすると バンドルされて いる全ドライバリストが表示されます そして Null Driverを 有効にできます デモでいくつかお気づきの 点があったかと思います このNull Driverは インストール後 システムで自動検出され iPadOSAppに バンドルされています macOSの場合 SystemExtension フレームワークを使用し ドライバのインストールを ユーザーに促す必要があります iPadOSでは SystemExtensions フレームワークは存在しません
Xcodeの内部では ドライバがAppに 埋め込まれています ドライバはローレベルのソフトウェアで 特権的なものであるため 実行する前にユーザーの 承認が必要です macOSの場合 ユーザーは 「セキュリティとプライバシー」から システム拡張を 許可する必要があります iPadOSの場合 ドライバの承認は 「設定」Appにあります ドライバの承認には 2つのオプションがあります ドライバがインストール されたAppが1つでもある場合 「一般」内に利用可能な ドライバの一覧を表示する メニューが表示されます 各ドライバのオン/オフの 切り替えが可能です Appに設定バンドルが 含まれる場合 設定内にドライバの リンクが表示されます 設定からドライバを有効にするよう ユーザーに促す必要があります macOSドライバ プロジェクトを再び開始し Appが ユーザーにドライバを 有効にするよう 設定する方法を見ましょう まず iPadを対応機種に 追加します
SwiftUIビューにはドライバを インストールするボタンがあり ビューモデルには SystemExtensions フレームワークと やり取りする ステートマシンがあります このプロジェクトは MacとiPad両方で構築予定なので Mac用のビューと ビューモデルはそのままに iPadで使用する新しいビューを 作成したいと思います
「Build Phases and Compile sources」で 各ファイルのプラットフォーム フィルタを変更して iOS用またはmacOS用に コンパイルを可能にします
Appに設定バンドルを 追加してみましょう ここでは デフォルトの 設定例を使用しますが 後でAppが使用する 実際の設定に変更ができます
先ほど作成したiOSの ビューを確認してみましょう macOSのビューを iOSのビューにコピーして 使用することができます
iOSはビューモデルを使用しないため これは削除ができます
さらに 設定バンドルを開くため ボタンのアクションを変更します ユーザーが「設定」をクリックすることで ドライバを有効にできます
最後にボタンのテキストを 変更し 「設定」で ドライバを有効にする 必要があることをを明確に説明します
実際に見てみましょう デザインしたビューがあり ボタンをタップすると 設定バンドルが表示されます 「ドライバー」に入り Null Driverを有効にしますが
ドライバは オンデマンドで起動することを 念頭に置くことが重要です 設定でドライバを 有効にしていますが ドライバは ハードウェアデバイスが iPadに接続されたとき のみ実行されます ドライバが起動したら Xcodeのワイヤレスデバッグで デバッガを取り付ける ことができますね そのため Xcodeの「Debug」 メニューから「Attach to Process」を 選択し NullDriverプロセスを 選択しています 一度アタッチすれば ブレークポイントを 設定したり 実行を一時停止できます タイマーにブレークポイントを 設定しました タイマーが何回呼ばれたか見るため timerCount を表示します
デバッグが終わったら Xcodeの「Debug」メニューで ドライバプロセスから デタッチします
これがドライバです しかしドライバは それだけでは意味がありません システムの他の部分と 通信する必要があるのです AudioDriverKitの様なDriverKit フレームワークがこの処理を代行します ハードウェア用のカスタムコントロール パネルAppを作成するなど より高度なことを 行う必要がある場合は Appがドライバと通信 できるようにする必要があります これは ユーザークライアントで できることです 独自のインターフェースを 定義することができ Appとドライバの 通信を可能にします AppはIOKit.frameworkを 使い ユーザークライアントを開きます この動作例については developer.apple.comの サンプルコードをご参照ください
Appがドライバと 通信できることは分かりましたが セキュリティに配慮することも重要です ドライバは特権的な存在のため 全Appが通信できるように することは 避けたいと考えています
macOSAppはdriverkit userclient-access エンタイトルメントを必要とし その値は許可されたドライババンドル 識別子の配列となります
iPadOSではCommunicates With Drivers という新エンタイトルメントが追加されました これは macOSのユーザークライアント エンタイトルメントを置き換えます このエンタイトルメントを使って Appはドライバでユーザー クライアントを開くことができます
Communicates With Drivers エンタイトルメントを Appに手動で追加したい場合 次のXML文字列を使用します
Xcodeからこのエンタイトルメントを 追加することも可能です Xcodeの 「Signing and Capabilities」で この新しい機能を追加します そして 「communicates with drivers」 を検索して Appに機能を 追加することができます
ユーザークライアントのもう1つの使い方は 他の開発者のAppと ドライバを インタラクトさせることです そこで今回は Appとドライバがあり 他の開発者のAppに対しても サービスを 提供したいと仮定します DriverKitのユーザークライアントは これに対応しています
ドライバとコミュニケーション をとる必要がある各Appは ドライバエンタイトルメントと コミュニケーションをとる必要があります ドライバにはAllow Third Party User Clientsエンタイトルメントが必要です これにより 異なるチーム識別子で 構築されたAppが ドライバにユーザークライアントを 開くことができます このエンタイトルメントがないと 同じチームのAppしか ドライバと通信できません Allow Third Party User Clientsをドライバに手動で 追加したい場合は 以下のXML 文字列を参照してください または Xcodeから 「Signing and Capabilities」にアクセスし この機能を 追加することもできます
新ユーザークライアントエンタイトルメントは 開発用に公開されているので 承認なしで今日から 使い始めることができます これらのエンタイトルメントの 配布を希望される方は 当社デベロッパ向け Webサイトをご覧ください DriverKitドライバはAppの アップデートにも重要な意味を持ちます Appの自動更新により ユーザーは常に 最新版のAppを入手できます ただし ドライバを含む Appの場合は アップデートの仕組みが 少し異なります Appのバージョン1を App Storeで配布したとし そのAppと同梱されるドライバを iPadにインストールし 設定でドライバを 有効にします ドライバ用のハードウェア デバイスを接続すると ドライバが起動し ドライバが起動すると Appはユーザークライアントを使って ドライバとの通信を 開始できるようになります Appにバグを発見し バージョン2を App Storeに 提出したとします Appの自動更新により バージョン2のAppは 自動でiPadにダウンロードされ インストールされます ドライバの承認状態は アップデートで維持されるため 改めて承認する 必要はありません しかし ハードウェアは まだ接続されており バージョン1のドライバがまだ 動作していることに注意します Appのアップデートで ドライババージョン2を ダウンロードしたが 起動しません 古いドライバがまだ 動作しているため バージョン2Appは 1のドライバと通信が必要です
ハードウェアデバイスが抜かれると ドライバの実行が停止し これでドライバの バージョン1は終了し バージョン2に アップデートができます
もう一度デバイスを接続すると バージョン2のドライバが起動し Appは新しいドライバと 通信するようになります
まとめです Appは自動更新され Appはいつでも更新されます ドライバはデバイスを 抜いた後に更新されます Appが古いドライバと 通信している場合もあります Appとドライバの準備ができたら App Storeに提出します ドライバはDriverKitに対応した デバイスでのみ動作できます Appがドライバのみを インストールする場合など Appをこれらの デバイスに制限したい場合は NUIRequiredDeviceCapabilities にDriverKitを追加してください これで ユーザーはDriverKitに 対応しないデバイスにAppを インストールすることが できなくなります Appとドライバがハードウェア機器と どのように連動するかを 示すビデオをApp Reviewに 提出することをお勧めします これがiPadでの DriverKitです M1によりiPadにUSB ・ PCI Audioドライバを導入できるようになりました ドライバは App Store のAppに含めて 配信できます すでにドライバをお持ちの方は それをiPadに入れるのも簡単です デベロッパの皆様は iPadでDriverKitを使用して フィードバックアシスタントで ぜひご意見をお送りください ご視聴ありがとう ございました .
-
-
2:25 - Register real-time callback in AudioDriverKit
// Declare a IOOperationHandler block to set on the IOUserAudioDevice. // The block will be called from a real time context when a i/o operation // occurs on the IOUserAudioStream buffers for the device. 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) { // Add custom code to make modifications to the buffers as necessary if (in_io_operation == IOUserAudioIOOperationWriteEnd) { ... } else if (in_io_operation == IOUserAudioIOOperationBeginRead) { ... } return kIOReturnSuccess; }; this->SetIOOperationHandler(io_operation);
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。