Aegix Global, LLC

AIM iOS — VPAT 2.5

Aegix Platform — Safety and Incident Management · Last reviewed 2026-04-03

Last reviewed 2026-04-03

Voluntary Product Accessibility Template (VPAT) 2.5

Aegix AIM iOS Application

FieldValue
**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

StandardIncluded
WCAG 2.1 Level A & AAYes
Section 508 (Revised)Yes
EN 301 549 Chapter 11 (Mobile)Yes

Conformance Level Definitions

TermDescription
**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

CriterionConformanceRemarks
**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 ApplicableApp does not present prerecorded audio/video content.
**1.2.2 Captions (A)**Not ApplicableNo prerecorded video content.
**1.2.3 Audio Description (A)**Not ApplicableNo prerecorded video content.
**1.2.4 Captions Live (AA)**Not ApplicableNo live audio/video.
**1.2.5 Audio Description (AA)**Not ApplicableNo prerecorded video.
**1.3.1 Info and Relationships (A)**Partially SupportsSemantic 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 SupportsUIKit default reading order is generally correct. No custom `accessibilityElements` ordering defined yet for complex layouts.
**1.3.3 Sensory Characteristics (A)**Partially SupportsConnectionBannerView 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)**SupportsNo orientation locks detected in code.
**1.3.5 Identify Input Purpose (AA)**SupportsLogin 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 SupportsConnectionBannerView 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 SupportsChat 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 SupportsConnectionBannerView 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 SupportsDynamic 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)**SupportsApp uses rendered text via UILabel, not images of text.
**1.4.10 Reflow (AA)**Partially SupportsDynamic 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 SupportsStandard 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 SupportNo support for user-adjusted text spacing yet.
**1.4.13 Content on Hover or Focus (AA)**Partially SupportsStandard UIKit tooltips and popovers used.

Principle 2: Operable

CriterionConformanceRemarks
**2.1.1 Keyboard (A)**Partially SupportsStandard 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)**SupportsNo keyboard traps detected. Standard UIKit navigation.
**2.1.4 Character Key Shortcuts (A)**SupportsNo single-character keyboard shortcuts.
**2.2.1 Timing Adjustable (A)**Partially SupportsConnectionBannerView animation respects `isReduceMotionEnabled` - when enabled, banner appears/disappears instantly without animation.
**2.2.2 Pause, Stop, Hide (A)**SupportsNo auto-updating or moving content in UI.
**2.3.1 Three Flashes (A)**SupportsNo flashing content.
**2.4.1 Bypass Blocks (A)**Partially SupportsTab bar provides section navigation. Section headers now have `.header` trait for VoiceOver rotor navigation.
**2.4.2 Page Titled (A)**Partially SupportsNavigation bar titles set in most ViewControllers. TopBarView titles visible to VoiceOver.
**2.4.3 Focus Order (A)**Partially SupportsDefault UIKit focus order follows view hierarchy. Chat message cells now group children properly.
**2.4.4 Link Purpose (A)**Partially SupportsIcon-only buttons (share, send, attachment, map controls) now have descriptive `accessibilityLabel` and `accessibilityHint` properties.
**2.4.5 Multiple Ways (AA)**SupportsTab bar, search, and direct navigation provide multiple paths.
**2.4.6 Headings and Labels (AA)**Partially SupportsSection 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 SupportsUIKit provides default focus indicators. Custom views still lack visible focus states.
**2.5.1 Pointer Gestures (A)**Partially SupportsMost interactions are single-tap. Map SDK provides built-in alternatives.
**2.5.2 Pointer Cancellation (A)**SupportsUIKit default touch-up-inside pattern.
**2.5.3 Label in Name (A)**Partially SupportsSafety-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)**SupportsNo motion-based interactions.
**2.5.5 Target Size (AAA / EN 301 549)**Partially SupportsAlertInProgressViewController 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

CriterionConformanceRemarks
**3.1.1 Language of Page (A)**Partially SupportsApp uses Localize_Swift for i18n. `accessibilityLanguage` not yet set per-element.
**3.1.2 Language of Parts (AA)**Does Not SupportMulti-language content does not set `accessibilityLanguage` per element.
**3.2.1 On Focus (A)**SupportsNo context changes on focus.
**3.2.2 On Input (A)**SupportsForm inputs do not trigger unexpected changes.
**3.2.3 Consistent Navigation (AA)**SupportsTab bar and TopBarView patterns consistent.
**3.2.4 Consistent Identification (AA)**SupportsUI components consistent across screens.
**3.3.1 Error Identification (A)**Partially SupportsAlertStartViewController 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 SupportsLogin 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 SupportsLogin provides error messages. Admin forms may suggest corrections.
**3.3.4 Error Prevention (AA)**Partially SupportsAlert start/end requires confirmation. Confirmation checkbox for ending alerts with unsafe people.

Principle 4: Robust

CriterionConformanceRemarks
**4.1.1 Parsing (A)**SupportsNative iOS app; no HTML parsing issues.
**4.1.2 Name, Role, Value (A)**Partially SupportsCustom 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

CriterionConformanceRemarks
**302.1 Without Vision**Partially SupportsSafety-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 SupportsDynamic 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 SupportsConnection 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**SupportsApp is primarily visual. Notifications use visual + haptic feedback.
**302.5 With Limited Hearing**SupportsNo audio-only content.
**302.6 Without Speech**SupportsNo voice input required.
**302.7 With Limited Manipulation**Partially SupportsMultiple 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 SupportsStandard 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 SupportsApp supports 10+ languages. Alert workflows follow logical steps. Error messages announced via VoiceOver.

Table 3: EN 301 549 Chapter 11 - Mobile-Specific Criteria

CriterionConformanceRemarks
**11.1.1.1 Non-text Content**Partially SupportsText alternatives added to safety-critical interactive elements. See WCAG 1.1.1 remarks.
**11.1.3.1 Info and Relationships**Partially SupportsSection headers now have `.header` trait. Chat messages grouped semantically. See WCAG 1.3.1.
**11.1.3.4 Orientation**SupportsNo orientation lock.
**11.1.4.3 Contrast (Minimum)**Partially SupportsConnectionBannerView contrast fixed. See WCAG 1.4.3.
**11.1.4.4.1 Resize Text (Mobile)**Partially SupportsDynamic Type infrastructure created. Key labels configured. Bulk migration pending.
**11.1.4.10 Reflow**Partially SupportsLayout responds to content size changes via BaseViewController. Full reflow not yet verified.
**11.2.1.1 Keyboard (Platform)**Partially SupportsStandard UIKit keyboard navigation. DatePicker and checkbox accessible via VoiceOver.
**11.2.1.4.1 Character Key Shortcuts**SupportsNo character shortcuts.
**11.2.5.1 Pointer Gestures**Partially SupportsMostly single-tap. Map SDK has alternatives.
**11.2.5.3 Label in Name**Partially SupportsSafety-critical controls now have accessible names matching visual purpose.
**11.4.1.2 Name, Role, Value**Partially SupportsCustom 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 SupportsApp 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 SupportsObject 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 SupportsLogin form fields have `accessibilityLabel` and `textContentType`. DatePickerTextField has label and hint.
**11.5.2.9 Parent-Child Relationships**Partially SupportsChat message cells use `shouldGroupAccessibilityChildren`. UIKit table views provide default semantics.
**11.5.2.11 List of Available Actions**Does Not SupportNo `accessibilityCustomActions` defined yet.
**11.5.2.12 Execution of Available Actions**Partially SupportsStandard UIKit controls activatable via VoiceOver. Custom checkboxes now have proper traits.
**11.5.2.13 Tracking of Focus**Partially SupportsUIKit 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 SupportsStandard UIKit controls allow modification. Radio buttons and checkboxes now expose state via accessibilityValue.
**11.5.2.17 Modifications (Status)**Partially SupportsPolice status changes, connection status, and error states now announced to assistive technology.
**11.7 User Preferences**Partially SupportsApp 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 ApplicableApp is not an authoring tool.

Overall Conformance Summary

StandardLevelConformance
WCAG 2.1 Level A30 criteriaPartially Supports (5/30 fail, 17/30 partial, 8/30 supports)
WCAG 2.1 Level AA20 criteriaPartially Supports (2/20 fail, 13/20 partial, 5/20 supports)
Section 508 FPC9 criteriaPartially Supports (0/9 fail, 6/9 partial, 3/9 supports)
EN 301 549 Ch. 1120+ criteriaPartially Supports (1/20 fail, 14/20 partial, 5/20 supports)

Changes from Previous Assessment

  1. **UIAccessibility API usage** - `accessibilityLabel`, `accessibilityTraits`, `accessibilityHint`, `accessibilityValue`, and `UIAccessibility.post(notification:)` added across all safety-critical screens (alert, login, chat, map)
  2. **Dynamic Type infrastructure** - `UIFont+Accessibility.swift` extension created with `scaledFont` and `enableDynamicType` methods; `adjustsFontForContentSizeCategory` enabled on key labels
  3. **VoiceOver announcements** - Police status changes, connection status, error messages, and badge updates now announced
  4. **Touch targets** - Share button (24→44pt), radio buttons (24→44pt), checkbox (20→44pt), map controls set to 44pt minimum
  5. **Color contrast** - ConnectionBannerView text changed from white-on-orange (3.1:1) to black-on-orange (5.7:1)
  6. **Non-color indicators** - ConnectionBannerView now includes `wifi.slash` icon; alert cells include text status
  7. **Reduced motion** - ConnectionBannerManager respects `isReduceMotionEnabled`
  8. **Input purpose** - Login fields declare `textContentType` for autofill
  9. **Semantic grouping** - Chat messages grouped; section headers have `.header` trait
  10. **Accessibility helpers** - `UIView+Accessibility.swift` with `AccessibleButton`, `configureAsAccessibilityGroup`, announcement helpers

Remaining Gaps

  1. **Bulk Dynamic Type migration** - All 307 Swift files still need font sizes migrated to use `scaledFont` / `UIFontMetrics`
  2. **Admin/Report screen labels** - Some ViewControllers in admin, report, and sources modules need accessibility labels
  3. **Text spacing (WCAG 1.4.12)** - No user text spacing support
  4. **accessibilityLanguage** - Multi-language content not tagged per-element
  5. **accessibilityCustomActions** - Long-press and swipe actions not exposed
  6. **Full contrast audit** - All 27 color asset pairings need manual verification
  7. **Full VoiceOver manual testing** - Automated implementation needs manual VoiceOver validation on physical device

View this document’s source in Git ↗