ScriptingBridge вызывает перезапуск iTunes после выхода

Я работаю над приложением 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];
}

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


person Justin Voss    schedule 22.04.2010    source источник


Ответы (2)


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

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

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

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

person Peter Hosey    schedule 22.04.2010
comment
единственная разница между этими двумя методами должна заключаться в том, что applicationWith... возвращает autoreleased приложение ... - person stefanB; 22.04.2010
comment
Я согласен, что должно быть единственной разницей. ☺ И это действительно соответствует описанному им поведению, что подразумевает, что это его проблема. Решение, как я предлагал, состоит в том, чтобы найти процесс iTunes и (только после его нахождения) настроить таргетинг на него по PID, а не по идентификатору пакета iTunes. - person Peter Hosey; 22.04.2010

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

SBApplication applicationWithBundleIdentifier:

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

person stefanB    schedule 22.04.2010
comment
Однако он не использует applicationWithBundleIdentifier:. - person Peter Hosey; 22.04.2010