Assessmentの新機能 – WWDC2020

Session概要

今ではMacで学力テストを行うことがこれまで以上に容易になっています。教育開発者がiPhone、iPad、およびMacのAutomatic Assessment Configuration(AAC: 自動アセスメント構成)フレームワークを活用して、全てのデバイスで学生にテストと評価を提供する方法について学びます。
また、開発者が学生のニーズやテスト内容に合わせて、iOSのテストや試験で制限された機能を有効にする方法についても学びます。 https://developer.apple.com/videos/play/wwdc2020/10005/

自動アセスメント構成とは

  • MacのアセスメントモードはiPadと同じではなく、各プラットフォームの試験環境を同一に保つことを目標としている
  • アセスメントモードでユーザが出来なくなること
    • アセスメントモード中は対象のアプリのみが表示され、それ以外のDockやMission Control、通知センターなどは利用できない
    • スクリーンの録画やキャプチャも同様に利用不可
    • 他のアプリは開けるがWindowは非表示となり、他のすべてのプロセスからネットワークへのアクセスは阻止される
    • メディア再生は一時停止し、セッションの開始時と終了時にペーストボードがクリアされる

アセスメントモードのライフサイクルとアプリとの関連性

  • アプリが実行を開始する時、アセスメントモードは非アクティブで、デバイスを制限するのがいつが適切かは皆さんが決定することとなる
  • アクティブにするとアプリがアセスメントモードの開始をリクエストする
  • その時点でAACフレームワークがシステムサービスの修正と制限を開始し、安全な試験環境を作成する
    • この処理は少々時間がかかるため、アプリにスピナーなどのトランジションUIを表示すると良い
  • すべてのサービスが適切な状態となると、アプリに通知され試験を開始可能
  • 試験が完了した後、アプリがアセスメントモードの終了をリクエストする
    • この処理も同様に時間がかかるため、トランジションUIを表示するとユーザー体験が向上します
  • OSが前の状態に復帰するとアプリに通知され、アセスメントモードのライフサイクルが終了する
  • 上記の他にエラーが発生する可能性は常にあるため、アプリがエラー処理をする方法が考慮されていることが重要
    • エラーが発生する箇所はモードの開始をリクエストした直後でサービスを制限できないことやアプリにこの機能の使用資格を付与し忘れているなど
    • エラー発生時はアプリに通知され、アセスメントモードは非アクティブの状態に戻る
    • また、試験実施中もエラーが発生しやすい
      • 稀にサービスがアセスメントモードに準拠しなくなり、安全性を保証できなくなる
      • この場合はアセスメントモードを中止せず、代わりにアプリに通知して異常発生を知らせ受験者が試験を中止する
      • アプリは直ちに機密情報のコンテンツを非表示にし、モードを終了して残りのシステムサービスを解放する

エラーなしの正常系のライフサイクル
モード開始直後のエラー時のライフサイクル
試験実施中でのエラー時のライフサイクル

自動アセスメント構成のコードにおけるライフサイクルのサンプル

import AutomaticAssessmentConfiguration

class AssessmentManager: NSObject {
    // モードの開始、終了を行うためのsession
    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
        
        // sessionを保持し、アセスメントモード終了の途中で解放しないようにしておく
        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()
    }
}

// ライフサイクルのすべてのイベントはDelegateで通知される
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()
    }
} 

AACの開発におけるtips

  • Xcodeとアセスメントアプリケーションがデッドロックした場合
    • Macを再起動することでアセスメントモードは実行を停止する。すべてのシステムサービスはリブート時のリストあが保証されているため問題ない
  • AACフレームワークはMacOS, iOS, iPadOSでも利用可能
  • さらにカスタマイズされたアセスメント体験を提供するには、AEAssessmentConfigurationを使用してAEAssessmentSessionを生成する
最新情報をチェックしよう!