# ios-application-dev

> A Claude Code skill from MiniMax-AI's skills repo for iOS development across UIKit, SnapKit, and SwiftUI — touch targets, safe areas, navigation, Dynamic Type, Dark Mode, accessibility, collection views, and the Apple HIG-compliance checks that catch a deck of UI sins before App Review does.

**Use case**: Build an iOS UI that respects HIG, Dynamic Type, Dark Mode, and accessibility from the first commit

**Canonical URL**: https://agentcookbooks.com/skills/ios-application-dev/

**Topics**: claude-code, skills, mobile, ios

**Trigger phrases**: "build an iOS UI", "SwiftUI navigation", "iOS accessibility audit"

**Source**: [MiniMax-AI](https://github.com/MiniMax-AI/skills/tree/main/skills/ios-application-dev)

**License**: MIT

---

## What it does

`ios-application-dev` is the iOS skill in [MiniMax-AI's skills repo](https://github.com/MiniMax-AI/skills) — a UIKit + SnapKit + SwiftUI development guide that opens with two parallel quick-reference tables. UIKit on the left (`UITabBarController`, `UINavigationController`, `UICollectionView` + `DiffableDataSource`, `UIContextMenuInteraction`, `CLLocationButton`, `UIImpactFeedbackGenerator`, semantic colors), SwiftUI on the right (`TabView`, `NavigationStack`, `.sheet` + `presentationDetents`, `.searchable`, `ShareLink`, `LocationButton`, `@Environment(\.scenePhase)`). Picking the right component for the user's navigation pattern is the first move; the rest of the skill builds on that pick.

Core principles run through layout (44 pt touch targets, safe areas, 8 pt spacing increments, primary actions in the thumb zone, support iPhone SE through Pro Max), typography (`preferredFont(forTextStyle:)` + `adjustsFontForContentSizeCategory = true` for UIKit; semantic styles for SwiftUI; `UIFontMetrics` / `Font.custom(_:size:relativeTo:)` for custom fonts), colors (semantic system colors, asset-catalog Dark variants, no color-only information, 4.5:1 contrast), accessibility (icon-button labels, `accessibilityReduceMotion` respected, logical reading order, Bold Text and Increase Contrast preferences honored), navigation (tab bars stay visible, never override system gestures, never use hamburger menus on iPhone), and privacy (in-context permission requests, custom explanation before system dialog, Sign in with Apple, ATT denial respected).

The closing section is a layout / typography / colors / accessibility / navigation / privacy checklist — the items run as a pre-flight check before any code is considered done.

## When to use it

- Building an iOS app — pure SwiftUI, pure UIKit + SnapKit, or a hybrid where SwiftUI hosts UIKit views
- Picking between similar components (sheet vs full-screen modal vs navigation push, list vs grid, alert vs context menu) where the HIG nuance matters
- Dynamic Type / Dark Mode / accessibility audit before App Store submission
- Implementing system-permission flows (camera, location, notifications, ATT) without burning user trust
- Designing for the full iPhone size range (SE 375 pt → Pro Max 430 pt) without hardcoded magic numbers

When *not* to reach for it:

- macOS, visionOS, or watchOS — the platform HIG diverges enough that this skill's iPhone-shaped guidance misleads
- iPad-specific (Stage Manager, multi-column layouts, pencil + keyboard)— the skill is iPhone-first; iPad needs separate guidance
- React Native or Flutter on iOS — `react-native-dev` and `flutter-dev` are the right skills
- Game UI built on Metal / SpriteKit / SceneKit — the skill is UIKit/SwiftUI-shaped

## Install

From [MiniMax-AI/skills](https://github.com/MiniMax-AI/skills) at `skills/ios-application-dev/`. Drop into `~/.claude/skills/ios-application-dev/`. Plugin marketplace install: `claude plugin marketplace add https://github.com/MiniMax-AI/skills` then `claude plugin install minimax-skills` (pulls the whole MiniMax bundle).

The toolchain expectations live outside the skill: Xcode 15+, Swift 5.9+, iOS 17 SDK as a baseline. SnapKit ships as the constraint DSL of choice in the UIKit examples; pure NSLayoutAnchor is acceptable as a substitute.

## What a session looks like

1. **Component pick.** Skill consults the UIKit / SwiftUI quick-reference tables and chooses the right component for the navigation pattern (e.g. `TabView` + `NavigationStack` for a multi-section drill-down, `.sheet` + `presentationDetents` for a focused subtask).
2. **Layout pass.** 44 pt touch targets, content within safe areas (or `.ignoresSafeArea()` only for backgrounds), 8 pt grid spacing, primary actions in the thumb zone, flexible widths from SE to Pro Max.
3. **Typography pass.** Semantic text styles (`.body`, `.headline`, `.caption`) or `UIFontMetrics`-scaled custom fonts so Dynamic Type works. Layout reflows at accessibility sizes — no truncation.
4. **Colors pass.** Semantic system colors (`.systemBackground`, `.label`, `.primary`, `.secondary`) so Dark Mode works automatically. Custom colors land in the asset catalog with Any/Dark Appearance variants. No color-only information.
5. **Accessibility pass.** `.accessibilityLabel()` on icon buttons, `@Environment(\.accessibilityReduceMotion)` respected, logical reading order, support Bold Text and Increase Contrast.
6. **Navigation pass.** Tab bar stays visible during navigation, system back-swipe never overridden, state preserved across tabs (`@SceneStorage`, `@State`).
7. **Privacy pass.** Permissions requested in-context (not at launch), with a custom explanation before the system dialog. Sign in with Apple offered alongside other auth. ATT denial respected.
8. **Checklist runtime.** Skill's per-section checklist runs as a pre-flight before declaring the screen done.

The discipline that makes it work: the parallel quick-reference table forces a deliberate component pick, and the per-section checklist makes it hard for the agent to declare something "shipped" while skipping the Dynamic Type / Dark Mode / accessibility pass.

## Receipts

_TODO — to be filled in from a real session. Once the skill has been pointed at a real iOS project, this section will capture: which UIKit-vs-SwiftUI pick the skill made for the navigation pattern, whether the Dynamic Type pass actually held up at the largest accessibility size (most common failure mode: hardcoded `.frame(width:)` that truncates), and whether the in-context permission flow shipped without an out-of-context system dialog at launch._

## Source and attribution

From [MiniMax-AI's skills repository](https://github.com/MiniMax-AI/skills/tree/main/skills/ios-application-dev), an MIT-licensed skill collection. The skill cites Apple's Human Interface Guidelines and Apple Developer Documentation as its sources.

License: MIT.

The wedge over a generic "iOS dev" agent: parallel UIKit + SwiftUI quick-reference tables instead of picking a side, plus the explicit pre-flight checklist that catches HIG-compliance issues before App Review does. The "no hamburger menus on iPhone" rule, the "primary actions in thumb zone" rule, and the "permissions in-context with custom explanation" rule are the patterns that separate apps approved on the first review pass from the ones that bounce.