CINXE.COM
Planning your macOS app - Apple Developer
<!DOCTYPE html> <html xmlns="https://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta charset="utf-8" /> <meta name="Author" content="Apple Inc." /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <link rel="shortcut icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" /> <link rel="mask-icon" href="/apple-logo.svg" color="#333333"> <link rel="stylesheet" href="/assets/styles/global.dist.css?02002514015" type="text/css" /> <link rel="stylesheet" href="/assets/styles/dark-mode.css?17182448067" type="text/css" media="(prefers-color-scheme: dark)" data-color-scheme="dark" /> <link rel="stylesheet" href="/assets/styles/localization.css?39172414191" type="text/css" /> <script src="/assets/scripts/lib/jquery/jquery-3.6.0.min.js?17182448067"></script> <script src="/assets/scripts/settings.js?17182448067"></script> <script src="/assets/scripts/language-locales.js?17182448067"></script> <script src="/assets/scripts/DeveloperBreadcrumbs.js?05182434080"></script> <script async src="/assets/scripts/lib/jquery/jquery.retinate.js?17182448067"></script> <script async src="/assets/scripts/global.js?17182448067"></script> <script async src="/assets/scripts/global-logout.js?17182448067"></script> <link rel="stylesheet" href="https://www.apple.com/wss/fonts?family=SF+Pro&v=2" type="text/css" /> <link rel="stylesheet" href="https://www.apple.com/wss/fonts?family=SF+Pro+Icons&v=1" type="text/css" /> <link rel="stylesheet" href="https://www.apple.com/wss/fonts?family=SF+Mono&v=2" type="text/css" /> <link rel="stylesheet" href="https://www.apple.com/wss/fonts?family=Apple+Icons&v=1" type="text/css" /> <title>Planning your macOS app - Apple Developer</title> <meta name="omni_page" content="Planning your macOS app - (English)" /> <meta name="Description" content="Learn about the tools, technologies, and best practices for building apps for Mac." /> <meta property="og:locale" content="en_US" /> <meta property="og:site_name" content="Apple Developer" /> <meta property="og:type" content="website" /> <meta property="og:image" content="https://developer.apple.com/news/images/og/macos-planning-og.jpg" /> <meta property="og:title" content="Planning your macOS app" /> <meta property="og:description" content="Learn about the tools, technologies, and best practices for building apps for Mac." /> <meta property="og:url" content="https://developer.apple.com/macos/planning/" /> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:image" content="https://developer.apple.com/news/images/og/macos-planning-og-twitter.jpg"> <meta name="twitter:description" content="Learn about the tools, technologies, and best practices for building apps for Mac."> <meta name="twitter:title" content="Planning your macOS app"> <meta name="twitter:url" content="https://developer.apple.com/macos/planning/"> <link rel="stylesheet" type="text/css" href="/macos/planning/styles/planning.css" /> <link rel="stylesheet" type="text/css" href="/macos/planning/styles/development-essentials.css" /> <link rel="alternate" href="https://developer.apple.com/kr/macos/planning/" hreflang="ko-KR" /> <link rel="alternate" href="https://developer.apple.com/jp/macos/planning/" hreflang="ja-JP" /> <link rel="alternate" href="https://developer.apple.com/cn/macos/planning/" hreflang="zh-CN" /> <link rel="alternate" href="https://developer.apple.com/macos/planning/" hreflang="en" /> <link rel="canonical" href="https://developer.apple.com/macos/planning/" /> </head> <body id="submit" class="dmf"> <!-- metrics --> <script> /* RSID: */ var s_account="awdappledeveloper" </script> <script src="/assets/metrics/scripts/analytics.js?072620243"></script> <script> s.pageName= AC && AC.Tracking && AC.Tracking.pageName(); s.channel="www.en.developer" s.channel="www.en.developer"; /************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/ var s_code=s.t();if(s_code)document.write(s_code) </script> <!-- /metrics --> <script> const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; if (window.Settings.preferredColorScheme) { const colorTheme = (window.Settings.preferredColorScheme === 'auto') && !prefersDark ? 'light' : (window.Settings.preferredColorScheme === 'light') ? 'light' : 'dark' document.body.setAttribute('data-color-scheme', colorTheme); } else { document.body.setAttribute('data-color-scheme', prefersDark ? 'dark' : 'light'); } </script> <style> /* footer */ html body[data-color-scheme='dark'] #main section.section.section-resources.bg-alt {background-color:var(--fill-tertiary);color:var(--glyph-gray);} html body[data-color-scheme='dark'] .developer-router-links {background-color:var(--fill-tertiary);color:var(--glyph-gray);} html body[data-color-scheme='dark'] .footer {background-color:var(--fill-tertiary);color:var(--glyph-gray-tertiary);} /* body backgrounds */ body[data-color-scheme='dark'].dmf {background-color: #000;} html body[data-color-scheme='dark'].dmf .bg-alt {background-color:var(--fill-tertiary);} html body[data-color-scheme='dark'].dmf .bg-blue {background-color:var(--fill-blue-secondary);} html body[data-color-scheme='dark'].dmf .bg-green-blue {background:linear-gradient(135deg, #65976d 0%, #588ea4 100%)} html body[data-color-scheme='dark'].dmf .bg-yellow {background: linear-gradient(to bottom, var(--fill-tertiary) 0%, var(--fill-tertiary-alt) 100%);} html body[data-color-scheme='dark'].dmf .bg-light {background-color:var(--fill-secondary-alt);} html body[data-color-scheme='dark'].dmf .bg-gradient, html body[data-color-scheme='dark'].dmf .bg-grad {background:linear-gradient(to bottom, var(--dark) 0%, var(--fill-gray-secondary-alt) 100%);} html body[data-color-scheme='dark'].dmf .bg-grad-down {background:linear-gradient(to bottom, var(--dark) 0%, var(--fill-gray-secondary-alt) 100%);} html body[data-color-scheme='dark'].dmf .bg-grad-up {background:linear-gradient(to bottom, var(--fill-gray-secondary-alt) 0%, var(--dark) 100%);} html body[data-color-scheme='dark'].dmf .bg-blue-gradient, html body[data-color-scheme='dark'].dmf .bg-gradient-blue {background:linear-gradient(to bottom, var(--fill-blue-gradient-light) 0%, var(--fill-blue-gradient-dark) 100%);} html body[data-color-scheme='dark'].dmf .bg-blue-gradient-alt {background: linear-gradient(90deg, #061830 0%, #102d48 100%);} /* globalNav */ html body[data-color-scheme='dark'] #ac-globalnav {background: var(--fill-tertiary);} /* localNav */ html body[data-color-scheme='dark'] .localnav.localnav-scrim .localnav-background, html body[data-color-scheme='dark'] .localnav-scrim.localnav.localnav-background { background-color: rgba(29, 29, 31, 0.9); } @supports ((-webkit-backdrop-filter: initial) or (backdrop-filter: initial)) { html body[data-color-scheme='dark'] .localnav.localnav-scrim .localnav-background, html body[data-color-scheme='dark'] .localnav-scrim.localnav.localnav-background { background-color: rgba(29, 29, 31, 0.72); } } </style> <link rel="stylesheet" href="/assets/styles/globalnav.css?55202406207" type="text/css" /> <link rel="stylesheet" href="/assets/styles/suggest-lang.css?17182448067" type="text/css" /> <div id="suggest-lang" class="ribbon hide" lang="en"> <div class="ribbon-content-wrapper"> <div class="ribbon-content row"> <div class="column large-12 large-centered"> <p><a href="#" id="suggest-link" class="ribbon-link more">View in English</a></p> <button id="suggest-closer" class="icon icon-after icon-reset" aria-label="Dismiss language suggestion" tabindex="0"></button> </div> </div> </div> </div> <script src="/assets/scripts/suggest-lang.js?17182448067"></script> <aside id="ac-gn-segmentbar" class="ac-gn-segmentbar" lang="en-US" dir="ltr"> </aside> <input type="checkbox" id="ac-gn-menustate" class="ac-gn-menustate" /> <nav id="ac-globalnav" class="no-js" role="navigation" aria-label="Global" data-hires="false" data-analytics-region="global nav" lang="en-US" dir="ltr" data-www-domain="www.apple.com" data-store-locale="us" data-store-root-path="/us" data-store-api="/[storefront]/shop/bag/status" data-search-locale="en_US" data-search-suggestions-api="/search-services/suggestions/" data-search-defaultlinks-api="/search-services/suggestions/defaultlinks/" data-search-suggestions-enabled="false"> <div class="ac-gn-content"> <ul class="ac-gn-header"> <li class="ac-gn-item ac-gn-menuicon"> <label class="ac-gn-menuicon-label" for="ac-gn-menustate" aria-hidden="true"> <span class="ac-gn-menuicon-bread ac-gn-menuicon-bread-top"> <span class="ac-gn-menuicon-bread-crust ac-gn-menuicon-bread-crust-top"></span> </span> <span class="ac-gn-menuicon-bread ac-gn-menuicon-bread-bottom"> <span class="ac-gn-menuicon-bread-crust ac-gn-menuicon-bread-crust-bottom"></span> </span> </label> <a href="#ac-gn-menustate" role="button" class="ac-gn-menuanchor ac-gn-menuanchor-open" id="ac-gn-menuanchor-open"> <span class="ac-gn-menuanchor-label">Global Nav Open Menu</span> </a> <a href="#" role="button" class="ac-gn-menuanchor ac-gn-menuanchor-close" id="ac-gn-menuanchor-close"> <span class="ac-gn-menuanchor-label">Global Nav Close Menu</span> </a> </li> <li class="ac-gn-item ac-gn-apple"> <a class="ac-gn-link ac-gn-link-apple-developer" href="/" data-analytics-title="appledeveloper home" id="ac-gn-firstfocus-small"> <span class="ac-gn-link-text">Apple Developer</span> </a> </li> </ul> <div class="ac-gn-search-placeholder-container" role="search"> <div class="ac-gn-search ac-gn-search-small"> <a id="ac-gn-link-search-small" class="ac-gn-link" href="/search/" data-analytics-title="search" data-analytics-click="search" data-analytics-intrapage-link aria-label="Search"> <div class="ac-gn-search-placeholder-bar"> <div class="ac-gn-search-placeholder-input"> <div class="ac-gn-search-placeholder-input-text" aria-hidden="true"> <div class="ac-gn-link-search ac-gn-search-placeholder-input-icon"></div> <span class="ac-gn-search-placeholder">Search</span> </div> </div> <div class="ac-gn-searchview-close ac-gn-searchview-close-small ac-gn-search-placeholder-searchview-close"> <span class="ac-gn-searchview-close-cancel" aria-hidden="true">Cancel</span> </div> </div> </a> </div> </div> <ul class="ac-gn-list"> <li class="ac-gn-item ac-gn-apple"> <a class="ac-gn-link ac-gn-link-apple-developer" href="/" data-analytics-title="appledeveloper home" id="ac-gn-firstfocus"> <span class="ac-gn-link-text">Apple Developer</span> </a> </li> <li class="ac-gn-item ac-gn-item-menu ac-gn-news"> <a class="ac-gn-link ac-gn-link-news" href="/news/" data-analytics-title="news"> <span class="ac-gn-link-text">News</span> </a> </li> <li class="ac-gn-item ac-gn-item-menu ac-gn-discover"> <a class="ac-gn-link ac-gn-link-discover" href="/discover/" data-analytics-title="discover"> <span class="ac-gn-link-text">Discover</span> </a> </li> <li class="ac-gn-item ac-gn-item-menu ac-gn-design"> <a class="ac-gn-link ac-gn-link-design" href="/design/" data-analytics-title="design"> <span class="ac-gn-link-text">Design</span> </a> </li> <li class="ac-gn-item ac-gn-item-menu ac-gn-develop"> <a class="ac-gn-link ac-gn-link-develop" href="/develop/" data-analytics-title="develop"> <span class="ac-gn-link-text">Develop</span> </a> </li> <li class="ac-gn-item ac-gn-item-menu ac-gn-distribute"> <a class="ac-gn-link ac-gn-link-distribute" href="/distribute/" data-analytics-title="distribute"> <span class="ac-gn-link-text">Distribute</span> </a> </li> <li class="ac-gn-item ac-gn-item-menu ac-gn-dsupport"> <a class="ac-gn-link ac-gn-link-dsupport" href="/support/" data-analytics-title="dsupport"> <span class="ac-gn-link-text">Support</span> </a> </li> <li class="ac-gn-item ac-gn-item-menu ac-gn-account"> <a class="ac-gn-link ac-gn-link-account" href="/account/" data-analytics-title="account"> <span class="ac-gn-link-text">Account</span> </a> </li> <li class="ac-gn-item ac-gn-item-menu ac-gn-search" role="search"> <a id="ac-gn-link-search" class="ac-gn-link ac-gn-link-search" href="/search/" data-analytics-title="search" data-analytics-click="search" data-analytics-intrapage-link aria-label="Search"></a> </li> </ul> <aside id="ac-gn-searchview" class="ac-gn-searchview" role="search" data-analytics-region="search"> <div class="ac-gn-searchview-content"> <div class="ac-gn-searchview-bar"> <div class="ac-gn-searchview-bar-wrapper"> <form id="ac-gn-searchform" class="ac-gn-searchform" action="/search/" method="get"> <div class="ac-gn-searchform-wrapper"> <input id="ac-gn-searchform-input" class="ac-gn-searchform-input" type="text" name="q" aria-label="Search" placeholder="Search" autocorrect="off" autocapitalize="off" autocomplete="off" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" aria-owns="quicklinks suggestions" /> <button id="ac-gn-searchform-submit" class="ac-gn-searchform-submit" type="submit" disabled aria-label="Submit Search"></button> <button id="ac-gn-searchform-reset" class="ac-gn-searchform-reset" type="reset" disabled aria-label="Clear Search"> <span class="ac-gn-searchform-reset-background"></span> </button> </div> </form> <button id="ac-gn-searchview-close-small" class="ac-gn-searchview-close ac-gn-searchview-close-small" aria-label="Cancel Search"> <span class="ac-gn-searchview-close-cancel" aria-hidden="true"> Cancel </span> </button> </div> </div> <aside id="ac-gn-searchresults" class="ac-gn-searchresults hidden" data-string-quicklinks="Quick Links" data-string-suggestions="Suggested Searches" data-string-noresults=""> <section class="ac-gn-searchresults-section ac-gn-searchresults-section-defaultlinks"> <div class="ac-gn-searchresults-section-wrapper"> <div class="search-group-checkbox hidden"><input id="group-input" type="checkbox" name="group-filter" checked>Only search within “<span id="group-search-label"></span>”</div> <h3 class="ac-gn-searchresults-header ac-gn-searchresults-animated">Quick Links</h3> <ul class="ac-gn-searchresults-list" id="defaultlinks" role="listbox"> </ul> <span role="status" class="ac-gn-searchresults-count" aria-live="polite">5 Quick Links</span> </div> </section> </aside> </div> <button id="ac-gn-searchview-close" class="ac-gn-searchview-close" aria-label="Cancel Search"> <span class="ac-gn-searchview-close-wrapper"> <span class="ac-gn-searchview-close-left"></span> <span class="ac-gn-searchview-close-right"></span> </span> </button> </aside> </div> </nav> <div class="ac-gn-blur"></div> <div id="ac-gn-curtain" class="ac-gn-curtain"></div> <div id="ac-gn-placeholder" class="ac-nav-placeholder"></div> <script src="/assets/scripts/ac-globalnav.built.js?17182448067"></script> <link rel="stylesheet" href="/assets/styles/search.css?17182448067"> <script src="/assets/scripts/search.js?17182448067"></script> <link rel="stylesheet" property="stylesheet" href="/assets/styles/localnav.css" type="text/css" /> <input type="checkbox" id="localnav-menustate" class="localnav-menustate"/> <nav id="localnav" class="localnav localnav-scrim" data-sticky role="navigation"> <div class="localnav-wrapper"> <div class="localnav-background"></div> <div class="localnav-content"> <h2 class="localnav-title"> <a href="/macos/">macOS</a> </h2> <div class="localnav-menu"> <a href="#localnav-menustate" class="localnav-menucta-anchor localnav-menucta-anchor-open" id="localnav-menustate-open"> <span class="localnav-menucta-anchor-label">Open Menu</span> </a> <a href="#" class="localnav-menucta-anchor localnav-menucta-anchor-close" id="localnav-menustate-close"> <span class="localnav-menucta-anchor-label">Close Menu</span> </a> <div class="localnav-menu-tray"> <ul class="localnav-menu-items"> <li class="localnav-menu-item"> <a href="/macos/" class="localnav-menu-link">macOS 15</a> </li> <li class="localnav-menu-item"> <a href="/mac-catalyst/" class="localnav-menu-link">Mac Catalyst</a> </li> <li class="localnav-menu-item"> <a href="/macos/planning/" class="localnav-menu-link">Plan your app</a> </li> <li class="localnav-menu-item"> <a href="/macos/submit/" class="localnav-menu-link">Submit your app</a> </li> </ul> </div> <div class="localnav-actions localnav-actions-center"> <div class="localnav-action localnav-action-menucta" aria-hidden="true"> <label for="localnav-menustate" class="localnav-menucta"> <span class="localnav-menucta-chevron"></span> </label> </div> <div class="localnav-action localnav-action-button"> <a class="localnav-button button button-compact button-pill" href="/download/">Download<span class="loc-en-only"></span> <span class="localnav-action-product">macOS</span> </a> </div> </div> </div> </div> </div> </nav> <label id="localnav-curtain" for="localnav-menustate"></label> <script src="/assets/scripts/ac-localnav.built.js"></script> <script type="text/javascript" src="/assets/scripts/localnav.js"></script> <main id="main" role="main"> <div class="ribbon ribbon-blue"> <div class="ribbon-drop-wrapper"> <div class="ribbon-content-wrapper"> <div class="ribbon-content row"> <div class="column large-centered"> <p><a href="/news/?id=ibe0jb52" class="ribbon-link">Game development sessions, documentation, and sample code — <span class="nowrap more">all in one place</span></a></p> </div> </div> </div> </div> </div> <article> <section class="section section-hero-marker"> <div class="section-content"> <div class="row"> <div class="column large-10 medium-12 small-12 large-centered text-center small-text-left"> <div class="center-wrap"> <h1 class="typography-hero-headline">Planning your macOS app</h1> <p class="typography-intro">If you’re new to Mac software development, take a moment to get familiar with the tools and technologies you’ll use. Apple provides everything you need to get started, and macOS technologies help you get the features and performance you want from your apps.</p> </div> </div> </div> </div> <picture> <source media="(max-width: 735px)" srcset="/macos/planning/images/planning-macos-marker-small_2x.webp" type="image/webp" /> <source media="(max-width: 735px)" srcset="/macos/planning/images/planning-macos-marker-small_2x.png" /> <source media="(max-width: 1068px)" srcset="/macos/planning/images/planning-macos-marker-medium_2x.webp" type="image/webp" /> <source media="(max-width: 1068px)" srcset="/macos/planning/images/planning-macos-marker-medium_2x.png" /> <source srcset="/macos/planning/images/planning-macos-marker-large_2x.webp" type="image/webp" /> <img src="/macos/planning/images/planning-macos-marker-large_2x.png" width="100%" class="hero-image-marker center" alt="Storyboard of a new macOS application idea and technologies." /> </picture> </section> <section class="section"> <div class="section-content"> <div class="row"> <div class="column large-3 small-12"> <ul class="sidenav-container"></ul> <script src="/assets/scripts/sidenav.built.js?17182448067"></script> </div> <div class="column large-9 small-12"> <div class="row content-margin"> <h2 id="explore" data-sidenav>Explore the possibilities</h2> <p>The Mac is all about speed and power, and macOS helps you maximize the performance of your apps. Mac is ideal for apps that require raw processing power to execute tasks as quickly as possible. However, you also use it for day-to-day tasks such as communication, news and information, social media, games, and much more.</p> <p>macOS offers different paths for delivering your content, and the path you choose affects the initial decisions you must make:</p> <div class="list-margin topics"> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-buildingblock" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Assemble your UI from standard views</b></p> <p>Build apps quickly from buttons, text labels, and other standard views and controls <a href="#build-the-data-structures-youll-use-in-your-app">built into macOS</a>. Customize the appearance of controls, or create entirely new views to present your content in unique ways. This approach works well for most apps and shortens development time.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-scribble" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Draw everything onscreen yourself</b></p> <p>Take control of your app’s appearance and draw everything that appears onscreen yourself. Create <a href="/games/planning/">games</a> or immersive experiences with custom 2D or 3D environments. Render and animate your content at high frame rates using technologies <span class="nowrap">like <a href="/metal/">Metal</a>.</span></p> </div> </div> <div class="row"> <div class="column"> <figure class="topic-icon icon-terminal" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Build software without a UI</b></p> <p>Choose this path for lightweight tools and utilities that don’t require UI. Create command-line tools and scripts, XPC services, modules to support custom file systems or cloud storage, database and server software, open source tools, new programming languages, UNIX tools, and much more.</p> </div> </div> </div> <p>After you choose a particular path, think about the features you need for your app. Apart from a few core technologies, you can adopt most technologies as necessary to support specific features. macOS technologies insulate your app from low-level hardware details and provide a stable base for building your features.</p> <p class="lighter smaller">If you have an existing <a href="/ipados/">iPadOS</a> app, you can use <a href="/documentation/uikit/mac_catalyst/" class="nowrap">Mac Catalyst<span class="loc-cj"></span></a> to create a version of your app that runs on Mac.</p> </div> <div class="row content-margin"> <h2 id="where-to-start" data-sidenav>Where to start</h2> <p>Software development starts with <a href="/xcode/"><b>Xcode</b></a> — Apple’s integrated development environment. Xcode offers a complete set of tools for developing software, including project management support, code editors, visual editors for your UI, debugging tools, simulators for different devices, tools for assessing performance, and much more. Xcode also includes a complete set of system code modules — called frameworks — for developing your software.</p> <div class="row margin-top-small align-items-center"> <div class="column"> <figure class="app-icon icon-xcode" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column"> <p> <a href="https://apps.apple.com/us/app/xcode/id497799835?mt=12">Download Xcode from the Mac App <span class="icon icon-after icon-downloadcircle">Store</span></a> </p> <p class="smaller lighter no-margin-top">Xcode includes the SDKs for iOS, iPadOS, macOS, tvOS, and watchOS.</p> </div> </div> <picture> <img src="/macos/planning/images/macos-xcode-start_2x.png" width="100%" alt="" aria-label="" class="light-image" /> <img src="/macos/planning/images/macos-xcode-start-dark_2x.png" width="100%" alt="" aria-label="" class="dark-image" /> </picture> <p>To create a new project in Xcode, choose <span class="code-reference">File > New > Project</span> and follow the prompts to create a macOS app. New projects come with some default code to get you started, with the type of app determining your initial starting point. For information about how to use Xcode, view <a href="/documentation/xcode/">Xcode documentation<span class="loc-c"></span></a>.</p> <div class="row margin-top-small align-items-center"> <div class="column"> <figure class="app-icon icon-playgrounds" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p>Swift Playground is an interactive coding environment for people who want to learn and experiment with code and developer technologies. For more information, view <span class="nowrap"><a href="https://www.apple.com/swift/playgrounds/">Swift Playground</a>.</span></p> </div> </div> <h4>Adopt Swift</h4> <p>As you set up your project, consider which programming language to use. <a href="/swift/"><b>Swift</b></a> is the preferred option because its syntax is concise, safe by design, and has modern features that make your code more expressive. Swift code also produces software that runs lightning-fast, and it’s interoperable with <a href="/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011210">Objective-C<span class="loc-en-only"></span></a> so you can include source files for both languages in the same project. </p> <div class="row margin-top-small margin-bottom-small align-items-center"> <div class="column"> <figure class="app-icon icon-swift" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>Swift Programming Language Guide</b></p> <p class="smaller lighter no-margin-top">The <a href="https://docs.swift.org/swift-book/">Swift Programming Language book<span class="loc-en-only"></span></a> gives a complete overview of the Swift programming language, and is the perfect place to begin your journey learning Swift.</p> </div> </div> <h3 id="build-the-data-structures-youll-use-in-your-app" data-sidenav="Choose your app technology" class="anchor-spacing-top">Choose your app-builder technology</h3> <p>Another early choice to make is which app-builder technology to use for your interface. Apple’s app-builder technologies provide the core infrastructure macOS needs to communicate with your app. They also define the programming model you use to build your interface, handle events, and more.</p> <div class="list-margin"> <div class="row margin-bottom-small"> <div class="column"> <figure class="app-icon icon-swiftui" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>SwiftUI</b></p> <p>SwiftUI offers a modern, platform-agnostic approach to building your UI and app infrastructure. Specify your interface programmatically from a set of standard SwiftUI views or create custom views with any appearance you want, and present a visual representation of your interface in real-time. At runtime, the system uses your code to build your app’s final interface manage changes to it. This programmatic approach to UI gives you many standard behaviors for free, and simplifies the process of keeping your UI up-to-date. For a guided walkthrough of how to use <a href="/documentation/swiftui/">SwiftUI<span class="loc-c"></span></a>, view the <a href="/tutorials/swiftui/">Introducing SwiftUI<span class="loc-en-only"></span></a> tutorial.</p> </div> </div> <div class="row margin-top-small"> <div class="column"> <figure class="app-icon icon-uikit" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>AppKit</b></p> <p>AppKit lets you assemble your interface visually using storyboards. AppKit offers a more traditional approach to building apps, giving you full control over the management of interface elements. Write the code you need to update views and controls, change their configuration, and communicate changes to other parts of your app. To get started with building AppKit apps, view the <a href="/documentation/appkit/">AppKit<span class="loc-en-only"></span></a> documentation.</p> </div> </div> </div> <p>SwiftUI is the preferred technology for your app’s infrastructure and UI, and offers a better starting point for development. Even if you build your initial UI with AppKit, SwiftUI and AppKit views are interoperable. You can easily mix SwiftUI views and AppKit views in the same view hierarchies.</p> <p>In addition to building your app’s infrastructure, macOS also includes technologies to build your app’s data structures. <a href="/documentation/swift/">Swift Standard Library<span class="loc-c"></span></a> and <a href="/documentation/foundation/">Foundation framework<span class="loc-en-only"></span></a> provide the fundamental types you use frequently, such as arrays and dictionaries, strings, numbers, dates, and other common data value types. You can also create your own custom types and adopt Swift’s <a href="/documentation/swift/swift_standard_library/encoding_decoding_and_serialization/">Codable support<span class="loc-en-only"></span></a> to persist those types to disk. If your app manages larger amounts of structured data, consider using <a href="/documentation/coredata/">Core Data<span class="loc-en-only"></span></a> and <a href="/documentation/cloudkit/">CloudKit<span class="loc-en-only"></span></a> to manage and persist that data.</p> <h3 id="create-an-interface-that-ofers-a-great-experience" data-sidenav="Design the user experience">Design the user experience</h3> <p>An app that offers an engaging experience keeps people coming back. Create a UI that looks good, has an easy-to-understand layout, and emphasizes the right content throughout.</p> <p>The Mac gives you a lot of screen space to build a rich interface, so think about how to present that information in an intuitive way. Also consider the impact that system-specific design patterns have on your UI.</p> <ul class="content-list"> <li><b>Windows</b> define the core of your app’s UI. Create one window or multiple windows, and place similar or different content in each one. Set your windows to a specific size or let people resize them. Support <a href="/design/human-interface-guidelines/patterns/going-full-screen/">full-screen mode</a> for a distraction-free working environment.</li> <li><b>Menus</b> define the actions people take on your content. The menu bar at the top of the screen displays the active app’s menus. Identify relevant actions in your own app, and craft <a href="/design/human-interface-guidelines/components/menus-and-actions/menus/">menus</a> that reflect how people interact with your content.</li> <li><b>The Dock</b> offers convenient access to apps, documents, windows, and folders. Add a custom <a href="/design/human-interface-guidelines/components/menus-and-actions/dock-menus/">Dock menu</a> to display frequently accessed commands, or add a badge to your app’s icon to signal new content.</li> </ul> <picture> <img src="/macos/planning/images/apple-design-resources_2x.png" width="100%" alt="" aria-label="" class="neutral-image smaller-vertical-margin" /> <!-- <img src="/macos/planning/images/apple-design-resources-dark_2x.jpg" width="100%" alt="" aria-label="" class="dark-image smaller-vertical-margin"/> --> </picture> <div class="row margin-top-small margin-bottom-small align-items-center"> <div class="column"> <figure class="app-icon icon-hig" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>Human Interface Guidelines</b></p> <p class="smaller lighter no-margin-top">Apple’s <a href="/design/human-interface-guidelines/platforms/designing-for-macos/">Human Interface Guidelines</a> offer invaluable information on how to design your app’s interface, navigate content, and manage interactions on Mac. Make reading these guidelines a priority in your explorations of the macOS ecosystem, and use the corresponding <a href="/design/resources/#macos-apps" class="nowrap">Apple Design Resources</a> to dive into designing your app.</p> </div> </div> <p>Certain features and technologies are essential for all macOS apps. When planning your initial UI, make sure you adopt the following features: </p> <div class="list-margin topics no-margin-bottom"> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-scenes" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Window controllers</b></p> <p>On macOS, a window controller manages the content for one window in your interface, including loading, displaying, and closing the window. SwiftUI uses <a href="/documentation/swiftui/scenes/">scenes<span class="loc-en-only"></span></a> to manage windows. AppKit uses <a href="/documentation/appkit/nswindowcontroller/">NSWindowController<span class="loc-en-only"></span></a> objects.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-auto-layout" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Auto Layout</b></p> <p>Rather than adjust the position of views manually to accommodate full-screen mode and different window sizes, tell the system how to make those adjustments relative to the current <a href="/documentation/uikit/uiview/positioning_content_relative_to_the_safe_area/">safe areas<span class="loc-en-only"></span></a>. SwiftUI adopts automatic layout as part of its UI design approach. To adopt automatic layout in AppKit views, add <a href="/documentation/appkit/view_layout/">Auto Layout constraints<span class="loc-en-only"></span></a> to your interface.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-dark-mode" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Appearance variations</b></p> <p>Build your UI to support system-level appearance changes. Dark Mode lets people choose between a light or dark UI, and accessibility settings let people choose a high-contrast UI. Different appearances rely on different color palettes and image assets, which you manage with the help of <a href="/documentation/xcode/asset-management/">asset catalogs<span class="loc-en-only"></span></a>. For other parts of your UI, use system APIs to determine when it’s time to change between light, dark, or high-contrast content. For information, view <a href="/documentation/uikit/appearance_customization/supporting_dark_mode_in_your_interface/">Supporting Dark Mode in your interface<span class="loc-en-only"></span></a>.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-text-styles" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Text styles</b></p> <p>Adopt text styles and dynamic font variants for your app’s text. A text style defines the semantic usage of a piece of text — for example, the body text style defines primary content. A text style’s font characteristics remain the same even when you change the font size, allowing you to scale text and retain the intended appearance of your app. Use dynamic font variants for menus, tool tips, and specific elements of your interface to preserve consistency with the appearance of standard UI elements. For guidance, view <a href="/design/human-interface-guidelines/foundations/typography/">Typography</a>.</p> </div> </div> <div class="row"> <div class="column"> <figure class="topic-icon icon-sf-symbols" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Scalable images</b></p> <p>Incorporate <a href="/sf-symbols/" class="nowrap">SF Symbols</a> to make your app more adaptable to changes. The SF Symbols app offers a vast collection of configurable, vector-based images that adapt naturally to appearance and size changes. They also blend well with the San Francisco system font, resulting in a consistent look across Apple platforms. View <a href="/documentation/uikit/uiimage/configuring_and_displaying_symbol_images_in_your_ui/">Configuring and displaying symbol images in <span class="nowrap">your UI</span><span class="loc-en-only"></span></a>.</p> </div> </div> </div> <h3 id="handle-documents-and-files-gracefully" data-sidenav="Handle files gracefully">Handle documents and files gracefully</h3> <p>In macOS, people have direct access to the file system and can add, delete, move, and inspect files from the Finder or Terminal apps. Support technologies that help people access their files, and make sure your app is resilient to changes happening elsewhere:</p> <div class="list-margin topics no-margin-bottom"> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-cloud icon-larger" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Share files across devices with iCloud Drive</b></p> <p>Give people the option to store documents and files in <a href="/documentation/foundation/icloud/">iCloud<span class="loc-en-only"></span></a> which ensures access to those files on all of their devices. Share small amounts of data using <a href="/library/archive/documentation/General/Conceptual/iCloudDesignGuide/Chapters/DesigningForKey-ValueDataIniCloud.html#//apple_ref/doc/uid/TP40012094-CH7-SW1">iCloud key-value storage<span class="loc-en-only"></span></a>.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-folder" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Store private files in your app’s container directory</b></p> <p>If your app creates intermediate files, caches, or other content you don’t want people to change, store those files in an <a href="/documentation/foundation/filemanager/1412643-containerurl/">app-container directory<span class="loc-en-only"></span></a>. Containers offer well-defined places for your content and are hidden from view to prevent people from accidentally changing your content.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-quicklook" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Provide Quick Look previews for custom file types</b></p> <p>People use Quick Look to glimpse a file’s contents from the Finder without opening the file. Provide a Quick Look plug-in for any custom document formats you define. For information, view <a href="/documentation/quicklookui/">QuickLookUI<span class="loc-en-only"></span></a>.</p> </div> </div> </div> <p>If your app supports file-based documents, provide a smooth and frictionless document-editing experience. Model document content using <a href="/documentation/swiftui/documents/">SwiftUI document types<span class="loc-en-only"></span></a> or the AppKit <a href="/documentation/appkit/nsdocument/">NSDocument<span class="loc-en-only"></span></a> type. Help people recover from mistakes during editing by building Undo and Redo support into your app’s editing code. Prevent people from losing changes to their documents by adopting auto-save capabilities. For more information, view <a href="/documentation/appkit/documents_data_and_pasteboard/developing_a_document-based_app/">Developing a document-based app<span class="loc-en-only"></span></a>.</p> <h3 id="adopt-best-practices" data-sidenav="Adopt best practices">Adopt best practices during development</h3> <p>Offer the best possible experience for everyone by doing the following:</p> <div class="list-margin topics no-margin-bottom"> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-person icon-smaller" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Protect people’s privacy</b></p> <p>Privacy is important, so keep people informed about how you use their data. If you collect data, offer a privacy statement that explains how you use that information. When you use Apple technologies that operate on personal data, include usage descriptions for the system to display on first use. For more information, view <a href="/documentation/uikit/protecting_the_user_s_privacy/">Protecting the user’s privacy<span class="loc-cj"></span></a>.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-lock-square" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Secure the data you collect and store</b></p> <p>If you do collect data, make sure you protect that data from malicious attacks. Adopt <a href="/documentation/authenticationservices/public-private_key_authentication/supporting_passkeys/">passkeys<span class="loc-en-only"></span></a> as a secure alternative to passwords. Store personally identifiable information, financial data, or other sensitive data in the user’s encrypted <a href="/documentation/security/keychain_services/">Keychain<span class="loc-en-only"></span></a>. Use <a href="/documentation/uikit/protecting_the_user_s_privacy/encrypting_your_app_s_files/">on-disk encryption<span class="loc-en-only"></span></a> or other Apple <a href="/documentation/security/">security technologies<span class="loc-en-only"></span></a> to store other personal data. Use Apple <a href="/documentation/cryptokit/">CryptoKit<span class="loc-en-only"></span></a> to encrypt data that you store locally or send outside your app.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-a11y" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Audit your accessibility support</b></p> <p>Apple builds accessibility support right into its technologies, but screen readers and other accessibility features rely on information your app provides. SwiftUI and AppKit can describe each piece of your UI, but only you know how those pieces work together. Review accessibility labels and other descriptions to make sure they provide helpful information, and make sure focus-based navigation is simple and intuitive. For more information, view <a href="/documentation/accessibility/">Accessibility<span class="loc-en-only"></span></a>.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-globe" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Internationalize and localize your app</b></p> <p>Embrace a global market by localizing your app for other regions and languages. Prepare your app using the <a href="/documentation/Foundation/">Foundation framework<span class="loc-en-only"></span></a>, which provides code to format strings, dates, times, currencies, and numbers for different languages and regions. Ensure your UI looks good for both left-to-right and <a href="/design/human-interface-guidelines/foundations/right-to-left/">right-to-left</a> languages. Localize app resources and add them to your Xcode project. For information about the internationalization and localization process, view <a href="/documentation/xcode/localization/">Localization<span class="loc-en-only"></span></a>.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-people icon-larger" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Design for everyone</b></p> <p>Consider social and cultural differences when developing content, and avoid images and terms that have negative or derogatory connotations for portions of your audience. For more information, view <a href="/design/human-interface-guidelines/foundations/inclusion/">Inclusion</a>.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-ant-fill" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Test and debug your app thoroughly</b></p> <p>During the development cycle, debug problems as they arise using the built-in <a href="/documentation/xcode/">Xcode debugger<span class="loc-c"></span></a>. Build automated test suites using <a href="/documentation/xctest/">XCTest<span class="loc-en-only"></span></a> and run them during every build to validate new code works as expected. Use the continuous integration system of <a href="/documentation/xcode/xcode-cloud/">Xcode Cloud<span class="loc-en-only"></span></a> to automate builds, test cycles, and the distribution of your apps to your QA teams.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-hare" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Optimize your app’s performance</b></p> <p>Identify bottlenecks and other performance issues in your code using the <a href="/documentation/xcode/">Instruments app<span class="loc-c"></span></a> that comes with Xcode. Profile your running code, find memory leaks, analyze resource usage, and much more. For information about how to gather metrics using Instruments, view <a href="/documentation/xcode/improving-your-app-s-performance/">Improving your app’s performance<span class="loc-en-only"></span></a>.</p> </div> </div> <div class="row"> <div class="column"> <figure class="topic-icon icon-chart icon-smaller" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Choose a business model for your app</b></p> <p>Distribute your app worldwide using a variety of business models, including free, free with in-app purchases, pay-to-download, and more. Build your interface in a way that offers a cohesive experience and supports your chosen business model. For more information, view <a href="/app-store/business-models/">Choosing a business model</a>.</p> </div> </div> </div> </div> <div class="row content-margin no-margin-bottom"> <h2 id="how-to-take-it-further" data-sidenav>How to take it further</h2> <p>Once you have an app up and running, look for additional ways to improve the experience. Little things can make a big difference, whether it’s adding a particular feature, or presenting your content in a different way. For example:</p> <div class="list-margin topics"> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-clock icon-smaller" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Deliver contextually appropriate content to people</b></p> <p>Think about how people use your app, and find ways to surface important content quickly. Use the current date and time to filter results, or to <a href="/documentation/usernotifications/">generate important notifications<span class="loc-en-only"></span></a>. Use <a href="/documentation/coreml/">machine learning<span class="loc-cj"></span></a> to analyze data and offer better solutions. Rearrange your interface dynamically to make frequently used content more accessible.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-magnifying-glass icon-smaller" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Help people find your app’s content</b></p> <p>Provide a comprehensive description of items to <a href="/documentation/corespotlight/making_content_searchable/">Spotlight search<span class="loc-en-only"></span></a> to make those items more findable. When someone selects a search result, use the provided <a href="/documentation/foundation/nsuseractivity/">user activity object<span class="loc-en-only"></span></a> to put your app in the proper state to display the result.</p> </div> </div> <div class="row"> <div class="column"> <figure class="topic-icon icon-arrow-branch" data-hires-status="pending"></figure> </div> <div class="column large-10 medium-10 small-12"> <p class="title-margin-bottom"><b>Add runtime condition checks around new features</b></p> <p>When you update your app to support a new version of macOS, place runtime condition checks around code for new features. Runtime checks eliminate the need to ship different versions of your app: one for people running the new version of macOS, and one for people running older versions. Everyone runs the same app, and people on the newer version of macOS gain access to the new features you added. For information about how to add runtime checks, view <a href="/documentation/xcode/running-code-on-a-specific-version/">Running code on a specific platform or OS version<span class="loc-en-only"></span></a>.</p> </div> </div> </div> <p>Your app isn’t the only way to support interactions with your content. Adopt the following technologies to extend the reach of your app to other parts of the system.</p> <div class="list-margin topics"> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-gear" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>Integrate your content with other system services</b></p> <p>Some parts of the system support app-specific information, and use app extensions to collect that information. Add a <a href="/documentation/WidgetKit/">widget app extension<span class="loc-cj"></span></a> to your app to display content in Notification Center, or add an <a href="/documentation/appkit/app_extensions/add_functionality_to_finder_with_action_extensions/">action app extension<span class="loc-en-only"></span></a> to define Quick Actions for your app. For information about supported app extensions, view <a href="/app-extensions/">App Extensions</a>.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-computeriphone icon-larger-2" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>Support the continuation of tasks on other devices</b></p> <p><a href="/documentation/foundation/task_management/implementing_handoff_in_your_app/">Handoff<span class="loc-en-only"></span></a> lets people start an app-specific activity on one device and resume it on another. For example, a person can start an activity on their Mac and continue it on an iPad or iPhone running your app. <a href="/documentation/appkit/supporting_continuity_camera_in_your_mac_app/">Continuity Camera<span class="loc-en-only"></span></a> lets people use a connected iOS device to scan documents or perform high-quality photo or <a href="/documentation/avfoundation/capture_setup/supporting_continuity_camera_in_your_macos_app/">video capture<span class="loc-en-only"></span></a> from their macOS app.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-links" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>Support universal links for your app’s content</b></p> <p>If your website and app offer similar content, add universal link support to your app. With universal links, you don’t need to create separate URLs to open content in your app. One URL opens your app when it’s installed or your website when it isn’t. For more information, view <a href="/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content/">Allowing apps and websites to link to your content<span class="loc-en-only"></span></a>.</p> </div> </div> <div class="row"> <div class="column"> <figure class="topic-icon icon-export" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>Export features that might benefit other apps</b></p> <p>The Services menu in macOS displays tasks people can perform on the current selection. Populate this menu with the tasks your app offers, and write code to perform these services at runtime. For information, view <a href="/library/archive/documentation/Cocoa/Conceptual/SysServices/introduction.html">Services Implementation Guide<span class="loc-en-only"></span></a>.</p> </div> </div> </div> <p>Some apps need to communicate with custom hardware, or extend the system to offer system-level services or security features. Consider adding a <a href="/documentation/systemextensions/">system extension<span class="loc-en-only"></span></a> to your app if you support any of the following activities:</p> <div class="list-margin topics"> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-lockscreen" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>You monitor events for potentially malicious activity</b></p> <p>For example, you monitor the execution or forking of processes, the mounting of file systems, and raising signals. For information, view <a href="/documentation/endpointsecurity/">Endpoint Security<span class="loc-en-only"></span></a>.</p> </div> </div> <div class="row margin-bottom-small"> <div class="column"> <figure class="topic-icon icon-network" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>You customize or extend core network features</b></p> <p>For example, you configure the system’s Wi-Fi settings, create and manage VPN configurations, perform content filtering, manage system-wide DNS configurations, or integrate with a custom hotspot. For information, view <a href="/documentation/networkextension/">Network Extension<span class="loc-en-only"></span></a>.</p> </div> </div> <div class="row"> <div class="column"> <figure class="topic-icon icon-mouse" aria-hidden="true" data-hires-status="pending"></figure> </div> <div class="column large-10 small-12"> <p class="title-margin-bottom"><b>You talk directly to custom hardware</b></p> <p>For example, you communicate with external USB devices, HID devices, PCI devices, serial devices, or many others. For information, view <a href="/documentation/driverkit/">DriverKit<span class="loc-en-only"></span></a>.</p> </div> </div> </div> <h4>Explore more</h4> <p>Learn more about <a href="/documentation/technologies/">technologies<span class="loc-en-only"></span></a> that provide unique capabilities, yet integrate tightly with Apple platforms to form a seamless ecosystem for apps and <a href="/games/planning/">games</a> across <a href="/ios/planning/">iOS</a>, <a href="/ipados/planning/">iPadOS</a>, macOS, <a href="/tvos/planning/">tvOS</a>, <a href="/visionos/planning/">visionOS</a>, <span class="nowrap">and <a href="/watchos/planning/">watchOS</a>.</span></p> </div> </div> </div> </div> </section> </article> <section class="section bg-light"> <div class="section-content"> <div class="row"> <div class="column large-centered large-8 medium-10 small-12 text-center"> <figure class="tile-icon icon-submitting center" data-hires-status="pending"></figure> <h3>Distributing your apps</h3> <p class="margin-bottom-small">When you’re ready to distribute your apps, the App Store lets you deliver your apps to hundreds of millions people around the world. Learn about preparing your apps for submission to the App Store.</p> <p><a href="/macos/submit/" class="more">Learn about submitting apps</a></p> </div> </div> </div> </section> </main> <link rel="stylesheet" href="/assets/styles/footer.dist.css?17182448067"> <footer id="footer" class="footer" role="contentinfo" aria-labelledby="footer-label"> <div class="footer-content"> <h2 class="footer-label" id="footer-label">Developer Footer</h2> <developer-breadcrumbs> <li><a href="/macos/">macOS</a></li> <li>Planning</li> </developer-breadcrumbs> <nav class="footer-directory" aria-label="Apple Developer Directory" role="navigation"> <!--googleoff: all--> <div class="footer-directory-column"> <input class="footer-directory-column-section-state" type="checkbox" id="footer-directory-column-section-state-platform" /> <div class="footer-directory-column-section"> <label class="footer-directory-column-section-label" for="footer-directory-column-section-state-platform"> <h3 class="footer-directory-column-section-title">Platforms</h3> </label> <a href="#footer-directory-column-section-state-platform" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-open"> <span class="footer-directory-column-section-anchor-label">Open Menu</span> </a> <a href="#" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-close"> <span class="footer-directory-column-section-anchor-label">Close Menu</span> </a> <ul class="footer-directory-column-section-list"> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/ios/">iOS</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/ipados/">iPadOS</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/macos/">macOS</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/tvos/">tvOS</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/visionos/">visionOS</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/watchos/">watchOS</a></li> </ul> </div> <input class="footer-directory-column-section-state" type="checkbox" id="footer-directory-column-section-state-tools" /> <div class="footer-directory-column-section"> <label class="footer-directory-column-section-label" for="footer-directory-column-section-state-tools"> <h3 class="footer-directory-column-section-title">Tools</h3> </label> <a href="#footer-directory-column-section-state-tools" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-open"> <span class="footer-directory-column-section-anchor-label">Open Menu</span> </a> <a href="#" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-close"> <span class="footer-directory-column-section-anchor-label">Close Menu</span> </a> <ul class="footer-directory-column-section-list"> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/swift/">Swift</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/swiftui/">SwiftUI</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/swift-playground/">Swift Playground</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/testflight/">TestFlight</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/xcode/">Xcode</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/xcode-cloud/">Xcode Cloud</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/sf-symbols/">SF Symbols</a></li> </ul> </div> </div> <div class="footer-directory-column"> <input class="footer-directory-column-section-state" type="checkbox" id="footer-directory-column-section-state-topics" /> <div class="footer-directory-column-section"> <label class="footer-directory-column-section-label" for="footer-directory-column-section-state-topics"> <h3 class="footer-directory-column-section-title">Topics & Technologies</h3> </label> <a href="#footer-directory-column-section-state-topics" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-open"> <span class="footer-directory-column-section-anchor-label">Open Menu</span> </a> <a href="#" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-close"> <span class="footer-directory-column-section-anchor-label">Close Menu</span> </a> <ul class="footer-directory-column-section-list"> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/accessibility/">Accessibility</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/accessories/">Accessories</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/app-extensions/">App Extensions</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/app-store/">App Store</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/audio/">Audio & Video</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/augmented-reality/">Augmented Reality</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/design/">Design</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/distribute/">Distribution</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/education/">Education</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/fonts/">Fonts</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/games/">Games</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/health-fitness/">Health & Fitness</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/in-app-purchase/">In-App Purchase</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/localization/">Localization</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/maps/">Maps & Location</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/machine-learning/">Machine Learning</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="https://opensource.apple.com">Open Source</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/security/">Security</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/safari/">Safari & Web</a></li> </ul> </div> </div> <div class="footer-directory-column"> <input class="footer-directory-column-section-state" type="checkbox" id="footer-directory-column-section-state-resources" /> <div class="footer-directory-column-section"> <label class="footer-directory-column-section-label" for="footer-directory-column-section-state-resources"> <h3 class="footer-directory-column-section-title">Resources</h3> </label> <a href="#footer-directory-column-section-state-resources" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-open"> <span class="footer-directory-column-section-anchor-label">Open Menu</span> </a> <a href="#" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-close"> <span class="footer-directory-column-section-anchor-label">Close Menu</span> </a> <ul class="footer-directory-column-section-list"> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/documentation/">Documentation</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/learn/">Tutorials</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/download/">Downloads</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/forums/">Forums</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/videos/">Videos</a></li> </ul> </div> <input class="footer-directory-column-section-state" type="checkbox" id="footer-directory-column-section-state-support" /> <div class="footer-directory-column-section"> <label class="footer-directory-column-section-label" for="footer-directory-column-section-state-support"> <h3 class="footer-directory-column-section-title">Support</h3> </label> <a href="#footer-directory-column-section-state-support" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-open"> <span class="footer-directory-column-section-anchor-label">Open Menu</span> </a> <a href="#" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-close"> <span class="footer-directory-column-section-anchor-label">Close Menu</span> </a> <ul class="footer-directory-column-section-list"> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/support/articles/">Support Articles</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/contact/">Contact Us</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/bug-reporting/">Bug Reporting</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/system-status/">System Status</a></li> </ul> </div> <input class="footer-directory-column-section-state" type="checkbox" id="footer-directory-column-section-state-account" /> <div class="footer-directory-column-section"> <label class="footer-directory-column-section-label" for="footer-directory-column-section-state-account"> <h3 class="footer-directory-column-section-title">Account</h3> </label> <a href="#footer-directory-column-section-state-account" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-open"> <span class="footer-directory-column-section-anchor-label">Open Menu</span> </a> <a href="#" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-close"> <span class="footer-directory-column-section-anchor-label">Close Menu</span> </a> <ul class="footer-directory-column-section-list"> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/account/">Apple Developer</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="https://appstoreconnect.apple.com/">App Store Connect</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/account/ios/certificate/">Certificates, IDs, & Profiles</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="https://feedbackassistant.apple.com/">Feedback Assistant</a></li> </ul> </div> </div> <div class="footer-directory-column"> <input class="footer-directory-column-section-state" type="checkbox" id="footer-directory-column-section-state-programs" /> <div class="footer-directory-column-section"> <label class="footer-directory-column-section-label" for="footer-directory-column-section-state-programs"> <h3 class="footer-directory-column-section-title">Programs</h3> </label> <a href="#footer-directory-column-section-state-programs" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-open"> <span class="footer-directory-column-section-anchor-label">Open Menu</span> </a> <a href="#" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-close"> <span class="footer-directory-column-section-anchor-label">Close Menu</span> </a> <ul class="footer-directory-column-section-list"> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/programs/">Apple Developer Program</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/programs/enterprise/">Apple Developer Enterprise Program</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/app-store/small-business-program/">App Store Small Business Program</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="https://mfi.apple.com/">MFi Program</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/programs/news-partner/">News Partner Program</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/programs/video-partner/">Video Partner Program</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/security-bounty/">Security Bounty Program</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/programs/security-research-device/">Security Research Device Program</a></li> </ul> </div> <input class="footer-directory-column-section-state" type="checkbox" id="footer-directory-column-section-state-events" /> <div class="footer-directory-column-section"> <label class="footer-directory-column-section-label" for="footer-directory-column-section-state-events"> <h3 class="footer-directory-column-section-title">Events</h3> </label> <a href="#footer-directory-column-section-state-events" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-open"> <span class="footer-directory-column-section-anchor-label">Open Menu</span> </a> <a href="#" class="footer-directory-column-section-anchor footer-directory-column-section-anchor-close"> <span class="footer-directory-column-section-anchor-label">Close Menu</span> </a> <ul class="footer-directory-column-section-list"> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/events/">Meet with Apple</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/events/developer-centers/">Apple Developer Centers</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/app-store/app-store-awards/">App Store Awards</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/design/awards/">Apple Design Awards</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/academies/">Apple Developer Academies</a></li> <li class="footer-directory-column-section-item"><a class="footer-directory-column-section-link" href="/wwdc/">WWDC</a></li> </ul> </div> </div> <!--googleon: all--> </nav> <section class="footer-mini" vocab="http://schema.org/" typeof="Organization"> <div class="footer-mini-news"> <div class="copy"> Get the <a href="https://apps.apple.com/us/app/apple-developer/id640199958">Apple Developer app</a>. </div> <div class="content"> <div class="color-scheme-toggle" role="radiogroup" tabindex="0" aria-label="Select a color scheme preference"> <label data-color-scheme-option="light"> <input type="radio" value="light" autocomplete="off" onchange="window.setPreferredColorScheme(event.target.value)" /> <div class="text">Light</div> </label> <label data-color-scheme-option="dark"> <input type="radio" value="dark" autocomplete="off" onchange="window.setPreferredColorScheme(event.target.value)" /> <div class="text">Dark</div> </label> <label data-color-scheme-option="auto"> <input type="radio" value="auto" autocomplete="off" onchange="window.setPreferredColorScheme(event.target.value)" /> <div class="text">Auto</div> </label> </div> <script async src="/assets/scripts/color-scheme-toggle.js"></script> </div> </div> <link rel="stylesheet" href="/assets/styles/language-dropdown.css?17182448067"> <div class="language-dropdown dropdown-container legacy-form hidden"> <select class="dropdown" aria-label="Language Dropdown"></select> <span class="dropdown-icon icon icon-chevrondown" aria-hidden="true"></span> </div> <script src="/assets/scripts/language-dropdown.js?17182448067"></script> <div class="footer-mini-legal"> <div class="footer-mini-legal-copyright">Copyright © 2025 <a href="https://www.apple.com">Apple Inc.</a> All rights reserved.</div> <div class="footer-mini-legal-links"> <a class="footer-mini-legal-link" href="https://www.apple.com/legal/internet-services/terms/site.html" class="first">Terms of Use</a> <a class="footer-mini-legal-link" href="https://www.apple.com/legal/privacy/">Privacy Policy</a> <a class="footer-mini-legal-link" href="/support/terms/">Agreements and Guidelines</a> </div> </div> </section> </div> </footer> </body> </html>