Как приложение Mac GUI может перезапустить себя без использования Sparkle?

Я добавляю функцию в программу Mac, чтобы удалить ее файл настроек .plist, а затем перезапустить с тем, что фактически является «заводскими настройками». Тем не менее, клиент для этого опасается использовать внешние фреймворки, такие как Sparkle. Я искал в Интернете пример кода, но большая его часть кажется слишком сложной (например, добавление категории в NSApplication). Кроме того, некоторые из них просто не будут работать в Lion или более поздних версиях, когда вы не можете использовать некоторые API для запуска процесса с графическим интерфейсом из процесса без графического интерфейса.

Так есть ли простой способ перезапустить приложение Mac GUI?

2

Решение

По крайней мере, для 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];
9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]