ScriptingBridge导致iTunes在退出后重新启动

时间:2010-04-22 02:53:05

标签: objective-c cocoa itunes scripting-bridge

我正在制作一个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的已知问题,还是我错误地使用它?

2 个答案:

答案 0 :(得分:3)

  

这是Scripting Bridge的已知问题,还是我错误地使用它?

可能两者都有,虽然文档不清楚。

如果应用程序未运行,

The applicationWithBundleIdentifier: class method将启动该应用程序,但文档中没有说明the initWithBundleIdentifier:instance method

最安全的方法是使用NSRunningApplication(或Process Manager兼容Leopard)查找正在运行的iTunes进程,选择一个,然后target it by its process identifier。如果您没有找到任何iTunes进程,那么当然不要尝试定位一个(跳过创建和与SBApplication交谈)。

答案 1 :(得分:1)

听起来应用程序在您发送请求时已经关闭,因此会重新启动。

SBApplication applicationWithBundleIdentifier

  

对于声明的应用程序   他们自己有一个动态脚本   接口,这个方法将启动   应用程序,如果它还没有   运行