Просто расширение на ответ Джулии, так как мне пришлось перезагрузить приложение по другой причине, чем обновление, я посмотрел, как это работает 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);
Я могу в конечном итоге следовать совету этой статьи, хотя мне все еще не нравится отдельный процесс перезапуска. http://13bold.com/tutorials/relaunching-your-application/ – slycrel 2010-11-25 00:02:39