Я обновляю обои с помощью следующей функции:перерисовка фона рабочего стола без перезагрузки дока в 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");
). Это как-то перерисовывает обои между ними. Но это приводит к минимизации всех свернутых окон для всех приложений, что не подходит для моего использования. Есть ли другой способ укрепить обновление?
В качестве простого решения вы можете использовать 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
Это поражает меня как нечто вроде того, где лучше всего просто зарегистрировать ошибку на Apple и пусть они исправят это; это их ошибка. – bhaller
@Monolo сделал это, не помогает. Тот же сценарий. – arkanath