/ / Как мога да презаредя предпочитанията за com.apple.systemuiserver в приложението SystemUIServer? - цел-c, какао, macos, nstask

Как мога да презаредим предпочитанията на com.apple.systemuiserver в приложението SystemUIServer? - цел-c, какао, макос, nstask

За моето Mac OSX приложение, имам функция, коятопремахва системния часовник в горния десен ъгъл на екрана при натискане на бутон. Предпочитанията, които контролират кои системни менюта се показват (включително системния часовник), се съхраняват в ~ / Library / Preferences / com.apple.systemuiserver.plist. Успях да актуализирам съответните предпочитания в този файл, за да премахна системния часовник. Приложението SystemUIServer обаче трябва да се рестартира, така че новите предпочитания да могат да бъдат презаредени и часовникът да бъде премахнат. Ето кода, който използвах за рестартиране на SystemUIServer.

NSTask *killSystemUITask = [[NSTask alloc] init];
NSMutableArray *args = [NSMutableArray array];
[args addObject:@"SystemUIServer"];
[killSystemUITask setLaunchPath:@"/usr/bin/killall"];
[killSystemUITask setArguments:args];
[killSystemUITask launch];

Когато SystemUIServer е убит, OSX автоматичнорестартира. Горният код работи, но премахването на системния часовник не е толкова чисто, колкото бих искал. Цялата системна лента се премахва за секунда. Може ли някой да помисли за по-добър начин за презареждане на предпочитанията в SystemUIServer? В идеалния случай бих искал премахването на системния часовник да е толкова чисто, колкото функцията за показване на часовника в Предпочитанията за дата и час на приложението System Preferences.

Отговори:

2 за отговор № 1

Смятате ли да се опитате да управлявате панела prefизползвайки AppleEvents / OSAScript? Докато прозорецът Network prefs изглежда е единственият с напълно вграден скриптове, можете да управлявате всеки потребителски интерфейс със системни събития. Беше достатъчно лесно да се прототипира в AppleScript. Ето какво измислих:

tell application "System Preferences"
reveal pane "Date & Time"
reveal anchor "ClockPref" of pane "Date & Time"
tell application "System Events"
tell tab group 1 of window 1 of process "System Preferences"
repeat with cbIndex from 0 to count of checkboxes
tell checkbox cbIndex
if title contains "menu bar" then
click
exit repeat
end if
end tell
end repeat
end tell
end tell
quit
end tell

Можете да го използвате както е, като използватеNSAppleScript обект, или ако се чувствате мазохистично, можете да се потопите в подробностите, за да разберете само правилните AppleEvents за изпращане.

Плюсове: Лесно.

Против: Стартира системните предпочитания (които могат да се разглеждат като подскачащи в Dock), изисква „Активиране на достъпа за помощни устройства“, за да бъдат активирани (както и много други неща)

Трудно е да се каже дали това е така визуално по-добре или по-лошо, че убиването на SystemUIServer, но е почти разбира се по-добро за всички други компоненти, които могат да взаимодействат с SystemUIServer.

Що се отнася до това да се отървем от скачането на дока, това тук споменава как да накара нещата да се стартират без икона на док. Към това мога да добавя, че в миналото съм се карал с този проблем и решението, което измислих, беше на високо ниво:

  • Получете уникална / безопасна temp директория
  • Направете само твърди връзки само на огледалото на целия пакет от въпросната програма (pax -rwl ще помогне с това)
  • Заменете трудно свързания Info.plist с истинско копие на Info.plist
  • Редактирайте копието според указанията в другия въпрос. (Забележка: Има и други опции, освен настройка NSUIElement = true тук, но ги оставям като упражнение за читателя и google.)
  • Използвайте приложението от temp директорията
  • Изтрийте временната директория.

Този подход се оказа доста стабилен за мен, когатоопитвайки се да управлява приложения на трети страни. Предполагам, че в бъдеще може да се сблъскате с проблеми със системните приложения, които са подписани / запечатани. (Т.е. промяната на техния Info.plist променя сигнатурата, те могат да откажат да работят). изискват конкретно право или изключение, за да изпращат AppleEvents изобщо, но предполагам, че това важи и за процесите на системни убийства (ако това е възможно дори изобщо да се направи от приложение в печат).

И накрая, трябва подайте доклад за грешка с Apple да поискате първокласно API или scriptability за това, ако смятате, че е важно.