【发布时间】:2016-04-09 01:10:34
【问题描述】:
我正在使用以下功能更新壁纸:
- (void)updateWallpaper: (NSString *)path {
NSError * aerror;
NSURL *url = [[NSURL alloc] init];
url = [NSURL fileURLWithPath:path];
[[NSWorkspace sharedWorkspace] setDesktopImageURL:url forScreen:[NSScreen mainScreen] options:[NSDictionary dictionary] error:&aerror];
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary* desktopDict = [NSMutableDictionary dictionaryWithDictionary:[defaults persistentDomainForName:@"com.apple.desktop"]];
NSMutableDictionary* bgDict = [desktopDict objectForKey:@"Background"];
NSMutableDictionary* spaces = [bgDict objectForKey:@"spaces"];
[spaces enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSMutableDictionary* obj, BOOL *stop) {
[obj enumerateKeysAndObjectsUsingBlock:^(id key, NSMutableDictionary* prefs, BOOL *stop) {
[prefs setObject:path forKey:@"ImageFilePath"];
[prefs setObject:path forKey:@"NewImageFilePath"];
[prefs setObject:@"Never" forKey:@"Change"];
}];
}];
//NSLog(@"%@", desktopDict);
[defaults setPersistentDomain:desktopDict forName:@"com.apple.desktop"];
if ([defaults synchronize] == NO) {
NSLog(@"synchronize failed");
}
}
但是,更新并不总是呈现,因为旧图像会继续保留。我尝试了各种解决方法,我能想到的最好的方法是将图像写入一个新文件(新文件路径)以进行每次更新。这在我在桌面空间工作时有效,但在我在其他一些全屏应用程序空间工作时无效。解决此问题的唯一方法是重新加载扩展坞(system ("/usr/bin/killall Dock");)。这以某种方式重新绘制了两者之间的壁纸。但这会导致所有应用程序的所有最小化窗口都未最小化,这对我的使用来说是不合适的。有没有其他方法可以加强更新?
【问题讨论】:
-
作为一个简单的解决方案,您可以使用AppleScript:
tell application "Finder" to set desktop picture to "<file name>" as alias。请参阅this answer,了解如何在您的应用程序中包含 AppleScript。本文档中更详细的方法:developer.apple.com/library/mac/technotes/tn2084/_index.html -
这让我印象深刻,最好在 Apple 上提交错误并让他们修复它;这是他们的错误。
-
@Monolo 这样做了,没有帮助。同样的场景。
-
似乎别名文件 ref 在 El Capitan 中对此不起作用。请参阅我的答案以了解适合我的方法。
-
您找到解决方案了吗?我什至无法让 persistentDomainForName("com.apple.desktop") 返回非零值。
标签: objective-c xcode macos cocoa