2012-04-01 41 views
2

我正在使用下面的代碼來檢查應用程序是否正在運行並關閉它。有人可以提供一個如何申請一個應用程序的例子calose並等待它關閉之前繼續?如何等待應用程序在OS X中關閉?

+ (BOOL)isApplicationRunningWithName:(NSString *)applicationName { 
    BOOL isAppActive = NO; 
    NSDictionary *aDictionary; 
    NSArray *selectedApps = [[NSWorkspace sharedWorkspace] runningApplications]; 

    for (aDictionary in selectedApps) { 
     if ([[aDictionary valueForKey:@"NSApplicationName"] isEqualToString: applicationName]) { 
      isAppActive = YES; 
      break; 
     } 
    } 
    return isAppActive; 
} 

+ (void)stopApplication:(NSString *)pathToApplication { 
    NSString *appPath = [[NSWorkspace sharedWorkspace] fullPathForApplication:pathToApplication]; 
    NSString *identifier = [[NSBundle bundleWithPath:appPath] bundleIdentifier]; 
    NSArray *selectedApps = [NSRunningApplication runningApplicationsWithBundleIdentifier:identifier]; 
    // quit all 
    [selectedApps makeObjectsPerformSelector:@selector(terminate)]; 
} 

回答

1

一種方法是定期調用isApplicationRunningWithName一個計時器,並等待該函數返回NO

+0

你有一個代碼示例,可能會顯示我會如何實現這一目標? – David 2012-04-01 19:02:42

+0

我沒有一個方便的代碼示例,但我會使用['NSTimer'](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nstimer_Class/Reference/ NSTimer.html)並設置一個重複計時器來調用你的一個方法。從那裏,您可以瞭解應用程序是否仍在運行,並繼續等待或取消計時器並繼續。 – 2012-04-01 19:08:35

+0

感謝格雷格,我會試一試。 – David 2012-04-01 19:10:34

3

您可以使用Key-Value Observing來觀察每個正在運行的應用程序的terminated屬性。這樣,每次應用程序終止時都會收到通知,而無需輪詢。

+0

這聽起來像一個乾淨的方式來做到這一點,我會看看如果我能弄清楚如何做到這一點。謝謝。 – David 2012-04-01 22:12:17

0

命令行timelimit會讓你發送一個關閉信號給應用程序,等待x秒,然後殺死它(或發送任何你喜歡的其他信號,殺死是-9)如果不遵守「警告」信號。

(注:我還沒有嘗試編譯它在Mac,但我相信這是符合POSIX標準的公平代碼,而不是Linux特有,因爲它運行在BSD等)

+0

以用戶身份進行此操作可能會很有用,但問題在於如何在應用程序中執行此操作。 – 2012-04-02 00:10:28

+0

沒有比編程啓動命令行應用程序更簡單的方法。只是popen或fork和exec。 – 2012-04-02 04:04:21

+0

這不僅僅是簡單。 timelimit可以正常運行命令行工具,但應用程序必須使用啓動服務啓動。否則,您可能最終會運行多個應用程序副本(LS通常會激活一個已運行的進程),並且該應用程序將受到您的沙箱而不是其自身的影響。 – 2012-04-02 19:08:50

相關問題