2010-04-22 49 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

相關問題