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.
- No warning before the timeout.
- No way to extend, even where policy allows it.
- Draft input isn't saved.
- The message doesn't say what happened or what was kept.
- The countdown is visual only.
- "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
2.2.1 Timing Adjustable: the user can turn off, adjust or extend a time limit.2.2.6 Timeouts(AAA): the user is warned about data loss from inactivity.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.