【问题标题】:Terminal not recognizing updated User Defaults终端无法识别更新的用户默认值
【发布时间】:2018-07-14 18:04:53
【问题描述】:

我正在尝试从 Mac OS 应用程序中更改屏幕截图的保存位置,但这似乎不起作用。

在终端中执行以下命令可以完美运行。正如预期的那样,所有屏幕截图都保存在名为 Screenshots 的文件夹中(位于我的桌面上)。

终端

defaults write com.apple.screencapture location ~/Desktop/Screenshots
killall SystemUIServer

每当我让我的应用程序执行以下 sn-p 时,com.apple.screencapture.plist 中的位置值将按预期更改。

Objective-C

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.apple.screencapture.plist"];

[defaults setValue:@"/Users/Maarten/Desktop/Screenshots" forKey:@"location"];
[defaults synchronize];

值改变后,我用终端运行killall SystemUIServer

但不知何故,此命令似乎不起作用,因为所有屏幕截图都保存在其先前定义的(默认)位置。

【问题讨论】:

  • 我自己已经想出了这个。我已经尝试了多个间隔,最多一分钟。没有任何变化。
  • defaults read com.apple.screencapture location 将导致新位置。在执行killall SystemUIServer之前和之后。
  • 是的,它确实存在。我注意到重新启动将接受更改,因此我假设必须有其他命令(除了killall SystemUIServer)来处理新值。
  • 不需要重新启动。有第三方实用程序可以立即进行此更改,而无需重新启动。您可以在终端中使用 defaultskillall 并且它可以工作但不能使用其他方法这一事实表明不需要重新启动。这里还有其他东西,不幸的是我不确定它是什么,因为我无法在相同的条件下进行测试。

标签: objective-c xcode macos terminal nsuserdefaults


【解决方案1】:

自 10.9(我认为)以来,操作系统会缓存您的首选项。要使缓存无效,您需要杀死cfprefsd。因此,首先,通过defaults 设置您的偏好,然后运行以下命令:

killall -u $USER cfprefsd

之后,您的偏好应该不需要重新启动或其他任何东西。

此外,您可以使用screencapture 指定特定屏幕截图的位置,而不是更改系统偏好设置。您也可以使用此工具指定其他参数。更多信息请使用man screencapture

最后,根据 Apple 的文档,synchronizeNSUserDefaults 来说是多余的:

同步

等待对默认数据库的任何挂起的异步更新 并返回;这种方法是不必要的,不应该使用。

【讨论】:

  • 非常有帮助,它完美地完成了这项工作。谢谢!
  • 这个命令似乎会使执行killAll SystemUIServer 过时。这是一个很好的额外。
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 2014-05-02
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 2016-08-21
相关资源
最近更新 更多