如何修改Dock偏好设置中minimize-to-application参数的值
CoreDockSetPreferences调用未生效解决方法
查找CoreDockPreferences相关资料时,找到了私有系统API coredock.h,尝试使用CoreDockSetPreferences修改Minimize To App的取值时调用未生效。
原始实现代码
Objective-C接口与实现
@interface Symbolic : NSObject extern void CoreDockSetPreferences(CFDictionaryRef preferenceDict); - (void) setDictionaryDock: (CFDictionaryRef)dockDict; @end @implementation Symbolic -(void) setDictionaryDock: (CFDictionaryRef)dockDict { CoreDockSetPreferences(dockDict); } @end
Swift调用代码
func dockPrefChange(){ if let dir = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first { let dockPlistPath = dir.appendingPathComponent("Preferences", isDirectory: true).appendingPathComponent("com.apple.dock.plist", isDirectory: false) guard let dockDictionary = NSMutableDictionary(contentsOf: dockPlistPath) else {return} dockDictionary["minimize-to-application"] = 1 Symbolic().setDictionaryDock(dockDictionary as CFDictionary) } }
问题原因与修复方案
问题根因
- 未链接CoreDock私有框架,运行时无法找到
CoreDockSetPreferences符号,调用为空执行 - 传入了全量的Dock配置字典,接口仅接收需要修改的增量键值对,全量字典包含无效字段会被直接拦截
- 未触发Dock进程配置重载,即使配置写入成功也不会立刻生效
修复步骤
- 在项目构建配置的Link Binary With Libraries中添加
/System/Library/PrivateFrameworks/CoreDock.framework - 修改Swift调用逻辑,仅传入需要修改的键值对,调用完成后主动触发配置重载:
func dockPrefChange(){ // 仅传入需要修改的键值对即可 let modifyDict = ["minimize-to-application": 1] as CFDictionary Symbolic().setDictionaryDock(modifyDict) // 方案1:重启Dock触发配置生效 let task = Process() task.launchPath = "/usr/bin/killall" task.arguments = ["Dock"] task.launch() // 方案2:发送通知触发重载,不需要杀进程 // CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), // CFNotificationName("com.apple.dock.preferencesChanged" as CFString), // nil, nil, true) }
内容的提问来源于stack exchange,提问作者a_kira
相关产品推荐
相关产品推荐

