Where should a daemon started by launchd store its data?

When I develop UI application for OSX I store user's preferences and application config to ~/Library/Preferences/AppName.plist (using NSUserDefaults).

But when I create global background daemon that will be running using launchd on behalf of root - what is the better place to store daemon's config?

On Linux I would put it to the /etc/ directory, but I'm not sure I can do the same on Mac.


Dynamic Paths

On macOS, a process asks the operating system where to save specific types of files using the NSWorkspace method URLForDirectory:inDomain:appropriateForURL:create:error:. There is a CoreFoundation C equivalent function for this method.

This approach mimics the goals of the XDG Base Directory Specification on other platforms.

Typically /Library, however…

Before macOS 10.15, computer wide processes, such as daemons, used the /Library folder structure:

  • For preferences: /Library/Preferences/
  • For cached files: /Library/Cache/
  • For general support and runtime files: /Library/Application Support/

See What is the purpose of each folder under /Library and /System in Mac OS X? for a good overview of the various folders and their intended purpose.

However, macOS 10.15 changes the file structure and limits large parts of the core system read-only. Shipping with fixed file paths and assuming those paths to have read-write access is risky.