Mac GUI应用程序如何在不使用Sparkle的情况下重新启动自己?
How can a Mac GUI app relaunch itself without using Sparkle?
我正在给Mac程序添加一个功能,删除它的preferences .plist文件,然后用有效的"出厂设置"重新启动。然而,这方面的客户对使用像Sparkle这样的外部框架持怀疑态度。我在网上找了一些示例代码,但其中大部分似乎过于复杂(例如,在NSApplication中添加一个类别)。此外,当你不能使用一些api从非GUI进程启动GUI进程时,其中一些在Lion或更高版本中根本无法工作。
那么是否有一种简单的方法可以让Mac GUI应用程序重新启动?
至少对于Mountain Lion来说,fork/exec的一个稍微花哨的版本工作得很好:
void RelaunchCurrentApp()
{
// Get the path to the current running app executable
NSBundle* mainBundle = [NSBundle mainBundle];
NSString* executablePath = [mainBundle executablePath];
const char* execPtr = [executablePath UTF8String];
#if ATEXIT_HANDLING_NEEDED
// Get the pid of the parent process
pid_t originalParentPid = getpid();
// Fork a child process
pid_t pid = fork();
if (pid != 0) // Parent process - exit so atexit() is called
{
exit(0);
}
// Now in the child process
// Wait for the parent to die. When it does, the parent pid changes.
while (getppid() == originalParentPid)
{
usleep(250 * 1000); // Wait .25 second
}
#endif
// Do the relaunch
execl(execPtr, execPtr, NULL);
}
我遇到了一个问题,那就是重新启动的应用程序可能会在后台结束。在执行早期这样做可以修复这个问题:
[[NSApplication sharedApplication] activateIgnoringOtherApps : YES];
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在C++中如何在没有pow的情况下进行基础计算
- 松弛原子与无同步情况下的记忆连贯性
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- Mac GUI应用程序如何在不使用Sparkle的情况下重新启动自己?