2010-01-07 97 views
3

我正在嘗試編寫一個Cocoa程序來檢測連接到Mac OS的iPod。我正在偵聽USB設備安裝和卸載通知的NSWorkspaceDidMountNotification和NSWorkspaceDidUnmountNotification。我可以使用NSString * path = [[notif userInfo] objectForKey:@「NSDevicePath」]獲取已安裝設備的設備路徑;但我也不需要知道設備ID,供應商ID,產品ID等,以檢查安裝的設備是否是iPod。我認爲前進的道路是IOKit。但我有一種感覺,那就是低級編程。有沒有其他方法可以找到這些?另外,如果是IO套件,那麼當我提供安裝路徑時,是否有示例程序會給出Ids?如何獲得在Mac OS中安裝的USB設備的設備ID,供應商ID和產品ID cocoa

非常感謝。

回答

2

我正在偵聽NSWorkspaceDidMountNotification和NSWorkspaceDidUnmountNotification以獲取USB設備的掛載和卸載通知。

那不是這些通知是。他們是掛載和卸載通知,並且卷可能來自不是USB設備的東西。磁盤映像,FireWire設備,光盤和閃存卡都是不是USB設備的設備。 (該卡可能位於USB讀卡器中,但該卡不是讀卡器。)

我認爲未來的方向是IOKit。

正確的。

但我有這感覺的底層編程。

正確的。

是否有任何其他的方式來找到這些?

你不能完全切斷I/O Kit,但有一個快捷方式可以爲你節省一些工作。這是磁盤仲裁框架。

Register a disk-appeared callbacka disk-disappeared callback。每個實現的回調函數都需要一個DADiskRef。您可以將其傳遞給the DADiskCopyIOMedia function以獲取到磁盤的I/O Kit媒體對象的服務端口。

我不知道該怎麼做,除非您需要按照該文檔中的說明釋放服務端口。另外,您仍然需要過濾掉非USB設備,但至少您將擁有I/O Kit媒體對象。其他

一兩件事:這個解決方案,您目前正在使用NSWorkspace通知,可能都將無法正常工作,如果iPod沒有設置爲使用,或者不支持,磁盤模式。 iPhone和iPod touch是當前最大的例子。如果是這樣的話,那麼您只需從頭到尾使用I/O Kit即可 - DiskArb和NSWorkspace都不會爲您完成這項工作。

+0

感謝很多答案。我對Mac和IOKit非常陌生。我認爲對於通用解決方案,我將從頭開始使用IO Kit。即使iPod沒有安裝,它是否工作?你能否提供一些線索,例如在哪裏尋找更多信息和IO Kit示例。 – wantro 2010-01-08 15:47:42

+0

當然,它*工作*,因爲你可以訪問設備樹。但是如果iPod沒有連接,iPod將不在設備樹中,因爲設備樹只是那些連接的設備。至於示例:http://developer.apple.com/mac/ – 2010-01-08 18:22:07

0

還有來自Apple的HIDUtilites樣本。閱讀頭文件 - 雖然這個框架沒有很好的文檔,但我認爲有一個示例應用程序或其他東西。

0

你可以使用usbprobe,ioregistryexplorer或者如果你只是想要idProduct和...你可以隨時把它插到linux機器上並使用「lsusb -v」以非常理智的方式獲得有關設備的信息,而不是ioregistryexplorer似乎在OS X的每一個版本中都不斷突破。

ioregistryexplorer也需要Mac開發者計劃的100 $成員身份山獅的