ScriptingBridge вызывает перезапуск iTunes после выхода - PullRequest
2 голосов
/ 22 апреля 2010

Я работаю над приложением Cocoa, которое отслеживает то, что вы слушаете в iTunes, и, поскольку я ориентируюсь на Mac OS 10.5 и выше, я решил использовать Scripting Bridge .

Если я попытаюсь закрыть iTunes слишком близко ко времени, когда мое приложение опрашивает его для текущей дорожки, iTunes немедленно перезапустится!Единственный способ надежно предотвратить такое поведение - сначала выйти из приложения, а затем закрыть iTunes.

Переключение на EyeTunes решает проблему, но это довольно старая кодовая база, и я надеялся,мог бы сделать это без внешней библиотеки.Конечно, я делаю что-то не так, что вызывает перезапуск?

Вот пример кода;этот фрагмент запускается каждые несколько секунд и вызывается NSTimer.

#import "iTunesBridge.h" // auto-generated according to Apple's docs

-(void)updateTrackInfo {
    iTunesApplication *iTunes = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
    iTunesTrack *currentTrack = [iTunes currentTrack];
    // inspect currentTrack to determine what's being played...
    [iTunes release];
}

Это известная проблема со скриптовым мостом или я его неправильно использую?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2010

Это известная проблема со скриптовым мостом или я использую его неправильно?

Возможно, оба варианта, хотя документация по этому вопросу неясна.

Метод класса applicationWithBundleIdentifier: запустит приложение, если оно не запущено, но в документации не говорится, что метод экземпляра initWithBundleIdentifier: .

Самый безопасный способ - это использовать NSRunningApplication (или Process Manager для совместимости с Leopard), чтобы найти запущенные процессы iTunes, выбрать один и настроить его по идентификатору процесса . Если вы не нашли ни одного процесса iTunes, то, конечно, не пытайтесь нацелиться на него (пропустите создание и общение с SBApplication).

1 голос
/ 22 апреля 2010

Похоже, что к моменту отправки запроса приложение уже закрыто, поэтому оно будет перезапущено. Приложение SBApplicationWithBundleIdentifier :

Для приложений, которые объявляют Сами иметь динамический сценарий интерфейс, этот метод запустит приложение, если оно еще не работает.

...