Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cocoa button opens a System Preference page

Tags:

In a OSX Cocoa app, I would like a button that would open the "speech" preference pane. Is that possible? I'm just trying to save them the time to go System Preferences > Speech > Text to Speech

like image 580
Nathan H Avatar asked Jul 11 '11 15:07

Nathan H


2 Answers

One can even select specific sub item inside a pref pane. Here is example to select Camera under Privacy pane:

NSURL *URL = [NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_Camera"]; [[NSWorkspace sharedWorkspace] openURL:URL]; 

Some credit goes to following site: https://macosxautomation.com/system-prefs-links.html

List of URLs for reference (*updated for macOS Big Sur & Catalina & Mojave):

Accessibility Preference Pane Main    x-apple.systempreferences:com.apple.preference.universalaccess Display x-apple.systempreferences:com.apple.preference.universalaccess?Seeing_Display Zoom    x-apple.systempreferences:com.apple.preference.universalaccess?Seeing_Zoom VoiceOver   x-apple.systempreferences:com.apple.preference.universalaccess?Seeing_VoiceOver Descriptions    x-apple.systempreferences:com.apple.preference.universalaccess?Media_Descriptions Captions    x-apple.systempreferences:com.apple.preference.universalaccess?Captioning Audio   x-apple.systempreferences:com.apple.preference.universalaccess?Hearing Keyboard    x-apple.systempreferences:com.apple.preference.universalaccess?Keyboard Mouse & Trackpad    x-apple.systempreferences:com.apple.preference.universalaccess?Mouse Switch Control  x-apple.systempreferences:com.apple.preference.universalaccess?Switch Dictation   x-apple.systempreferences:com.apple.preference.universalaccess?SpeakableItems  Security & Privacy Preference Pane Main    x-apple.systempreferences:com.apple.preference.security General x-apple.systempreferences:com.apple.preference.security?General FileVault   x-apple.systempreferences:com.apple.preference.security?FDE Firewall    x-apple.systempreferences:com.apple.preference.security?Firewall Advanced    x-apple.systempreferences:com.apple.preference.security?Advanced Privacy x-apple.systempreferences:com.apple.preference.security?Privacy Privacy-Camera x-apple.systempreferences:com.apple.preference.security?Privacy_Camera Privacy-Microphone  x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone Privacy-Automation  x-apple.systempreferences:com.apple.preference.security?Privacy_Automation Privacy-AllFiles    x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles Privacy-Accessibility   x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility Privacy-Assistive   x-apple.systempreferences:com.apple.preference.security?Privacy_Assistive Privacy-Location Services   x-apple.systempreferences:com.apple.preference.security?Privacy_LocationServices Privacy-SystemServices  x-apple.systempreferences:com.apple.preference.security?Privacy_SystemServices Privacy-Advertising x-apple.systempreferences:com.apple.preference.security?Privacy_Advertising Privacy-Contacts    x-apple.systempreferences:com.apple.preference.security?Privacy_Contacts Privacy-Diagnostics & Usage x-apple.systempreferences:com.apple.preference.security?Privacy_Diagnostics Privacy-Calendars   x-apple.systempreferences:com.apple.preference.security?Privacy_Calendars Privacy-Reminders   x-apple.systempreferences:com.apple.preference.security?Privacy_Reminders Privacy-Facebook    x-apple.systempreferences:com.apple.preference.security?Privacy_Facebook Privacy-LinkedIn    x-apple.systempreferences:com.apple.preference.security?Privacy_LinkedIn Privacy-Twitter x-apple.systempreferences:com.apple.preference.security?Privacy_Twitter Privacy-Weibo   x-apple.systempreferences:com.apple.preference.security?Privacy_Weibo Privacy-Tencent Weibo   x-apple.systempreferences:com.apple.preference.security?Privacy_TencentWeibo  macOS Catalina 10.15: Privacy-ScreenCapture   x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture Privacy-DevTools    x-apple.systempreferences:com.apple.preference.security?Privacy_DevTools Privacy-InputMonitoring x-apple.systempreferences:com.apple.preference.security?Privacy_ListenEvent Privacy-DesktopFolder   x-apple.systempreferences:com.apple.preference.security?Privacy_DesktopFolder Privacy-DocumentsFolder x-apple.systempreferences:com.apple.preference.security?Privacy_DocumentsFolder Privacy-DownloadsFolder x-apple.systempreferences:com.apple.preference.security?Privacy_DownloadsFolder Privacy-NetworkVolume   x-apple.systempreferences:com.apple.preference.security?Privacy_NetworkVolume Privacy-RemovableVolume x-apple.systempreferences:com.apple.preference.security?Privacy_RemovableVolume Privacy-SpeechRecognition   x-apple.systempreferences:com.apple.preference.security?Privacy_SpeechRecognition Privacy-DevTools    x-apple.systempreferences:com.apple.preference.security?Privacy_DevTools  macOS Big Sur 10.11/10.16: Privacy-Bluetooth   x-apple.systempreferences:com.apple.preference.security?Privacy_Bluetooth Privacy-Music   x-apple.systempreferences:com.apple.preference.security?Privacy_Media Privacy-Home    x-apple.systempreferences:com.apple.preference.security?Privacy_HomeKit   Dictation & Speech Preference Pane Dictation   x-apple.systempreferences:com.apple.preference.speech?Dictation Text to Speech  x-apple.systempreferences:com.apple.preference.speech?TTS Sharing Preference Pane Main    x-apple.systempreferences:com.apple.preferences.sharing Screen Sharing  x-apple.systempreferences:com.apple.preferences.sharing?Services_ScreenSharing File Sharing    x-apple.systempreferences:com.apple.preferences.sharing?Services_PersonalFileSharing Printer Sharing x-apple.systempreferences:com.apple.preferences.sharing?Services_PrinterSharing Remote Login    x-apple.systempreferences:com.apple.preferences.sharing?Services_RemoteLogin Remote Management   x-apple.systempreferences:com.apple.preferences.sharing?Services_ARDService Remote Apple Events x-apple.systempreferences:com.apple.preferences.sharing?Services_RemoteAppleEvent Internet Sharing    x-apple.systempreferences:com.apple.preferences.sharing?Internet Bluetooth Sharing   x-apple.systempreferences:com.apple.preferences.sharing?Services_BluetoothSharing  Software update x-apple.systempreferences:com.apple.preferences.softwareupdate?client=softwareupdateapp 

All this is possible thanks to key in Info.plist in preferencePane + CFBundleURLTypes (CFBundleURLSchemes) x-apple.systempreferences (Info.plist) in System Preferences.app

NSPrefPaneAllowsXAppleSystemPreferencesURLScheme

As of 10.15 some of the keys are located in PrivacyTCCServices.plist (Security.prefPane)

As of 10.14 Mojave some Privacy keys ceased to exists. Mojave privacy list:enter image description here

Catalina privacy list: enter image description here

like image 101
Marek H Avatar answered Jan 03 '23 11:01

Marek H


The following is a fairly easy (and reliable) way to at least get System Preferences open to the Speech.prefPane:

- (IBAction)openSpeechPrefs:(id)sender {     [[NSWorkspace sharedWorkspace] openURL:      [NSURL fileURLWithPath:@"/System/Library/PreferencePanes/Speech.prefPane"]]; } 

However, it won't necessarily be switched to the Text to Speech tab, but rather the last tab the user had selected.

It is possible to actually switch to the Text to Speech tab as well, but it's a bit more involved. You can use AppleScript to send commands to the System Preferences application, but using the ScriptingBridge.framework (See Scripting Bridge Programming Guide) is much faster.

You'll need to add the ScriptingBridge.framework to your project, and then use a command like the following in Terminal to generate a SBSystemPreferences.h header file to work with:

sdef "/Applications/System Preferences.app" | sdp -fh --basename SBSystemPreferences -o ~/Desktop/SBSystemPreferences.h

Add that SBSystemPreferences.h header to your project, then change -openSpeechPrefs: to the following:

- (IBAction)openSpeechPrefs:(id)sender {     SBSystemPreferencesApplication *systemPrefs =      [SBApplication applicationWithBundleIdentifier:@"com.apple.systempreferences"];      [systemPrefs activate];      SBElementArray *panes = [systemPrefs panes];     SBSystemPreferencesPane *speechPane = nil;      for (SBSystemPreferencesPane *pane in panes) {         if ([[pane id] isEqualToString:@"com.apple.preference.speech"]) {             speechPane = pane;             break;         }     }     [systemPrefs setCurrentPane:speechPane];      SBElementArray *anchors = [speechPane anchors];      for (SBSystemPreferencesAnchor *anchor in anchors) {         if ([anchor.name isEqualToString:@"TTS"]) {             [anchor reveal];         }     } } 

EDIT:

Sample project using the ScriptingBridge.framework method: http://github.com/NSGod/OpenSystemPrefsTTS

like image 21
NSGod Avatar answered Jan 03 '23 10:01

NSGod