WWDC Quick Look 💓 By SwiftGGTeam
What's new in assessment

What's new in assessment

元の動画を見る

ハイライト

Apple は Automatic Assessment Configuration を Mac に持ち込み、同じ AEAssessmentSession API で iPhone、iPad、Mac、Catalyst の制御された試験モードを統一しました。


主要内容

デジタル試験 App が最も恐れるのは 2 つです。1 つ目は、試験開始後に生徒が他の App に切り替え、辞書を開き、予測変換を使い、通知を見てしまうこと。2 つ目は、学校のデバイスが常に MDM で完全管理されているわけではなく、個人端末と学校端末で信頼できる 2 系統のフローを維持しにくいことです。初期の iPad autonomous single app mode は MDM に依存し、のちに Apple は entitlement 駆動の Automatic Assessment Configuration (AAC) で導入の敷居を下げました。(00:28)

2020 年の変化は Mac も同じモデルに入ることです。Mac の assessment mode では試験 App だけが表示され、Dock、Mission Control、Notification Center は使えず、画面収録とスクリーンショットはブロックされ、他 App のウインドウは隠され他プロセスのネットワークアクセスは遮断され、メディア再生は一時停止し、クリップボードはセッション開始と終了でクリアされます。開発者はこれらのシステム制限を自前で包む必要はなく、適切なタイミングで assessment mode を要求します。(01:14)

AAC のライフサイクルは明確です。App がデバイス制限の開始タイミングを決め、設定とセッションを作り、begin() を呼び、システムが制限を完了してから試験内容を表示します。終了時は end() を呼び、システムが復帰してから結果や確認画面を表示します。入場と退場には時間がかかることがあるため、講演では両フェーズで遷移 UI を出し、生徒に App が固まったと思わせないよう繰り返し強調しています。(02:14)

iOS と iPadOS も新しい AAC framework に移行します。AEAssessmentConfiguration はデフォルトで最も厳しい設定ですが、iOS 14 からは試験に応じて dictation、predictive keyboard、spell check などのシステムサービスを有効にできます。数学試験ではスペルチェックを許可し、言語試験では入力方式に応じて continuous path keyboard を開放できます。この設定オブジェクトはシステム能力とともに拡張され、開発者は試験の公平性と生徒のアクセシビリティを 1 つのセッションモデルで扱えます。(10:12)


詳細

AEAssessmentSession の開始と終了

(03:52) AAC の中核オブジェクトは AEAssessmentConfigurationAEAssessmentSession です。設定オブジェクトが試験体験を定義し、session が入場、退場、delegate ライフサイクルイベントを扱います。

import AutomaticAssessmentConfiguration

class AssessmentManager: NSObject {
    private var assessmentSession: AEAssessmentSession?

    func beginAssessmentMode() {
        let config = AEAssessmentConfiguration() // Configure AAC behavior

        let session = AEAssessmentSession(configuration: config) // Construct your session

        session.delegate = self // Receive lifecycle events via delegation

        assessmentSession = session // Retain the session

        // Present assessment mode bringup transition UI
        // ...

        session.begin()
    }

    func endAssessmentMode() {
        guard let session = assessmentSession else {
            return
        }

        // Present assessment mode teardown transition UI
        // ...

        session.end()
    }
}

extension AssessmentManager: AEAssessmentSessionDelegate {

    func assessmentSessionDidBegin(_ session: AEAssessmentSession) {
        // Stop showing assessment mode bringup transition UI
        // ...

        // Present sensitive testing content
        // ...
    }

    func assessmentSession(_ session: AEAssessmentSession, failedToBeginWithError error: Error) {
        // Stop showing assessment mode bringup transition UI
        // ...

        // Present some kind of error UI
        // ...

        // Release your reference to the AEAssessmentSession
        assessmentSession = nil
    }

    func assessmentSessionDidEnd(_ session: AEAssessmentSession) {
        //  Stop showing assessment mode teardown transition UI
        // ...

        // Present your post-test UI
        // (maybe a result, a confirmation, or just the initial view)
        // ...

        // Release your reference to the AEAssessmentSession
        assessmentSession = nil
    }

    func assessmentSession(_ session: AEAssessmentSession, wasInterruptedWithError error: Error) {
        // Hide all sensitive UI
        // ...

        // Present some kind of error UI
        // ...

        session.end()
    }
}

キーポイント:

  • import AutomaticAssessmentConfiguration で新しい AAC framework を導入します。
  • AEAssessmentConfiguration() で試験設定を作ります。transcript はデフォルトが最も厳しいと明言しています。
  • AEAssessmentSession(configuration:) で設定からセッションを作ります。
  • session.delegate = self で開始、失敗、終了、中断のコールバックを manager が受け取ります。
  • assessmentSession = session で session を保持する必要があります。早く解放すると assessment mode が終了します。
  • session.begin() は assessment mode への入場を要求するだけで、試験内容の表示は assessmentSessionDidBegin(_:) の後です。
  • session.end() は assessment mode からの退場を要求し、結果画面や初期画面は assessmentSessionDidEnd(_:) の後に表示します。

開始失敗と実行中の中断を扱う

(03:03) AAC には 2 つの重要な失敗点があります。モード入場時にシステムサービスを制限できない、または App に entitlement がない場合。試験実行中にサービスが assessment mode を守らなくなる場合もあります。実行中断時、システムは assessment mode を自動では解除せず、App に試験停止を通知します。

func assessmentSession(_ session: AEAssessmentSession, failedToBeginWithError error: Error)

func assessmentSession(_ session: AEAssessmentSession, wasInterruptedWithError error: Error)

キーポイント:

  • failedToBeginWithError は assessment mode に入れなかったことを意味し、session は無効なので参照を片付けます。
  • wasInterruptedWithError は試験は実行中だったがセキュリティ保証が破られたことを意味します。
  • 中断後はまず機密の試験内容を隠し、必要なら進捗保存や状態クリーンアップを行います。
  • クリーンアップ後に session.end() を呼び、残りのシステムサービスを解放します。

AAC を差し替え可能な依存に分離する

(07:02) 講演は「assessment mode に入るかどうか」のビジネスロジックと「実際に AAC を呼ぶ」システム副作用を分けることを勧めます。理由は明確です。AAC は Mac でどの App が入力を受け取れるかを制限します。デバッグ中に Xcode でブレークポイントに当たると、試験 App はそこで止まり Xcode は入力を受け取れず、開発マシンが固まります。

protocol AssessmentManaging {
    func beginAssessmentMode()
    func endAssessmentMode()
}

キーポイント:

  • transcript は assessment mode の境界を作るために protocol-oriented programming を明示的に勧めています。
  • 本番実装は実際の AEAssessmentSession を包めます。
  • テスト実装は呼び出し記録だけ、または test expectation の読み込みだけでも構いません。
  • ビジネスロジックが AssessmentManaging に依存すれば、単体テストで開発マシンを実際にロックしません。
  • デバッグで Xcode と試験 App が固まったら、Mac を再起動すると assessment mode は止まり、再起動後にシステムサービスは復帰します。

iOS、iPadOS、Catalyst で同じモデルを再利用する

(10:12) 新しい AAC framework は iOS と iPadOS もカバーし、以前の UIKit assessment mode API を置き換えます。設定オブジェクトで dictation、predictive keyboard、spell check などを有効にでき、試験種別と生徒のニーズに合わせられます。Catalyst App は iOS 14 と macOS Big Sur から完全な assessment mode サポートを得ます。

let config = AEAssessmentConfiguration()
let session = AEAssessmentSession(configuration: config)

キーポイント:

  • AEAssessmentConfiguration は拡張可能な設定値で、試験が許可するシステム能力を記述します。
  • 同じ AEAssessmentSession API が iOS、iPadOS、macOS に公開されています。
  • Catalyst App は所在プラットフォームに応じた正しい assessment mode を起動します。
  • transcript は dictation、predictive keyboard、spell check の具体的なプロパティ名を示していません。実装時は Automatic Assessment Configuration のドキュメントを参照してください。

重要ポイント

1. クロスプラットフォーム試験セッションマネージャ

やること: iPhone、iPad、Mac、Catalyst の試験開始、終了、失敗、中断処理を 1 つの AssessmentManager に集約する。

価値: このセッションの焦点は多プラットフォームを覆う 1 つの AEAssessmentSession API で、試験 App が Mac 専用のロックフローを別途維持する必要がありません。

始め方: まず AEAssessmentConfiguration でデフォルトの厳格設定を作り、begin()end()、4 つの delegate コールバックを既存の試験ステートマシンに接続します。

2. 試験開始前の遷移 UI

やること: 生徒が開始をタップしたら「試験モードに入っています」の遷移画面を出し、assessmentSessionDidBegin(_:) の後に問題を読み込む。

価値: AAC はシステムサービスを調整し、入場に時間がかかることがあります。早く問題を見せると、完全制限前に機密内容が露出します。

始め方: 問題ビューは DidBegin コールバックの後にぶら下げ、失敗 UI は failedToBeginWithError の後にぶら下げます。

3. 中断後の安全な片付け

やること: 専用の中断パスを作る。問題を隠し、進捗を保存し、ユーザーに通知し、end() で assessment mode を抜ける。

価値: 実行中断時、システムは App に通知するだけで assessment mode は自動解除しません。App が試験を止め、システムサービスを解放する必要があります。

始め方: wasInterruptedWithError でまず機密のない画面に切り替え、その後ローカル保存と終了フローを実行します。

4. テスト可能な AAC アダプタ層

やること: AssessmentManaging プロトコルを定義し、本番は実 AAC、テストとローカルデバッグはテスト実装を使う。

価値: Mac assessment mode は入力を制限し、ブレークポイントデバッグで Xcode が続行不能になることがあります。プロトコル境界があればビジネスロジックはシステムロック副作用に直接依存しません。

始め方: 既存の試験フロー依存をプロトコル型に変え、テスト target では begin/end だけ記録する fake manager を注入します。


関連セッション

コメント

GitHub Issues · utterances