我正在使用以下功能更新壁纸:
- (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");
)。这以某种方式重新绘制了两者之间的壁纸。但这会导致所有应用程序的所有最小化窗口的最小化,这对我的使用是不利的。还有其他方法可以加强更新吗?
答案 0 :(得分:0)
作为解决方法,您可以考虑使用AppleScript。它可能不是最优雅的解决方案,但将AppleScript集成到应用程序中是一种文档化的技术,因此它应该是安全的。
在OS X 10.11中,您可以使用一行脚本更改壁纸。请注意,您必须使用POSIX文件,别名似乎不起作用。
要从命令行进行测试,请在终端中尝试:
osascript -e 'tell application "Finder" to set desktop picture to POSIX file "<full path to image file>"'
This doc说明了如何在应用中使用AppleScript。