2

Mac プログラムに機能を追加して、その設定 .plist ファイルを削除し、事実上「工場出荷時の設定」で再起動します。ただし、これに対する顧客は、Sparkle などの外部フレームワークの使用に慎重です。オンラインでサンプル コードを探しましたが、その多くは複雑すぎるようです (たとえば、NSApplication にカテゴリを追加するなど)。また、一部の API を使用して非 GUI プロセスから GUI プロセスを起動できない場合、Lion 以降では機能しないものもあります。

では、Mac GUI アプリ自体を再起動させる簡単な方法はありますか?

4

1 に答える 1

9

少なくとも 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];
于 2013-03-09T00:49:14.670 に答える