2016-01-05 94 views
0

重启坞我使用下面的函数更新壁纸:重绘桌面背景,而不在OS X

- (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

作为一个简单的解决方案,您可以使用AppleScript:'tell application“Finder” “将桌面图片设置为”“作为别名。请参阅[这个答案](http://stackoverflow.com/questions/4909702/run-applescript-from-cocoa-application)如何在您的应用程序中包含AppleScript。本文档中更详细的方法:https://developer.apple.com/library/mac/technotes/tn2084/_index.html – Monolo

+0

这让我觉得最好的方式就是向Apple提供一个bug,让他们修复它;这是他们的错误。 – bhaller

+0

@Monolo做到了,没有帮助。同样的情况。 – arkanath

回答

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的。

+0

这没有帮助。同样的情况仍然存在,如果我在全屏应用程序中工作,则不会呈现壁纸更改。 – arkanath