Можно ли установить фасад и ключ, принадлежащие NSTask? - PullRequest
1 голос
/ 27 января 2012

Я работаю над приложением для Mac, которое дополнительно предоставляет возможность установки дополнительного программного обеспечения в формате пакета Apple. Этот пакет требует повышенных (root) привилегий для установки, и вместо того, чтобы беспокоиться о вспомогательном инструменте или AuthorizationExecuteWithPrivileges(), я подумал, что было бы проще использовать NSTask для вызова /usr/bin/open или даже /System/Library/CoreServices/Installer.app/Contents/MacOS/Installer с путем к пакету и пусть он обрабатывает авторизацию пользователя.

Итак, все работает отлично, но окно установщика не появляется в передней части стека и не является ключевым. Я могу orderOut вызвать окно перед запуском задачи, и это поможет с упорядочением, но ключ действительно будет, ну, в общем, сделать его ключом.

Должен ли я просто реализовать и внедрить Apple BetterAuthorizationSample, поскольку, вероятно, мне придется использовать ее в будущем, и поскольку она станет лучшим вариантом для попытки?

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Есть две переменные, которые определяют, какое окно является ключевым. Одним из них является параметр в приложении, который определяет, какое из его окон находится в фокусе, а другой - какое приложение активно. Скрытие окон в нашем собственном приложении сделает установщик видимым, но он не станет ключевым, если вы не сделаете приложение установщика активным. У вас есть несколько вариантов сделать это.

Во-первых, вы можете деактивировать свое приложение, используя:

[[NSApplication sharedApplication] deactivate];

Далее вы можете найти NSRunningApplication для установщика и активировать его:

NSArray *apps = [[NSWorkspace sharedWorkspace] runningApplications];
NSRunningApplication *app = // find installer
[app activateWithOptions:0];

Но в вашем случае я бы порекомендовал использовать NSWorkspace, чтобы открыть программу установки вместо вас, вместо запуска через NSTask. NSWorkspace автоматически деактивирует ваше приложение, поэтому вам не нужно делать это, вы получите отзыв о том, был ли файл открыт успешно, и автоматически выбрано приложение для его открытия.

BOOL success = [[NSWorkspace sharedWorkspace] openFile:@"path/to/file.pkg"];
0 голосов
/ 04 февраля 2012

Вы можете принудительно запустить процесс в начале кода, включив следующий код в обработчик applicationDidFinishLaunching:

ProcessSerialNumber process;
GetCurrentProcess(&process);
SetFrontProcess(&process);

Это сделает его самым передовым процессом, независимо от чего-либо еще.Вам нужно будет связаться с Carbon, хотя.

...