Как различать разные причины завершения работы приложения в Какао?

Я хотел бы, чтобы мое приложение запрашивало подтверждение перед закрытием, кроме, когда оно прерывается системой во время выключения или перезапуска (потому что, когда OS X пытается применить обновления безопасности в полночь, он застревает на "Are вы уверены? "сообщение).

Как я могу узнать, что послужило причиной прерывания? В [NSApp terminate:sender] отправитель всегда nil.

Моя первая мысль заключалась в том, чтобы спросить только тогда, когда активирован пункт главного меню «Выход», но пользователь также может завершить приложение из меню Dock или нажав Cmd + Q, удерживая Cmd + Tab, и я хотел бы запросить подтверждение в этих случаях тоже.


person Kornel    schedule 29.04.2014    source источник


Ответы (1)


Вы можете получить уведомление, когда система собирается выключиться, перезагрузиться или если пользователь просто выйдет из системы. Это не обычное уведомление, а уведомление рабочей области.

Вы можете зарегистрироваться для получения уведомления следующим образом:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    //...more code...

    self.powerOffRequestDate = [NSDate distantPast];
    NSNotificationCenter *wsnCenter = [[NSWorkspace sharedWorkspace] notificationCenter];
    [wsnCenter addObserver:self
                  selector:@selector(workspaceWillPowerOff:)
                      name:NSWorkspaceWillPowerOffNotification
                    object:nil];
}

в обработчике уведомлений просто сохраните дату:

- (void)workspaceWillPowerOff:(NSNotification *)notification
{
    self.powerOffRequestDate = [NSDate new];
}

Добавлять

@property (atomic,strong,readwrite) NSDate *powerOffRequestDate;

в соответствующее место.

когда ваше приложение получает запрос на завершение работы, вы должны получить эту дату и проверить, не отключится ли компьютер.

if([self.powerOffRequestDate timeIntervalSinceNow] > -60*5) {
    // shutdown immediately
} else {
    // ask user
}

Я выбрал интервал в 5 минут для следующего крайнего случая: компьютер должен выключиться, но другое приложение отменяет это. Ваше приложение все еще работает. Через 10 минут пользователь закрывает ваше приложение. В этом случае приложение должно спросить пользователя. Это немного похоже на хакерство, но я думаю, что это не "безумный прием" ...

Надеюсь это поможет.

person Michael    schedule 02.05.2014