CtrlK
BlogDocsLog inGet started
Tessl Logo

dpearson2699/swift-ios-skills

Agent skills for iOS, iPadOS, Swift, SwiftUI, and modern Apple framework development.

71

Quality

89%

Does it follow best practices?

Impact

No eval scenarios have been run

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

nutrition-labels.mdskills/ios-accessibility/references/

App Store Accessibility Nutrition Labels

App Store Connect lets you declare which accessibility features your app supports. These labels appear on your product page, helping users find apps that meet their needs.

Docs: Overview of Accessibility Nutrition Labels

The 9 Label Categories

LabelWhat It MeansKey Implementation
VoiceOverApp is fully navigable and usable with VoiceOverAll controls have accessibility labels; images have descriptions; custom views use accessibilityElement(children:)
Full Keyboard AccessApp supports complete keyboard navigationAll interactive elements are focusable; keyboard shortcuts for key actions; no touch-only gestures required
Switch ControlApp works with external switch devicesAll actions reachable through scanning; no timing-dependent interactions; custom actions via accessibilityCustomContent
Voice ControlApp responds to voice commandsAll buttons and controls have visible or accessibility labels matching voice command targets
Closed Captions / SDHMedia includes closed captions or subtitles for the deaf and hard of hearingAVPlayer content tagged with transcribesSpokenDialogForAccessibility and describesMusicAndSoundForAccessibility
Audio DescriptionsMedia includes narrated descriptions of visual contentAudio tracks tagged with describesVideoForAccessibility
Larger TextApp supports Dynamic Type at all sizesAll text uses UIFont.preferredFont(forTextStyle:) or SwiftUI's default text styles; layouts adapt without truncation through Accessibility XXL sizes
Reduce MotionApp respects the Reduce Motion settingCheck UIAccessibility.isReduceMotionEnabled or @Environment(\.accessibilityReduceMotion); provide non-animated alternatives
Increase ContrastApp respects the Increase Contrast settingUse semantic colors (system colors adapt automatically); check UIAccessibility.isDarkerSystemColorsEnabled for custom elements

Pass / Fail Criteria

To legitimately claim a label, your app must pass real testing with that assistive technology. Apple may audit these claims.

VoiceOver Pass Criteria

  • Every interactive element has a meaningful accessibilityLabel
  • Decorative images are hidden (accessibilityHidden(true) or .decorative)
  • Custom views expose children or combine into logical elements
  • No information is conveyed only through color, shape, or position
  • All alerts, toasts, and dynamic content are announced via UIAccessibility.post(notification:argument:)
  • Navigation order is logical (top-to-bottom, leading-to-trailing)

Full Keyboard Access Pass Criteria

  • All actions achievable without touch
  • Clear focus indicators visible on all interactive elements
  • Tab order follows visual layout
  • Keyboard shortcuts don't conflict with system shortcuts
  • No dead-end focus traps

Closed Captions Pass Criteria

  • All spoken dialog is captioned
  • Sound effects relevant to comprehension are described in brackets
  • Speaker identification is included when multiple speakers are present
  • Captions are synchronized with audio
  • Captions use AVMediaCharacteristic.transcribesSpokenDialogForAccessibility

Audio Descriptions Pass Criteria

  • Visual-only information (actions, scene changes, on-screen text) is narrated
  • Descriptions fit between dialog without overlapping
  • Audio description tracks tagged with AVMediaCharacteristic.describesVideoForAccessibility

Larger Text Pass Criteria

  • App uses Dynamic Type (preferred font text styles)
  • No text is clipped or truncated at Accessibility sizes (up to AX5)
  • ScrollViews accommodate expanded content
  • Images with text provide scaled alternatives

Reduce Motion Pass Criteria

  • @Environment(\.accessibilityReduceMotion) or UIAccessibility.isReduceMotionEnabled checked
  • Parallax, sliding, and spring animations replaced with fades or instant transitions
  • Auto-playing animations are paused or replaced with static content

Increase Contrast Pass Criteria

  • System semantic colors used (they auto-adapt)
  • Custom colors provide higher-contrast variants when accessibilityContrast == .high
  • Borders or other visual separators added for elements that rely on subtle color differences

SwiftUI Audit Example

struct ContentView: View {
    @Environment(\.accessibilityReduceMotion) private var reduceMotion
    @Environment(\.dynamicTypeSize) private var typeSize

    var body: some View {
        VStack {
            Image("hero")
                .accessibilityLabel("Mountain landscape at sunset")

            Text("Welcome")
                .font(.title)   // Uses Dynamic Type automatically

            Button("Get Started") { }
                .accessibilityHint("Opens the onboarding flow")
        }
        .animation(reduceMotion ? nil : .spring(), value: showContent)
    }
}

skills

CHANGELOG.md

README.md

tile.json