2010-11-24 6 views
3

Sous OS X, comment puis-je redémarrer automatiquement mon application après avoir mis à jour une version mise à jour? J'ai regardé autour de moi et launchd semble être la meilleure façon de le faire, mais je n'arrive pas à comprendre. Je n'arrive pas à trouver de bonnes ressources pour en parler spécifiquement.redémarrer mon application après une mise à jour automatique?

Je pourrais également créer un script ou un processus séparé pour le faire, mais cela semble maladroit au mieux, je m'attends à ce qu'il y ait une meilleure solution là-bas.

+0

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

Répondre

3

processus distinct est une bonne solution, regardez cadre Sparkle (la plupart des applications utilisent pour mise à jour automatique), ils utilisent aussi pour cette application autonome - https://github.com/andymatuschak/Sparkle/blob/master/relaunch.m

+0

Merci pour la tête à propos de sparkle Julia, ça a l'air intéressant. Si je dois opter pour la procédure séparée, je vous marquerai comme ma réponse. Espérer quelque chose sans avoir à écrire une application séparée si. – slycrel

+1

Ne pas réinventer la roue. Utilisez Sparkle. C'est une solution éprouvée, utilisée par des milliers d'applications tierces sur OS X. – Yuji

2

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); 
Questions connexes