Ответ 1
Нет апи для установки одинаковых обоев для всех экранов или всех пространств, NSWorkspace setDesktopImageURL реализован так, что он устанавливает только обои для текущего пространства на текущем экране, так как это делают системные настройки.
Помимо изменчивого метода ручной модификации файла ~/Library/Preferences/com.apple.desktop.plist(формат может меняться) и использования уведомлений для его перезагрузки (сбой вы испытываете), то, что вы можете сделать, - установить обои в пробелы как пользователь переключается на него, например ищите NSWorkspaceActiveSpaceDidChangeNotification (если ваше приложение не всегда работает, вы можете сказать, что пользователь переключается на все пространства, на которые он хочет, чтобы обои были применены), возможно, эти методы не идеальны, но по крайней мере они нестабильны.
-(void)setWallpaper
{
NSWorkspace *sws = [NSWorkspace sharedWorkspace];
NSURL *image = [NSURL fileURLWithPath:@"/Library/Desktop Pictures/Andromeda Galaxy.jpg"];
NSError *err = nil;
for (NSScreen *screen in [NSScreen screens]) {
NSDictionary *opt = [sws desktopImageOptionsForScreen:screen];
[sws setDesktopImageURL:image forScreen:screen options:opt error:&err];
if (err) {
NSLog(@"%@",[err localizedDescription]);
}else{
NSNumber *scr = [[screen deviceDescription] objectForKey:@"NSScreenNumber"];
NSLog(@"Set %@ for space %i on screen %@",[image path],[self spaceNumber],scr);
}
}
}
-(int)spaceNumber
{
CFArrayRef windowsInSpace = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
for (NSMutableDictionary *thisWindow in (NSArray *)windowsInSpace) {
if ([thisWindow objectForKey:(id)kCGWindowWorkspace]){
return [[thisWindow objectForKey:(id)kCGWindowWorkspace] intValue];
}
}
return -1;
}