WWDC Quick Look 💓 By SwiftGGTeam
macOS のアセスメント機能の新機能

macOS のアセスメント機能の新機能

元の動画を見る

ハイライト

macOS 27 では Automatic Assessment Configuration フレームワークが拡張され、教育向け試験 App は単一の API で、システムレベルのセキュリティチェック、アクセシビリティ制限、Menu Bar/Dock のカスタマイズ、ファイルアクセスの許可リスト、プロセス制御を設定できます。独自の割り込みコードを書く必要はありません。

主要内容

試験前のデバイス状態チェック

00:40

オンライン試験で最も怖いのは、試験開始前に学生がシステム状態を大きく変えてしまっていることです。SIP がオフ、MDM が削除済み、Lockdown Mode が有効で試験に必要なネットワーク監視をブロックしている、こうした状態はいずれも試験環境の信頼性を損ないます。

以前は、開発者がこれらの状態を確認するスクリプトを自分で書くしかありませんでした。そのチェックロジックはシステムバージョンと強く結びつき、macOS がアップデートされるたびに壊れる可能性がありました。

macOS 27 では、この種のチェックが AEAssessmentConfiguration に取り込まれました。いくつかの Boolean プロパティを設定すると、システムが試験開始前に自動で検証します。条件を満たさない場合は、学生に何を修正すべきかを示すダイアログを直接表示します。UI コードを書く必要はありません。

アクセシビリティ:デフォルトでは維持し、必要なものだけ制限する

03:00

試験ソフトウェアが犯しがちな誤りは、すべてのアクセシビリティ機能を一括で無効にすることです。VoiceOver や Switch Control は障がいのある学生にとって必須であり、それを切ることは受験の権利を奪うのに等しい行為です。

AAC フレームワークの考え方は逆です。学生がすでに有効にしているアクセシビリティ機能はデフォルトで維持し、開発者が無効にしたいものだけを明示的に指定します。allowsAccessibilitySwitchControl = true は、その機能を学生のために有効化するわけではありません。すでに有効にしている学生が使い続けられるよう許可するだけです。アクセシビリティを「試験後に補うもの」ではなく、「最初から設計に含めるもの」に変えるアプローチです。

システム体験のカスタマイズ:許可リストの考え方

05:07

Mac ユーザーは Menu Bar と Dock に慣れています。以前の試験ソフトウェアは不正防止のために、フルスクリーンの枠なしウィンドウでシステム UI 全体を覆い、学生が時間を見たり音量を調整したりする入口すら失うことがありました。

今回 Apple は一括遮断ではなく、許可リスト API を提供しています。Menu Bar に表示するアイコン、Apple メニューに残す項目、Dock を表示するかどうかを正確に制御できます。描画はシステムネイティブなので、偽物の UI を自分で描く必要はありません。

プロセス制御:信頼したプロセスだけを実行させる

09:16

バックグラウンドで動いている Safari、Notes、Shortcuts は、いずれも不正の経路になりえます。スクリーンショット、画面録画、自動化スクリプトは試験中に存在すべきではありません。

allowOnlyParticipantsToRun = true を設定すると、試験開始時にシステムが許可リスト外のプロセスを自動終了します。allowsUserScriptExecution = false と組み合わせて Shortcuts や Automator を封じることで、試験環境は「App レベルの防御」から「システムレベルの防御」に引き上げられます。

詳細

システム前提条件のチェック

02:30

AEAssessmentConfiguration は 6 つのシステムレベルの事前チェックを提供します。

import AutomaticAssessmentConfiguration

func makeAssessmentConfiguration() -> AEAssessmentConfiguration {
    let configuration = AEAssessmentConfiguration()

    configuration.allowLockdownMode = false
    configuration.allowPrivateRelay = false
    configuration.requiresSIP = true
    configuration.requiresManagedDevice = true
    configuration.requiresSingleUser = true
    configuration.requiresUserAccountType = .standard

    return configuration
}

要点:

  • requiresSIP:System Integrity Protection が有効であることを要求し、低レベルのシステム改ざんを防ぐ
  • requiresManagedDevice:MDM 管理されたデバイスであることを要求する。学校が統一配布するデバイスに適している
  • requiresSingleUser:ログインしているユーザーアカウントが 1 つだけであることを要求し、アカウント切り替えによる不正を防ぐ
  • requiresUserAccountType:アカウント種別を .standard に制限し、管理者アカウントを除外する
  • allowLockdownModefalse にすると Lockdown Mode をオフにする必要があり、試験に必要なネットワーク監視を妨げない
  • allowPrivateRelayfalse にすると iCloud Private Relay をオフにする必要があり、ネットワーク通信を監査できるようにする

学生のデバイスがいずれかの条件を満たさない場合、システムは自動でプロンプトを表示し、修正が必要な問題をすべて列挙します。

アクセシビリティ制限

04:01

import AutomaticAssessmentConfiguration

func makeAssessmentConfiguration() -> AEAssessmentConfiguration {
    let configuration = AEAssessmentConfiguration()

    configuration.allowsAccessibilityVoiceOver = true
    configuration.allowsAccessibilitySwitchControl = false
    configuration.allowsAccessibilityAlternativeInputMethods = true
    configuration.allowsAccessibilityBackgroundSounds = true
    configuration.allowsAccessibilityHoverText = true
    configuration.allowsAccessibilityLiveSpeech = true
    configuration.allowsAccessibilitySpokenContent = true
    configuration.allowsAccessibilityVoiceControl = true
    configuration.allowsAccessibilityZoom = true

    return configuration
}

要点:

  • allowsAccessibility で始まる各プロパティは、具体的なアクセシビリティ機能 1 つを制御する
  • true は「すでに有効にしている学生が使い続けられるよう許可する」という意味であり、学生のためにその機能を自動でオンにするわけではない
  • false にすると、試験開始時にその機能を自動終了し、試験中に再起動できなくする
  • Switch Control はカスタム操作シーケンスの記録と再生が可能で、不正リスクがあるためここでは無効化している
  • VoiceOver、Zoom、Hover Text などの視覚支援機能は基本的に維持し、視覚障がいのある学生が通常どおり参加できるようにすることが推奨される

05:32

import AutomaticAssessmentConfiguration

func makeAssessmentConfiguration() -> AEAssessmentConfiguration {
    let configuration = AEAssessmentConfiguration()

    configuration.allowsMenuBar = true
    configuration.allowedMenuBarItems = [
        .battery,
        .clock,
        .volume
    ]
    configuration.allowedAppleMenuItems = [
        .sleep
    ]

    return configuration
}

要点:

  • allowsMenuBar = true は Menu Bar 表示を有効にする。デフォルトでは非表示
  • allowedMenuBarItems は許可リストであり、リストにあるシステムアイコンだけが残る
  • 許可リストにあるアイコンは「強制表示」されない。学生がもともと Menu Bar に追加していなければ表示されない
  • allowedAppleMenuItems は左上の Apple アイコンをクリックした後のメニュー内容を制御する
  • 空配列を渡すと、すべての Apple メニュー項目を隠し、「この Mac について」だけを残す

入力方法の制限

07:01

import AutomaticAssessmentConfiguration

func makeAssessmentConfiguration() -> AEAssessmentConfiguration {
    let configuration = AEAssessmentConfiguration()

    configuration.allowsDictation = false
    configuration.allowsAutoFill = false
    configuration.allowsStructuralInput = false
    configuration.allowsEmojiKeyboard = false

    return configuration
}

要点:

  • allowsDictation:音声入力はスペルを自動修正し、受験者に「無料の」答えを与える可能性がある
  • allowsAutoFill:自動入力は連絡先などの情報を事前に読み込み、参考資料を漏らす可能性がある
  • allowsStructuralInput:構造的入力は文字の構成規則を露出し、答えの手がかりを漏らす可能性がある
  • allowsEmojiKeyboard:絵文字キーボードには検索機能があり、暗号の伝達経路になりえる
  • これらの制限は対応するメニュー項目も隠し、それらをサポートする UI コントロール内での使用も防ぐ

Dock とファイルシステムアクセス

07:38

import AutomaticAssessmentConfiguration

func makeAssessmentConfiguration() -> AEAssessmentConfiguration {
    let configuration = AEAssessmentConfiguration()

    configuration.allowsDock = true

    return configuration
}

08:35

import AutomaticAssessmentConfiguration

func makeAssessmentConfiguration() -> AEAssessmentConfiguration {
    let configuration = AEAssessmentConfiguration()

    configuration.allowedDirectoriesAndFiles = [
        URL(fileURLWithPath: "~/Documents/")
    ]

    return configuration
}

要点:

  • allowsDock = true は Dock を表示するが、試験で許可された App だけを描画する。Finder と Trash は常に存在する
  • Finder が Dock に表示されても、操作可能にするには participant として明示的に追加する必要がある
  • allowedDirectoriesAndFiles は標準の Open/Save パネルと Finder ウィンドウの両方に作用する
  • 学生がファイルを保存するとき、Save パネルには許可リスト内のディレクトリだけが表示され、他の場所へは移動できない

プロセスとスクリプトの制限

09:58

import AutomaticAssessmentConfiguration

func makeAssessmentConfiguration() -> AEAssessmentConfiguration {
    let configuration = AEAssessmentConfiguration()

    configuration.allowOnlyParticipantsToRun = true
    configuration.allowsUserScriptExecution = false

    return configuration
}

要点:

  • allowOnlyParticipantsToRun = true:試験開始時、システムは許可リスト外のすべてのプロセスを終了し、主試験 App、明示的に追加された participant App、必要なシステムプロセスだけを残す
  • allowsUserScriptExecution = false:Shortcuts と Automator スクリプトの実行を防ぐ
  • Safari や Notes などのバックグラウンド App は試験開始時に自動終了する
  • 試験がサードパーティコンポーネント、たとえば不正防止カメラプラグインに依存する場合は、事前に participant 許可リストへ追加する必要がある

ベストプラクティス

10:51

  • 独自の割り込みコードをフレームワーク API に置き換える。CGEventTap や隠しウィンドウのオーバーレイといった古いコードは削除できる
  • まずは緩く始め、必要に応じて締める。過度な制限は受験体験を損なう
  • アクセシビリティを必須要件として扱い、試験後に補うものにしない
  • transition callback を登録し、システムコールバックに基づいて App 状態を駆動する。begin/end を呼べば即座に反映されると仮定しない
  • 各 macOS beta がリリースされた当日にテストし、問題を見つけたらすぐ Feedback を送る

主な示唆

「ワンクリック試験開始」の教育 App を作る

何をするか:試験開始前に、App がデバイス状態を自動チェックし、環境を設定し、システムをロックする。受験者は「試験開始」をクリックするだけで、すべての安全チェックと環境設定を AAC フレームワークが処理する。

なぜ価値があるか:以前は、SIP、MDM、Lockdown Mode などの状態を確認するスクリプトを開発者が自分で書く必要があり、ロジックはシステムバージョンと強く結びついていました。macOS がアップデートされると壊れがちでした。AAC フレームワークはこれらのチェックを標準化し、条件を満たさない場合は自動で修正を促します。

始め方:AEAssessmentConfiguration を作成し、requiresSIPrequiresManagedDeviceallowLockdownMode などのプロパティを設定し、begin を呼んで試験セッションを開始します。

障がいのある学生向けにカスタマイズされた試験支援を作る

何をするか:アクセシビリティ機能の細かな制御を使い、異なるニーズを持つ学生向けに異なる設定テンプレートを生成する。視覚障がいのある学生には VoiceOver と Zoom を残し、運動障がいのある学生には Switch Control を残し、不正リスクのある他の機能だけを無効化する。

なぜ価値があるか:すべてのアクセシビリティ機能を一括で切ることは、障がいのある学生から受験の権利を奪うことです。AAC フレームワークは学生がすでに有効にしている機能をデフォルトで維持し、開発者は不正リスクのある具体的な項目だけを無効化します。

始め方:学生プロファイルに基づいて AEAssessmentConfiguration を動的に生成し、allowsAccessibilityVoiceOverallowsAccessibilitySwitchControl などを設定して、必要に応じたテンプレートを読み込みます。

試験環境監視ダッシュボードを作る

何をするか:教師側にリアルタイム監視ダッシュボードを作り、各受験者のデバイス状態を表示する。SIP が有効か、未許可のプロセスが動いていないか、どのアクセシビリティ機能が有効かを確認できるようにする。

なぜ価値があるか:監督者が学生のデバイスを 1 台ずつ確認することはできません。リモート試験ではなおさらです。AAC フレームワークの事前チェック能力を使えば、デバイスの準拠状態を監督システムへリアルタイム送信し、異常なデバイスを自動で警告できます。

始め方:試験 App に AAC 事前チェックロジックを組み込み、結果を WebSocket またはポーリング API で教師側へ送信し、ダッシュボードでは赤黄緑の状態表示を使います。

安全なオフライン試験モードを作る

何をするか:allowOnlyParticipantsToRun とファイルシステム許可リストを使い、完全にオフラインの試験環境を作る。試験中、学生は指定されたローカルリソースだけにアクセスできる。

なぜ価値があるか:Safari、Notes、Shortcuts などのバックグラウンド App は不正経路になりえます。プロセス制御は試験環境を「App レベルの防御」から「システムレベルの防御」へ引き上げ、許可リスト外のプロセスを自動終了します。

始め方:allowOnlyParticipantsToRun = trueallowsUserScriptExecution = false を設定し、allowedDirectoriesAndFiles でファイルアクセス範囲を制限し、試験に必要なサードパーティコンポーネントを participant 許可リストに追加します。

旧版試験ソフトウェアの割り込みコードを移行する

何をするか:CGEventTap や隠しウィンドウオーバーレイといった古いコードを、AAC フレームワークの標準 API に置き換える。

なぜ価値があるか:独自の割り込みコードはシステムアップデートと衝突しやすく、保守コストも高いです。AAC フレームワークはシステムレベルの実装なので、安定性と互換性が高く、コードも簡潔になります。

始め方:プロジェクト内のカスタムキーボード割り込み、ウィンドウ遮蔽、プロセス監視ロジックをすべて特定し、対応する AEAssessmentConfiguration プロパティに段階的に置き換え、不要になった低レベル hack を削除します。

関連セッション

コメント

GitHub Issues · utterances