2012-04-01 1 views
2

Я использую следующий код, чтобы проверить, запущено ли приложение и закрыть его. Может ли кто-нибудь представить пример того, как запросить приложение, и ждать, пока он закроется, прежде чем продолжить?Как вы ожидаете закрытия приложения в 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

+0

У меня нет примера кода, но я бы использовал ['NSTimer'] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nstimer_Class/Reference/ NSTimer.html) и настройте повторяющийся таймер, чтобы вызвать один из ваших методов. Оттуда вы можете узнать, продолжает ли выполняться приложение, и продолжать либо ждать, либо отменить таймер и продолжить. –

+0

Спасибо, Грег, я попробую. – David

3

Вы можете использовать Key-Value Observing для наблюдения за свойством terminated каждого работающего приложения. Таким образом, вы получите уведомление, когда каждое приложение завершается, без необходимости опроса.

+0

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

0

Командная строка timelimit позволит вам отправить сигнал близко к приложению, подождать x секунд, а затем убить его (или отправить любой другой сигнал, который вам нравится, kill -9), если он не выполнил сигнал «предупреждения».

(Примечание. Я не пробовал его компиляции на Mac, но я считаю, что это довольно POSIX-совместимый код, а не Linux-конкретны, как он работает на BSD и другие)

+0

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

+0

Ничего проще, чем программно запускать приложение с командной строкой. Просто поплен, или fork и exec. –

+0

Это не просто легкость. timelimit может отлично работать для запуска средства командной строки, но приложения должны запускаться с использованием Launch Services. В противном случае вы, скорее всего, получите несколько копий приложения (LS обычно активирует уже запущенный процесс), и приложение будет подчиняться вашей песочнице вместо ее собственной. –