Make Anything Into an App on macOS
If you've used macOS/MacOSX and never poked around the structure of an App, I have some mind-blowing information for you: it's just a folder. A folder with more folders, in fact!
How macOS Apps Work
The basic structure of a macOS app is a-like so:
- MyCool.app/
+ Contents/
+ Info.plist
+ MacOS/
+ CoolApp
+ Resources/
+ AppIcon.icns
+ SomeOtherJunk.txt
This isn't just specific to applications! Kernel extensions, some plugins, and frameworks also follow this "actually a directory" format. These are called Bundles.[1]
Components of an App Bundle
Info.plist
The core component to a bundle is its Info.plist
. All usable keys are provided in Apple Developer docs[2], but these should get you started:
<?xml version="1.0" encoding="UTF-8">
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>xyz.datagirl.cool-app</string>
<!-- arbitrary, set by Xcode. prolly don't change it -->
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<!--
This can only be up to 15 characters! Use CFBundleDisplayName if you
need a longer version for Siri and the sort.
-->
<key>CFBundleName</key>
<string>CoolApp</string>
<key>CFBundleVersion</key>
<string>1.0.69</string>
<!-- relative to Resources/ -->
<key>CFBundleIconFile</key>
<string>AppIcon.icns</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>
<!-- relative to MacOS/. technically should be the same as your .app name -->
<key>CFBundleExecutable</key>
<string>CoolApp</string>
<!-- APPL = we're an App -->
<key>CFBundlePackageType</key>
<string>APPL</string>
<!-- Do we support Retina? (idk if this matters for our purposes) -->
<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>
The program itself
Make a program named the same as what you set CFBundleExecutable
to in your Info.plist. This can be a macOS binary, or interpreted code, such as a shell script. You'll need to make sure it's executable, of course. Save it to the Contents/MacOS
directory in your app.
App Icon
Generating an ICNS file is an exercise left to the reader.[3] Once you have it, save it with the same name you set as CFBundleIconFile
in the Contents/Resources
directory in your app.
Notes
- ↑ About Bundles, from the Bundle Programming Guide by Apple.
- ↑ Bundle configuration, from Apple Developer Documentation.
- ↑ But this gist worked well for me.