2010-04-22 39 views
2

我工作的一个可可应用程序,监视你听在iTunes什么,因为我针对的Mac OS 10.5或更高版本,我已经决定使用Scripting BridgeScriptingBridge导致iTunes来重新启动后退出

如果我试图关闭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的已知问题,还是我使用不正确?

回答

3

这是Scripting Bridge的一个已知问题,还是我使用不正确?

可能这两者,虽然文件不清楚。

The applicationWithBundleIdentifier: class method将启动应用程序,如果它没有运行,但文档没有说关于the initWithBundleIdentifier:instance method

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

+0

这两个方法之间的唯一区别应该是'applicationWith ...'返回'autoreleased'应用程序... – stefanB 2010-04-22 03:30:20

+0

我同意,*应该*是唯一的区别。 ☺那符合他所描述的行为,这意味着这是他的问题。正如我所建议的那样,解决方案是寻找一个iTunes进程,并且(仅在找到一个进程时)通过PID来对其进行定位,而不是通过其包ID来定位iTunes。 – 2010-04-22 03:43:43

+0

这就像一个魅力!谢谢你的帮助。 – 2010-04-22 04:14:26

1

这听起来像应用程序已经通过你发送的请求,以便将重新启动的时间已经关闭。

SBApplication applicationWithBundleIdentifier

对于申报 自己有一个动态脚本 接口的应用,这种方法,如果它是不是已经 运行启动 应用。

+0

虽然他没有使用'applicationWithBundleIdentifier:'。 – 2010-04-22 03:21:45

相关问题