【问题标题】:ScriptingBridge causes iTunes to relaunch after quitScriptingBridge 导致 iTunes 在退出后重新启动
【发布时间】:2010-04-22 02:53:04
【问题描述】:

我正在开发一个可监控您在 iTunes 中收听的内容的 Cocoa 应用程序,由于我的目标是 Mac OS 10.5 及更高版本,因此我决定使用Scripting Bridge

如果我尝试关闭 iTunes 的时间太接近我的应用程序轮询当前曲目的时间,iTunes 将立即重新启动!可靠地防止这种行为的唯一方法是先退出我的应用程序,然后退出 iTunes。

切换到EyeTunes 解决了这个问题,但它是一个相当老的代码库,我希望我可以在没有外部库的情况下完成这个。确定我做错了什么导致重新启动?

这里有一些示例代码;这个 sn-p 每隔几秒运行一次,由 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 的一个已知问题,还是我使用不当?

【问题讨论】:

    标签: objective-c cocoa itunes scripting-bridge


    【解决方案1】:

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

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

    The applicationWithBundleIdentifier: class method 将在应用程序未运行时启动该应用程序,但文档中并未提及 the initWithBundleIdentifier:instance method

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

    【讨论】:

    • 这两种方法的唯一区别应该是applicationWith...返回autoreleased应用程序...
    • 我同意,应该是唯一的区别。 ☺ 这确实符合他描述的行为,这意味着这是他的问题。正如我所建议的,解决方案是寻找一个 iTunes 进程并(仅在找到一个时)通过 PID 来定位它,而不是通过它的捆绑 ID 来定位 iTunes。
    【解决方案2】:

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

    SBApplication applicationWithBundleIdentifier:

    对于声明的应用程序 自己要有动态脚本 界面,此方法将启动 如果还没有申请 正在运行。

    【讨论】:

    • 不过他没有使用applicationWithBundleIdentifier:
    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多