自动更新后重新启动我的应用程序?
在OS X中,如何在下拉更新的版本后自动重新启动我的应用程序?自动更新后重新启动我的应用程序?
我环顾了一些人,似乎是这样做的可能方式,但我似乎无法摆脱它的困扰。我似乎无法找到任何有关这方面的优秀资源。
我也可以创建一个脚本或单独的过程来做到这一点,但这似乎很笨重,我期待有一个更好的解决方案。
单独的进程是很好的解决方案,看看旌宇框架(大多数应用程序都使用它autoupdating),他们也用这个独立的应用程序 - https://github.com/andymatuschak/Sparkle/blob/master/relaunch.m
感谢朱莉娅闪耀的头像,它看起来很有趣。如果我必须去单独的流程路线,我会将您标记为我的答案。希望有一些东西,而不必编写一个单独的应用程序。 – slycrel 2010-11-24 23:53:16
刚上Julia的回答扩大,因为我不得不重新启动我的应用程序除了更新之外,我还研究了Sparkle如何实现它 -
Sparkle的最新版本(截至2011年11月)有一个名为finish_installation.app的项目目标,它包含在Sparkle框架的Resources目录中。旌宇,运行在主机应用程序的一部分,副本finish_application到application_support目录和使用启动运行它的二进制可执行这样,通过在主机进程ID和重新启动路径:
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等待的进程ID传递到消失,也有一个初步的检查,看看它的父启动(PID = 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