【问题标题】:Cocoa button opens a System Preference pageCocoa 按钮打开系统偏好设置页面
【发布时间】:2011-10-02 21:57:38
【问题描述】:

在 OSX Cocoa 应用程序中,我想要一个可以打开“语音”首选项窗格的按钮。那可能吗?我只是想为他们节省时间去系统偏好设置>语音>文本到语音

【问题讨论】:

    标签: cocoa macos preferences


    【解决方案1】:

    以下是一种相当简单(且可靠)的方法,至少可以让 Speech.prefPane 的系统偏好设置打开:

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

    但是,它不一定会切换到Text to Speech 标签,而是用户选择的最后一个标签。

    实际上也可以切换到“文本到语音”选项卡,但它涉及的更多。您可以使用 AppleScript 向系统偏好设置应用程序发送命令,但使用 ScriptingBridge.framework(参见 Scripting Bridge Programming Guide)要快得多。

    您需要将ScriptingBridge.framework 添加到您的项目中,然后在终端中使用如下命令生成SBSystemPreferences.h 头文件以供使用:

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

    SBSystemPreferences.h 标头添加到您的项目中,然后将 -openSpeechPrefs: 更改为以下内容:

    - (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];
            }
        }
    }
    

    编辑:

    使用 ScriptingBridge.framework 方法的示例项目: http://github.com/NSGod/OpenSystemPrefsTTS

    【讨论】:

    • 我在终端输入了sdef 命令,得到以下错误和警告:sdp: error: class "pane" inherits from undefined class "item". sdp: error: class "anchor" inherits from undefined class "item". 所以我无法获取头文件。
    • @NSGod 小牛队。而且我发现虽然有错误和警告,但你会得到标题。
    • 此方法不适用于沙盒应用。至少在优胜美地
    • 对于优胜美地,您只需执行以下操作:x-apple.systempreferences://Speech
    【解决方案2】:

    对于遇到我在评论中提到的相同问题的人,只需转到~/Desktop(因为我指定了这个位置),您就会看到SBSystemPreferences.h 已创建。

    但是,在此标头中,缺少一些类声明。所以你必须明确地添加这个声明。

    在我的例子中,“项目”类是未定义的。所以添加这个: @class SBSystemPreferencesItem;

    然后编译一下,看看还缺少什么,需要添加哪个声明。

    【讨论】:

      【解决方案3】:

      人们甚至可以在首选项窗格中选择特定的子项目。 这是在隐私窗格下选择相机的示例:

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

      一些功劳归于以下网站:https://macosxautomation.com/system-prefs-links.html

      供参考的 URL 列表(*针对 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
      

      这一切都归功于在preferencePane 中的Info.plist + System Preferences.app 中的CFBundleURLTypes (CFBundleURLSchemes) x-apple.systempreferences (Info.plist) 中的键

      NSPrefPaneAllowsXAppleSystemPreferencesURLScheme

      从 10.15 开始,一些密钥位于 PrivacyTCCServices.plist (Security.prefPane) 中

      从 10.14 Mojave 开始,一些隐私密钥不再存在。 Mojave隐私列表:

      Catalina 隐私列表:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多