expansion Juste sur la réponse de Julia, puisque je devais redémarrer mon App Pour une autre raison que la mise à jour, j'ai examiné comment Sparkle le fait -
La dernière version (datée du 11/2011) de Sparkle a une cible de projet appelée finish_installation.app qui est incluse dans le répertoire Resources du framework Sparkle. Étincelle, en cours d'exécution dans le cadre de l'hôte App, copies finish_application au répertoire application_support et utilise lancé pour exécuter son binaire exécutable comme celui-ci, en passant dans l'ID de processus hôte et relancer chemin:
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];
On dirait avec cette fonction, lorsque le processus parent se ferme (?), le parent de finish_application est lancé.
finish_installation attend le passé dans l'ID de processus à disparaître, a également une vérification initiale pour voir si son parent est lancé (pid = 1)
if(getppid() == 1)...
if (GetProcessForPID(parentprocessid, &psn) == procNotFound)...
lance alors l'application avec:
[[NSWorkspace sharedWorkspace] openFile: appPath];
Dernière information intéressante: si l'installation prend beaucoup de temps, finish_installation se transforme en un processus de premier plan afin que l'utilisateur peut voir que certains app fonctionne:
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
Je pourrais finir par suivre les conseils de cet article, même si je ne suis toujours pas satisfait d'un processus séparé pour le relancer. http://13bold.com/tutorials/relaunching-your-application/ – slycrel