Timeout Pressure

Status: ready

Symptom

The user loses the session, the cart or a half-filled form because time ran out before the task could be finished with assistive technology.

User fills a 20-field form with VoiceOver.
The session expires.
The app clears the form and shows the login screen.
A one-time code expires while the user switches to the password manager.
The app says only "Code expired".

Where it shows up

Banking, health, insurance, checkout, account recovery, two-factor authentication, government forms, appointment booking.

Why it blocks the task

The same form takes longer with VoiceOver, Switch Control, AX5 text or a cognitive disability. A timeout tuned for a fast touch user cuts those users off in the middle. Losing the input makes the next attempt longer, so the next timeout comes even earlier. The user isn't slowed down, they're punished for using a slower path.

Root cause

The timeout was set for the average touch user.

  1. No warning before the timeout.
  2. No way to extend, even where policy allows it.
  3. Draft input isn't saved.
  4. The message doesn't say what happened or what was kept.
  5. The countdown is visual only.
  6. "Security" is used as a blanket reason instead of designing a recovery.

Before

if sessionExpired {
    clearForm()
    showLogin()
}

Fix

Verdict: warn at least 2 minutes before expiry, with an action to extend. Save what policy allows. After expiry, say what was kept.

Why: the warning gives the slower path the time it needs. Saved input means a timeout costs one login, not the whole form.

The warning is a real view with real buttons, not a toast:

VStack(alignment: .leading) {
    Text("Your session ends in 2 minutes.")
    Button("Stay signed in") { extendSession() }
    Button("Save and sign out") { saveDraftAndSignOut() }
}
.accessibilityElement(children: .contain)
.onAppear {
    AccessibilityNotification.Announcement("Your session ends in 2 minutes.").post()
}

After expiry:

draftStore.save(form.nonSensitiveFields)
showLogin(message: "You were signed out after 15 minutes. Your form is saved.")

For banking and health, decide with security what's allowed:

Extend after re-authentication (Face ID), not silently.
Save non-sensitive fields, never card numbers or passwords.
Hold a selected appointment slot for 5 minutes.
Put "Resend code" next to "Code expired".

Accessibility and security are both real requirements. The answer is a recovery path that satisfies both, not choosing one.

Check

Profile:   VoiceOver + Larger Text AX3
Task:      fill the long form slowly until the warning appears
Expected:  the warning is announced
           "Stay signed in" works
           after expiry, allowed fields are restored after login
Profile:   Switch Control
Task:      let a one-time code expire, then recover
Expected:  "Code expired" is followed by a reachable "Resend code"
           other progress is kept

WCAG mapping

  1. 2.2.1 Timing Adjustable: the user can turn off, adjust or extend a time limit.
  2. 2.2.6 Timeouts (AAA): the user is warned about data loss from inactivity.
  3. 3.3.4 Error Prevention: important submissions can be recovered.

App Store and product risk

Scanners don't find timeout problems. Users do, in the flows that matter most: payments, health, government services.

  1. Time Extension
  2. Evidence Based Release
  1. Chapter 7
  2. Chapter 9
  3. Chapter 13
  4. Chapter 18

Sources

  1. W3C: Understanding SC 2.2.1 Timing Adjustable
  2. W3C: Understanding SC 2.2.6 Timeouts
  3. Apple Developer: AccessibilityNotification