2

我正在开发一个 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 的一个已知问题,还是我使用不正确?

4

2 回答 2

3

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

可能两者兼而有之,尽管文档对此尚不清楚。

如果应用程序没有运行,applicationWithBundleIdentifier:类方法将启动应用程序,但文档没有说明实例initWithBundleIdentifier:方法

最安全的方法是使用NSRunningApplication(或与 Leopard 兼容的进程管理器)来查找正在运行的 iTunes 进程,选择一个,并通过它的进程标识符来定位它。如果您没有找到任何 iTunes 进程,那么当然,不要尝试定位一个(跳过创建和与 SBApplication 对话)。

于 2010-04-22T03:22:04.323 回答
1

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

SBApplication applicationWithBundleIdentifier

对于声明自己具有动态脚本接口的应用程序,如果应用程序尚未运行,此方法将启动该应用程序。

于 2010-04-22T03:20:34.120 回答