Free course

Build macOS Apps with SwiftUI Course

Build native Mac apps with SwiftUI windows, sidebars, menus, settings, local files, Keychain, menu bar extras, and reliable process integration.

5 modules · 25 lessons · No signup

Prerequisites: SwiftUI and macOS for Developers

~~~

Your progress

of lessons completed.

Course completed.

What you'll learn

Build and test a focused native Mac utility with deliberate state ownership, desktop behavior, durable data, and one useful system integration.

Course contents

  1. Start a macOS app

    Create a native target, understand scenes, separate model state, and test real windows.

    1. ✓ Create a macOS SwiftUI project
    2. ✓ Read the App and scene structure
    3. ✓ Separate model, state, and views
    4. ✓ Preview and run real windows
    5. ✓ Check your understanding: starting a macOS app
  2. Windows and commands

    Build a sidebar, application menus, keyboard shortcuts, utility windows, and settings.

    1. ✓ Build a sidebar interface
    2. ✓ Add menu commands and shortcuts
    3. ✓ Open a purpose-built window
    4. ✓ Add a Settings scene
    5. ✓ Check your understanding: windows and commands
  3. Files and persistence

    Choose storage locations, save atomically, accept user files, and handle replacement.

    1. ✓ Choose the right storage location
    2. ✓ Save Codable data atomically
    3. ✓ Let the user choose a file
    4. ✓ Handle file replacement
    5. ✓ Check your understanding: files and persistence
  4. macOS integration

    Add a menu bar extra, notifications, Keychain storage, and explicit command-line tools.

    1. ✓ Build a menu bar extra
    2. ✓ Request notification permission in context
    3. ✓ Store a secret in Keychain
    4. ✓ Launch a command-line tool explicitly
    5. ✓ Check your understanding: macOS integration
  5. Make the app reliable

    Define process protocols, stop work safely, cross concurrency boundaries, and finish a tested utility.

    1. ✓ Treat child output as a protocol
    2. ✓ Stop a child process gracefully
    3. ✓ Cross concurrency boundaries deliberately
    4. ✓ Complete a native macOS utility
    5. ✓ Check your understanding: making the app reliable