2016-01-05 2 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 и пусть они исправят это; это их ошибка. – 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

Смежные вопросы