2010-11-24 5 views
3

В OS X как я могу автоматически перезапустить приложение после вытаскивания обновленной версии?перезапустить мое приложение после автоматического обновления?

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

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

+0

Я могу в конечном итоге следовать совету этой статьи, хотя мне все еще не нравится отдельный процесс перезапуска. http://13bold.com/tutorials/relaunching-your-application/ – slycrel 2010-11-25 00:02:39

ответ

3

Отдельный процесс хорошее решение, обратите внимание на рамки Искра (большинство приложений используют его для автообновление), они также используют для этого автономного приложения - https://github.com/andymatuschak/Sparkle/blob/master/relaunch.m

+0

Спасибо, что хватало головы за блеск Джулии, это выглядит интересно. Если мне нужно идти по отдельному процессу, я буду отмечать вас как мой ответ. Надеюсь на что-то, не имея необходимости писать отдельное приложение. – slycrel 2010-11-24 23:53:16

2

Просто расширение на ответ Джулии, так как мне пришлось перезагрузить приложение по другой причине, чем обновление, я посмотрел, как это работает Sparkle -

В последней версии (начиная с 11/2011) Sparkle есть цель проекта, называемая finish_installation.app, которая включена в директорию Resources в инфраструктуре Sparkle. Искорка, работает как часть хост-приложения, копии finish_application в каталог application_support и использует запущен, чтобы запустить его двоичный исполняемый файл, как это, передавая в процессе идентификатор хоста и перезапустить путь:

NSString *relaunchToolPath = [NSString stringWithFormat:@"%@/finish_installation.app/Contents/MacOS/finish_installation", tempDir]; 
[NSTask launchedTaskWithLaunchPath: relaunchToolPath arguments:[NSArray arrayWithObjects:pathToRelaunch, [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]], tempDir, relaunch ? @"1" : @"0", nil]]; 
[NSApp terminate:self]; 

Похоже с этой функцией, когда родительский процесс завершает работу (?), родитель finish_application запускается.

finish_installation ждет переданному в идентификатор процесса, чтобы исчезнуть, также имеет начальную проверку, чтобы увидеть, если это родительская запускается (ИДП = 1)

if(getppid() == 1)... 
if (GetProcessForPID(parentprocessid, &psn) == procNotFound)... 

запускает приложение с:

[[NSWorkspace sharedWorkspace] openFile: appPath]; 

Последний интересный лакомый кусочек: если установка занимает много времени, функция finish_installation сама переходит на передний план, чтобы пользователь мог видеть, что какое-то приложение запущено:

ProcessSerialNumber  psn = { 0, kCurrentProcess }; 
TransformProcessType(&psn, kProcessTransformToForegroundApplication); 
Смежные вопросы