【问题标题】:How to distinguish between different causes of app termination in Cocoa?如何区分 Cocoa 中应用程序终止的不同原因?
【发布时间】:2014-04-29 12:05:52
【问题描述】:

我希望我的应用程序在退出前要求确认,除了当它在关机或重启期间被系统终止时(因为当 OS X 尝试在午夜应用安全更新时,它会卡住“你确定吗?”消息框)。

如何找到导致终止的原因?在[NSApp terminate:sender] 中,发件人始终是nil

我的第一个想法是仅在激活“退出”主菜单项时询问,但用户也可以从 Dock 菜单中终止应用程序,或者在按住 Cmd+Tab 的同时按 Cmd+Q,我想在这些情况下也要求确认。

【问题讨论】:

    标签: cocoa confirmation termination quit


    【解决方案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 分钟后,用户关闭了您的应用。在这种情况下,应用应该询问用户。这有点骇人听闻,但我认为这不是“疯狂的骇客”...

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多