2017-09-06 31 views
3

システム内のすべてのシャットダウンイベントを登録するバックグラウンドプロセスでプログラムを実行しようとしています。下記のショーとしてNSWorkspaceWillPowerOffNotificationに登録することにより、そうNSWorkspaceWillPowerOffNotificationが呼び出されませんでした

:私は理解できないことを何らかの理由で

#import <AppKit/AppKit.h> 

@interface ShutDownHandler : NSObject <NSApplicationDelegate> 

- (void)computerWillShutDownNotification:(NSNotification *)notification; 

@end 


int main(int argc, char* argv[]) { 
    NSNotificationCenter *notCenter; 

    notCenter = [[NSWorkspace sharedWorkspace] notificationCenter]; 

    ShutDownHandler* sdh = [ShutDownHandler new]; 

    [NSApplication sharedApplication].delegate = sdh; 

    [notCenter addObserver:sdh 
        selector:@selector(computerWillShutDownNotification:) 
         name:NSWorkspaceWillPowerOffNotification 
        object:nil]; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     [[NSFileManager defaultManager] createFileAtPath:@"./output.txt" contents:nil attributes:nil]; 
    }); 

    [[NSRunLoop currentRunLoop] run]; 

    return 0; 
} 


@implementation ShutDownHandler 

- (void)computerWillShutDownNotification:(NSNotification *)notification { 
    NSFileHandle* file = [NSFileHandle fileHandleForUpdatingAtPath: @"./output.txt"]; 
    [file seekToEndOfFile]; 

    NSDateFormatter* fmt = [NSDateFormatter new]; 
    [fmt setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    NSDate* current = [NSDate date]; 

    NSString* dateStr = [fmt stringFromDate:current]; 
    [dateStr writeToFile:@"./output.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; 
} 

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender 
{ 
    return NSTerminateCancel; 
} 

@end 

は、NSWorkspaceWillPowerOffNotificationハンドラが呼び出されることはありません!

はまた、私の.plistに次を追加しました:

<key>NSSupportsSuddenTermination</key> 
<false/> 

が、まだ何の通知は、私のシステムをシャットダウンする際に登録されていません。

なぜですか?

+0

こんにちは、おそらくあなたはこの障害を克服することができます。私も同じ問題を抱えています。はいの場合は、ここにソリューションを掲載できますか?ありがとう –

答えて

1

私は上記のイベントに登録し、それを発射見ることができませんでした。 「com.apple.system.loginwindow.logoutNoReturn」

あなたが登録することができます。ここでは apple open-source power management

は、あなたが私たちのような通知名を持つ見ることができます:

最後に、私は別のアプローチを行ってきましたそれらに、それはトリックを行います。

これは誰かを助けることを願っています:)

1

コードをバックグラウンドプロセスとして実行したとしたら、plistファイルに従って処理されたlaunchdデーモンに基づいていることを意味しますか?/Library/LaunchDeamon?この場合、通知は送信されません。 Cocoa application

この通知は、AppKitにリンクされたLaunchDaemonでは動作しません。

私はまだバックグラウンドデーモンプロセスでこれらの通知を取得する方法を探しています。今後の参考のために

+0

私はまた動作しなかったカカオアプリケーションでそれをチェックしました。 これはMACで周りを回っているので、これは非常に面倒です。 Appleは実際には完全シャットダウンを認識する能力をブロックしようとしているようです。 – YanivH

+0

私が読んだAppleの正式な文書によると、アプリケーションが終了する前に通知を受け取るために、 'kAEQuitApplication'のようなリンゴイベントを使うことができます。試しましたか? –

関連する問題