2013-02-20 3 views
0

У меня есть плагин NPAPI для MAC, который загружает и запускает приложение с сервера.COCOA: Приложите приложение к фронту, запущенному из плагина NPAPI

Когда я использую NSTask для открытия приложения. Приложение не выходит на передний план.

NSBundle *bundle = [NSBundle bundleWithPath:AppPath]; 
NSString *path = [bundle executablePath]; 
NSTask *task = [[NSTask alloc] init]; 
NSArray *arguments; 
arguments = [NSArray arrayWithObjects:AppParam,nil]; 

[task setLaunchPath:path]; 
[task setArguments:arguments]; 
[task launch]; 

Я искал решение и придумал код

int pid = [task processIdentifier]; 
ProcessSerialNumber psn; 
GetProcessForPID(pid, &psn); 
SetFrontProcess(&psn); 

но этот код не приносит приложения на фронт, то я попытался следующий код.

NSRunningApplication *runapp = [NSRunningApplication runningApplicationWithProcessIdentifier:pid]; 
[runapp activateWithOptions:0]; 

Это не дало желаемого результата.

После некоторых поисков я столкнулся с сообщениями, в которых предлагалось использовать NSWorkspace для запуска и активации приложения. Я придумал код.

[workspace 
    launchApplicationAtURL:[bundle bundleURL] 
    options:NSWorkspaceLaunchNewInstance 
    configuration:[NSDictionary 
     dictionaryWithObject:arguments 
     forKey:NSWorkspaceLaunchConfigurationArguments] 
    error:error]; 

Это работает ОК, но не в одной ситуации. Когда приложение загружается и выполняется FIRST TIME командой NSworkspace, команды MAC с диалоговым окном «это приложение, загруженное из Интернета. Вы уверены, что хотите его открыть».

Если нажать OK, приложение запускается, но не выходит на передний план. Этот диалог появляется только в том случае, если приложение запускается через NSWorkspace. Запуск с помощью NSTask, MAC не запрашивает диалог перед выполнением.

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

Я также пробовал использовать.

[[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; 
[[NSWorkspace sharedWorkspace] activeApplication]; 

Любая помощь в этом была бы оценена. Заранее спасибо.

С уважением,

LazyCoder7.

ответ

2

Перед запуском приложения вы можете вручную снять флаг карантина с xattr, если вы хотите обойти это диалоговое окно и тем самым избежать проблем с фокусом, которые он создает.

(Этот вопрос на самом деле не имеет ничего общего с NPAPI, вы бы точно такой же набор поведения делают это от отдельного приложения.)

0

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

NSWorkspace будет запускаться в разрешениях пользовательского уровня. NSTask может устанавливать свою среду, даже если она по умолчанию соответствует родительскому процессу.

+0

Зависит от дизайна. Если это плагин NPAPI, который загружает приложения, написанные той же организацией, с сервера, которым управляет автор плагинов (можно надеяться, что это делается через https, так что это не может быть MiTM'd), а затем авторизация пользователя практически бессмысленна. В этом случае все это часть одной и той же сети доверия.Я согласен, что если это просто загрузка случайных приложений, снятие флага карантина - плохая идея. Но если это случайные приложения, загрузка и запуск их без вмешательства пользователя - это, во-первых, плохая идея, поэтому я предполагал, что это не так. – smorgan

+0

НЕТ это не случайное приложение. Его разработано тем же автором (ME) и для той же организации. Таким образом, загруженное приложение является частью сети доверия. – LazyCoder7

+0

Спасибо, что smorgan он работал как шарм .... – LazyCoder7

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