Jeff Johnson (My apps, PayPal.Me)

How to restore the Preferences menu item to macOS Ventura, Part 2

December 17 2022

This is a follow-up to my blog post from several months ago, How to restore the Preferences menu item to macOS Ventura. In that blog post, I explained how you could use the default NSMenuShouldUpdateSettingsTitle to control whether apps have the menu item title "Preferences…" or "Settings…" on Ventura. To restore pre-Ventura behavior for all apps, you could use this Terminal command:

defaults write -g NSMenuShouldUpdateSettingsTitle -bool NO

Unfortunately, Apple has continued and expanded its user hostility by completely removing NSMenuShouldUpdateSettingsTitle from Ventura. I'm not sure when this happened exactly, but it might have been in this week's macOS 13.1 update.

Since my blog post seems to be the primary source of information on the web about NSMenuShouldUpdateSettingsTitle, perhaps Apple removed the hidden preference because I made it public. This wouldn't be the first time that Apple changed OS behavior because of one of my blog posts. For example, the Safari extension toolbar icon tinting algorithm was changed after I published The Safari extension blues.

I've now looked at how Preferences/Settings works on macOS 13.1, and sadly I haven't found a way to revert to Preferences globally, for all apps. However, I have found a way to revert to Preferences for your own app. You need to subclass NSApplication and set NSPrincipalClass to your subclass in your Info.plist file. Then in your NSApplication subclass implementation, simply add this method as a no-op:

-(void) _updateSettingsMenuItemIfNeeded
{
    return;
}

Warning: _updateSettingsMenuItemIfNeeded is an Apple private method, so using it could get you rejected from the Mac App Store. But you're free to use it outside the Mac App Store.

Addendum

On reflection, there's actually a much easier way to restore the "Preferences…" menu item in your app that uses public API fully supported in the Mac App Store. You could even make your app logic check for the NSMenuShouldUpdateSettingsTitle user defaults key to control the behavior.

Just create a reference to the "Preferences…" item in the main menu, such as with an IBOutlet. In applicationWillFinishLaunching, store the menu item's (localized) title. Then in applicationDidFinishLaunching, reset the menu item's title. Easy! Not sure why I didn't think of that before. I must have been overthinking it.

Addendum 2

It's been brought to my attention by Randy Saldinger that macOS 13.1 no longer respects the SDK of the compiled app. Previously, the Preferences menu item was only changed to Settings if the app was compiled with the macOS 13 SDK. Now it happens to every app!

Jeff Johnson (My apps, PayPal.Me)