Aegix Global, LLC
AIM iOS — VPAT 2.5
Last reviewed 2026-04-03Voluntary Product Accessibility Template (VPAT) 2.5
Aegix AIM iOS Application
| Field | Value |
|---|---|
| **Product** | Aegix AIM (Alert & Incident Management) for iOS |
| **Version** | Current as of 2026-04-07 |
| **Report Date** | 2026-04-07 |
| **Last Updated** | 2026-04-07 (Post-remediation) |
| **VPAT Version** | 2.5 (WCAG 2.1 Edition) |
| **Evaluation Method** | Static code analysis of Swift source, XIB/Storyboard review |
| **Contact** | Aegix Global |
Applicable Standards
| Standard | Included |
|---|---|
| WCAG 2.1 Level A & AA | Yes |
| Section 508 (Revised) | Yes |
| EN 301 549 Chapter 11 (Mobile) | Yes |
Conformance Level Definitions
| Term | Description |
|---|---|
| **Supports** | Fully meets the criterion |
| **Partially Supports** | Some functionality meets the criterion |
| **Does Not Support** | Majority of functionality fails the criterion |
| **Not Applicable** | Criterion does not apply |
Table 1: WCAG 2.1 Level A & AA
Principle 1: Perceivable
| Criterion | Conformance | Remarks |
|---|---|---|
| **1.1.1 Non-text Content (A)** | Partially Supports | `accessibilityLabel` properties have been added to all safety-critical interactive elements across alert screens (AlertInProgressViewController, AlertStartViewController, AlertEndViewController), login screen, chat composition bar (attach, send, delete audio buttons), map controls (add point, cancel, search), and tab bar badges. Icon-only buttons (share, send, attachment, map controls) now have descriptive labels. Splash screen logo has image accessibility label. Remaining work: some admin and report screen buttons may still need labels. |
| **1.2.1 Audio-only/Video-only (A)** | Not Applicable | App does not present prerecorded audio/video content. |
| **1.2.2 Captions (A)** | Not Applicable | No prerecorded video content. |
| **1.2.3 Audio Description (A)** | Not Applicable | No prerecorded video content. |
| **1.2.4 Captions Live (AA)** | Not Applicable | No live audio/video. |
| **1.2.5 Audio Description (AA)** | Not Applicable | No prerecorded video. |
| **1.3.1 Info and Relationships (A)** | Partially Supports | Semantic grouping has been improved: section headers in AlertViewController (alertDeactiveTitleHeader, alertActiveTitleHeader, alertDrillActiveTitleHeader) now have `.header` accessibility trait. Alert title labels have `.header` trait. Chat message cells use `shouldGroupAccessibilityChildren` to group sender, timestamp, and message as a single element. Table cells in AlertSchoolCell and AlertSchoolActiveCell expose status information alongside school name. Remaining: some admin and report screen sections may need additional header traits. |
| **1.3.2 Meaningful Sequence (A)** | Partially Supports | UIKit default reading order is generally correct. No custom `accessibilityElements` ordering defined yet for complex layouts. |
| **1.3.3 Sensory Characteristics (A)** | Partially Supports | ConnectionBannerView now includes a `wifi.slash` icon alongside the orange background color, providing a non-color indicator. Alert active cells include text status (“Alert in progress” / “Drill in progress”) in accessibility label alongside color indicator. |
| **1.3.4 Orientation (AA)** | Supports | No orientation locks detected in code. |
| **1.3.5 Identify Input Purpose (AA)** | Supports | Login text fields now declare `textContentType`: `.emailAddress` for email, `.password` for password, `.givenName` for first name, `.familyName` for last name, `.telephoneNumber` for phone. This enables autofill and assistive technology identification. |
| **1.4.1 Use of Color (A)** | Partially Supports | ConnectionBannerView now uses a `wifi.slash` icon alongside the orange background. AlertSchoolActiveCell exposes “Alert in progress” / “Drill in progress” text via accessibility label, not just red/blue color. Police status in AlertInProgressViewController is announced via VoiceOver with text. |
| **1.4.2 Audio Control (A)** | Partially Supports | Chat audio playback has play/pause controls. Alert sounds managed by system notifications. No auto-playing audio without stop mechanism. |
| **1.4.3 Contrast Minimum (AA)** | Partially Supports | ConnectionBannerView updated from white-on-orange (~3.1:1) to black-on-orange (~5.7:1), meeting AA minimum of 4.5:1. UIKit default controls meet contrast requirements. Remaining: full audit of all 27 color asset pairings not yet completed. |
| **1.4.4 Resize Text (AA)** | Partially Supports | Dynamic Type infrastructure created: `UIFont+Accessibility.swift` extension provides `scaledFont` and `enableDynamicType` methods for UILabel, UITextField, and UITextView. `adjustsFontForContentSizeCategory` enabled on alert title labels. BaseViewController now responds to `preferredContentSizeCategory` changes. Remaining: migration of all 307 files from fixed font sizes to Dynamic Type-aware fonts. |
| **1.4.5 Images of Text (AA)** | Supports | App uses rendered text via UILabel, not images of text. |
| **1.4.10 Reflow (AA)** | Partially Supports | Dynamic Type infrastructure enables future reflow support. BaseViewController triggers layout updates on content size changes. Full reflow at 200% zoom not yet verified for all screens. |
| **1.4.11 Non-text Contrast (AA)** | Partially Supports | Standard UIKit controls meet contrast. Touch targets for share button increased from 24x24 to 44x44pt with proper insets. Radio buttons and checkboxes in AlertEndViewController increased to 44x44pt. |
| **1.4.12 Text Spacing (AA)** | Does Not Support | No support for user-adjusted text spacing yet. |
| **1.4.13 Content on Hover or Focus (AA)** | Partially Supports | Standard UIKit tooltips and popovers used. |
Principle 2: Operable
| Criterion | Conformance | Remarks |
|---|---|---|
| **2.1.1 Keyboard (A)** | Partially Supports | Standard UIKit controls support keyboard/switch control. DatePickerTextField now has proper accessibility traits and hint for VoiceOver activation. Confirmation checkbox label tap gesture in AlertEndViewController works alongside VoiceOver. Remaining: some custom gesture recognizers in tutorial and chat mention views may need keyboard alternatives. |
| **2.1.2 No Keyboard Trap (A)** | Supports | No keyboard traps detected. Standard UIKit navigation. |
| **2.1.4 Character Key Shortcuts (A)** | Supports | No single-character keyboard shortcuts. |
| **2.2.1 Timing Adjustable (A)** | Partially Supports | ConnectionBannerView animation respects `isReduceMotionEnabled` - when enabled, banner appears/disappears instantly without animation. |
| **2.2.2 Pause, Stop, Hide (A)** | Supports | No auto-updating or moving content in UI. |
| **2.3.1 Three Flashes (A)** | Supports | No flashing content. |
| **2.4.1 Bypass Blocks (A)** | Partially Supports | Tab bar provides section navigation. Section headers now have `.header` trait for VoiceOver rotor navigation. |
| **2.4.2 Page Titled (A)** | Partially Supports | Navigation bar titles set in most ViewControllers. TopBarView titles visible to VoiceOver. |
| **2.4.3 Focus Order (A)** | Partially Supports | Default UIKit focus order follows view hierarchy. Chat message cells now group children properly. |
| **2.4.4 Link Purpose (A)** | Partially Supports | Icon-only buttons (share, send, attachment, map controls) now have descriptive `accessibilityLabel` and `accessibilityHint` properties. |
| **2.4.5 Multiple Ways (AA)** | Supports | Tab bar, search, and direct navigation provide multiple paths. |
| **2.4.6 Headings and Labels (AA)** | Partially Supports | Section headers in alert screens now use `.header` accessibility trait. Alert title labels marked as headers. Guidance title labels marked as headers. Remaining: admin and report screen section headers. |
| **2.4.7 Focus Visible (AA)** | Partially Supports | UIKit provides default focus indicators. Custom views still lack visible focus states. |
| **2.5.1 Pointer Gestures (A)** | Partially Supports | Most interactions are single-tap. Map SDK provides built-in alternatives. |
| **2.5.2 Pointer Cancellation (A)** | Supports | UIKit default touch-up-inside pattern. |
| **2.5.3 Label in Name (A)** | Partially Supports | Safety-critical controls now have `accessibilityLabel` matching their visual purpose: “Start alert”, “Start drill”, “End alert”, “Share alert details”, “Send message”, “Attach file”, etc. |
| **2.5.4 Motion Actuation (A)** | Supports | No motion-based interactions. |
| **2.5.5 Target Size (AAA / EN 301 549)** | Partially Supports | AlertInProgressViewController share button increased from 24x24 to 44x44pt. AlertEndViewController radio buttons increased from 24x24 to 44x44pt. Confirmation checkbox increased from 20x20 to 44x44pt. Map addMapPointButton and cancelButton set to 44x44pt. Remaining: some smaller controls in admin/report screens. |
Principle 3: Understandable
| Criterion | Conformance | Remarks |
|---|---|---|
| **3.1.1 Language of Page (A)** | Partially Supports | App uses Localize_Swift for i18n. `accessibilityLanguage` not yet set per-element. |
| **3.1.2 Language of Parts (AA)** | Does Not Support | Multi-language content does not set `accessibilityLanguage` per element. |
| **3.2.1 On Focus (A)** | Supports | No context changes on focus. |
| **3.2.2 On Input (A)** | Supports | Form inputs do not trigger unexpected changes. |
| **3.2.3 Consistent Navigation (AA)** | Supports | Tab bar and TopBarView patterns consistent. |
| **3.2.4 Consistent Identification (AA)** | Supports | UI components consistent across screens. |
| **3.3.1 Error Identification (A)** | Partially Supports | AlertStartViewController error label now triggers VoiceOver announcement when displayed. Login error handling improved. Remaining: not all form validation errors announced. |
| **3.3.2 Labels or Instructions (A)** | Partially Supports | Login text fields now have `accessibilityLabel` properties that persist when placeholder text disappears. DatePickerTextField has accessibility label and hint. |
| **3.3.3 Error Suggestion (AA)** | Partially Supports | Login provides error messages. Admin forms may suggest corrections. |
| **3.3.4 Error Prevention (AA)** | Partially Supports | Alert start/end requires confirmation. Confirmation checkbox for ending alerts with unsafe people. |
Principle 4: Robust
| Criterion | Conformance | Remarks |
|---|---|---|
| **4.1.1 Parsing (A)** | Supports | Native iOS app; no HTML parsing issues. |
| **4.1.2 Name, Role, Value (A)** | Partially Supports | Custom accessibility names (`accessibilityLabel`) now set on all safety-critical elements. Roles declared via `accessibilityTraits` (.button, .header, .image, .staticText). Radio buttons in AlertEndViewController expose state via `accessibilityValue` (“Selected”/“Not selected”). Confirmation checkbox exposes state (“Checked”/“Unchecked”). Alert school cells expose alert status. Remaining: some admin/report custom controls need trait declarations. |
| **4.1.3 Status Messages (AA)** | Partially Supports | `UIAccessibility.post(notification:)` calls added for: police status changes (AlertInProgressViewController), connection status changes (ConnectionBannerManager show/hide), error display (AlertStartViewController), tab bar badge updates. Remaining: chat message arrival announcements, form submission results. |
Table 2: Section 508 Functional Performance Criteria
| Criterion | Conformance | Remarks |
|---|---|---|
| **302.1 Without Vision** | Partially Supports | Safety-critical alert functions (start, manage, end) are now operable with VoiceOver. `accessibilityLabel` properties added to all alert screen buttons, login fields, chat composition controls, and map controls. Chat messages grouped for coherent reading. Police status changes announced. Remaining: full VoiceOver audit of admin/report screens. |
| **302.2 With Limited Vision** | Partially Supports | Dynamic Type infrastructure created (`UIFont+Accessibility.swift`) with `scaledFont` and `enableDynamicType` methods. `adjustsFontForContentSizeCategory` enabled on key labels. BaseViewController responds to content size category changes. Connection banner contrast improved to 5.7:1. Remaining: bulk migration of all font sizes to Dynamic Type. |
| **302.3 Without Perception of Color** | Partially Supports | Connection banner now includes `wifi.slash` icon (non-color indicator). Active alert cells include text status in accessibility labels. Police status exposed as text. Remaining: some status indicators may still rely on color alone. |
| **302.4 Without Hearing** | Supports | App is primarily visual. Notifications use visual + haptic feedback. |
| **302.5 With Limited Hearing** | Supports | No audio-only content. |
| **302.6 Without Speech** | Supports | No voice input required. |
| **302.7 With Limited Manipulation** | Partially Supports | Multiple touch targets increased to 44x44pt minimum: share button (was 24x24), radio buttons (were 24x24), checkbox (was 20x20), map controls. Remaining: some smaller controls in admin screens. |
| **302.8 With Limited Reach and Strength** | Partially Supports | Standard iOS assistive touch and switch control available. DatePickerTextField has proper VoiceOver traits. Reduced motion support added to ConnectionBannerManager. |
| **302.9 With Limited Language, Cognitive, and Learning Abilities** | Partially Supports | App supports 10+ languages. Alert workflows follow logical steps. Error messages announced via VoiceOver. |
Table 3: EN 301 549 Chapter 11 - Mobile-Specific Criteria
| Criterion | Conformance | Remarks |
|---|---|---|
| **11.1.1.1 Non-text Content** | Partially Supports | Text alternatives added to safety-critical interactive elements. See WCAG 1.1.1 remarks. |
| **11.1.3.1 Info and Relationships** | Partially Supports | Section headers now have `.header` trait. Chat messages grouped semantically. See WCAG 1.3.1. |
| **11.1.3.4 Orientation** | Supports | No orientation lock. |
| **11.1.4.3 Contrast (Minimum)** | Partially Supports | ConnectionBannerView contrast fixed. See WCAG 1.4.3. |
| **11.1.4.4.1 Resize Text (Mobile)** | Partially Supports | Dynamic Type infrastructure created. Key labels configured. Bulk migration pending. |
| **11.1.4.10 Reflow** | Partially Supports | Layout responds to content size changes via BaseViewController. Full reflow not yet verified. |
| **11.2.1.1 Keyboard (Platform)** | Partially Supports | Standard UIKit keyboard navigation. DatePicker and checkbox accessible via VoiceOver. |
| **11.2.1.4.1 Character Key Shortcuts** | Supports | No character shortcuts. |
| **11.2.5.1 Pointer Gestures** | Partially Supports | Mostly single-tap. Map SDK has alternatives. |
| **11.2.5.3 Label in Name** | Partially Supports | Safety-critical controls now have accessible names matching visual purpose. |
| **11.4.1.2 Name, Role, Value** | Partially Supports | Custom controls now expose name (accessibilityLabel), role (accessibilityTraits), and value (accessibilityValue) for alert screens, login, chat, and map. See WCAG 4.1.2. |
| **11.5.2.3 Use of Accessibility Services** | Partially Supports | App now uses UIAccessibility API: `accessibilityLabel`, `accessibilityTraits`, `accessibilityHint`, `accessibilityValue`, `accessibilityElement`, `shouldGroupAccessibilityChildren`, and `UIAccessibility.post(notification:)` across safety-critical screens. `traitCollectionDidChange` responds to Dynamic Type, contrast, and bold text changes. |
| **11.5.2.5 Object Information** | Partially Supports | Object names, roles, states now programmatically determined for safety-critical views. Custom views (ConnectionBannerView, chat cells, alert cells) expose accessibility information. |
| **11.5.2.7 Values** | Partially Supports | `accessibilityValue` now used for: radio buttons (Selected/Not selected), checkbox (Checked/Unchecked), police status, alert cell status. |
| **11.5.2.8 Label Relationships** | Partially Supports | Login form fields have `accessibilityLabel` and `textContentType`. DatePickerTextField has label and hint. |
| **11.5.2.9 Parent-Child Relationships** | Partially Supports | Chat message cells use `shouldGroupAccessibilityChildren`. UIKit table views provide default semantics. |
| **11.5.2.11 List of Available Actions** | Does Not Support | No `accessibilityCustomActions` defined yet. |
| **11.5.2.12 Execution of Available Actions** | Partially Supports | Standard UIKit controls activatable via VoiceOver. Custom checkboxes now have proper traits. |
| **11.5.2.13 Tracking of Focus** | Partially Supports | UIKit manages focus tracking. VoiceOver announcements added for state changes. |
| **11.5.2.15 Change Notification** | Partially Supports | `UIAccessibility.post(notification:)` now used for police status changes, connection status, error display, and badge updates. |
| **11.5.2.16 Modifications** | Partially Supports | Standard UIKit controls allow modification. Radio buttons and checkboxes now expose state via accessibilityValue. |
| **11.5.2.17 Modifications (Status)** | Partially Supports | Police status changes, connection status, and error states now announced to assistive technology. |
| **11.7 User Preferences** | Partially Supports | App now responds to iOS accessibility preferences: Dynamic Type (via UIFontMetrics infrastructure), bold text, increased contrast (via traitCollectionDidChange), and reduced motion (ConnectionBannerManager). Theme (light/dark/system) observed. Remaining: full font migration for Dynamic Type. |
| **11.8 Authoring Tools** | Not Applicable | App is not an authoring tool. |
Overall Conformance Summary
| Standard | Level | Conformance |
|---|---|---|
| WCAG 2.1 Level A | 30 criteria | Partially Supports (5/30 fail, 17/30 partial, 8/30 supports) |
| WCAG 2.1 Level AA | 20 criteria | Partially Supports (2/20 fail, 13/20 partial, 5/20 supports) |
| Section 508 FPC | 9 criteria | Partially Supports (0/9 fail, 6/9 partial, 3/9 supports) |
| EN 301 549 Ch. 11 | 20+ criteria | Partially Supports (1/20 fail, 14/20 partial, 5/20 supports) |
Changes from Previous Assessment
- **UIAccessibility API usage** - `accessibilityLabel`, `accessibilityTraits`, `accessibilityHint`, `accessibilityValue`, and `UIAccessibility.post(notification:)` added across all safety-critical screens (alert, login, chat, map)
- **Dynamic Type infrastructure** - `UIFont+Accessibility.swift` extension created with `scaledFont` and `enableDynamicType` methods; `adjustsFontForContentSizeCategory` enabled on key labels
- **VoiceOver announcements** - Police status changes, connection status, error messages, and badge updates now announced
- **Touch targets** - Share button (24→44pt), radio buttons (24→44pt), checkbox (20→44pt), map controls set to 44pt minimum
- **Color contrast** - ConnectionBannerView text changed from white-on-orange (3.1:1) to black-on-orange (5.7:1)
- **Non-color indicators** - ConnectionBannerView now includes `wifi.slash` icon; alert cells include text status
- **Reduced motion** - ConnectionBannerManager respects `isReduceMotionEnabled`
- **Input purpose** - Login fields declare `textContentType` for autofill
- **Semantic grouping** - Chat messages grouped; section headers have `.header` trait
- **Accessibility helpers** - `UIView+Accessibility.swift` with `AccessibleButton`, `configureAsAccessibilityGroup`, announcement helpers
Remaining Gaps
- **Bulk Dynamic Type migration** - All 307 Swift files still need font sizes migrated to use `scaledFont` / `UIFontMetrics`
- **Admin/Report screen labels** - Some ViewControllers in admin, report, and sources modules need accessibility labels
- **Text spacing (WCAG 1.4.12)** - No user text spacing support
- **accessibilityLanguage** - Multi-language content not tagged per-element
- **accessibilityCustomActions** - Long-press and swipe actions not exposed
- **Full contrast audit** - All 27 color asset pairings need manual verification
- **Full VoiceOver manual testing** - Automated implementation needs manual VoiceOver validation on physical device