Objective c 如何以编程方式更改停靠首选项?

Objective c 如何以编程方式更改停靠首选项?,objective-c,cocoa,macos,desktop,Objective C,Cocoa,Macos,Desktop,我是Cocoa/macOS编程新手。我刚刚发现NSUserDefaults可以用来更改应用程序/系统设置,就像defaults命令那样 但我不知道如何使这些设置更新 e、 例如,我使用NSUserDefaults将dock大小设置为32,并同步设置。但码头仍保留着旧的设置 即使我使用defaults write com.apple.dock tilesize 32更改其大小,它也不会更新,直到我注销并登录 是否有其他技术通知dock获取更新?我知道系统首选项可以做到这一点 谢谢大家! Mac O

我是Cocoa/macOS编程新手。我刚刚发现
NSUserDefaults
可以用来更改应用程序/系统设置,就像
defaults
命令那样

但我不知道如何使这些设置更新

e、 例如,我使用
NSUserDefaults
将dock大小设置为32,并同步设置。但码头仍保留着旧的设置

即使我使用
defaults write com.apple.dock tilesize 32
更改其大小,它也不会更新,直到我注销并登录

是否有其他技术通知dock获取更新?我知道系统首选项可以做到这一点


谢谢大家!

Mac OS X dock在关闭并重新启动之前不会重新加载其设置。与您必须通过终端手动更改其设置的方式相同(
defaults write com.apple.dock tilesize 32;killall dock
),您必须在代码中完成此操作。因此,在编写代码的
默认值
部分时,必须编写
kill
部分:

NSRunningApplication *dock = [NSRunningApplication runningApplicationWithBundleIdentifier:@"com.apple.dock"];
[dock terminate];

如果你想在不破坏码头的情况下做到这一点,对不起,但是你运气不好。虽然可能存在一个隐藏的API来强制dock动态地重新加载其设置,但在我的所有搜索中,我从未发现任何关于如何做到这一点的提示(在隐藏的分布式通知中心上没有发布通知,大多数应用程序无法相互交互).

您可以使用AppleScript通过编写系统首选项脚本来设置dock的某些属性,您可能想看看是否可以采用这种方法?也许从你的应用程序中调用一些AppleScript?

借助Xcode调试器的魔力和一些格式化的反汇编,我创建了这个简短的头文件,你可以粘贴到你的代码中(GitHub gist is)。函数名希望是自解释的

// TO USE THESE INTERFACES, you MUST link against ApplicationServices.framework.

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

    // Boolean preferences
    extern void CoreDockSetLaunchAnimationsEnabled(bool enable);
    extern void CoreDockSetMagnificationEnabled(bool enable);
    extern void CoreDockSetAutoHideEnabled(bool enable);
    extern void CoreDockSetMinimizeInPlace(bool enable);

    // Sets other preferences such as whether the indicators below the app icons are shown
    // 'preferenceDict' is a CFDictionary containing a magic key value
    // Will require further inspection of Dock.prefpane to find all the keys
    // (I haven't noted them down)
    extern void CoreDockSetPreferences(CFDictionaryRef preferenceDict);

#ifdef __cplusplus
} // extern "C"
#endif
以这种方式更新的首选项会立即反映出来,因为这些函数实际上在内部传递“com.apple.dock”马赫服务。
玩得开心

请注意:这些是专用系统API。提交到Mac App Store且使用这些API的任何应用都将被拒绝。另一方面,如果你没有应用商店的意图,那么使用这些界面是没有害处的。它们似乎从MacOSX诞生之初就已经存在,而且它们在不久的将来消失的可能性很小