2008-10-13 97 views
6

我想從任意軟件包標識符
(例如, com.apple.iokit.IOStorageFamily通過標識符查找軟件包

這是不該做的包ID應該
是唯一一個不合理的事情,但是明顯的代碼不起作用:

NSString* bID = @"com.apple.iokit.IOStorageFamily"; 
NSBundle* bundle = [NSBundle bundleWithIdentifier:bID]; 

此代碼僅適用於捆綁你已經裝載
(你好,雞和雞蛋的問題),事實上,你有
知道多一點你想知道的標識
之前,你可以做任何事情。對於上述風格的ID
我grep出最後的組件,並將其轉換成
/System/Library/Extensions/IOStorageFamily.kext
然後我通過路徑加載。

這是最先進的還是更普遍的方式?

+0

我近一年來接電話了。它仍然有幫助嗎? – 2009-10-21 12:15:41

+0

很高興知道。舊的代碼工作,但我會在某處添加註釋KextManagerCreateURLForBundleIdentifier。謝謝。 – 2009-10-21 13:53:03

回答

3

就在最近的達爾文-dev郵件列表上Andrew Myrick answered a similar question

KextManagerCreateURLForBundleIdentifier()<IOKit/kext/KextManager.h>可能是使用的 ,但我相信它僅適用 項目,是指1)加載 kext文件,或2 )in/S/L/E /。這裏是雪 豹headerdoc:

/*! 
* @function KextManagerCreateURLForBundleIdentifier 
* @abstract Create a URL locating a kext with a given bundle identifier. 
* 
* @param allocator 
*   The allocator to use to allocate memory for the new object. 
*   Pass <code>NULL</code> or <code>kCFAllocatorDefault</code> 
*   to use the current default allocator. 
* @param kextIdentifier 
*   The bundle identifier to look up. 
* 
* @result 
* A CFURLRef locating a kext with the requested bundle identifier. 
* Returns <code>NULL</code> if the kext cannot be found, or on error. 
* 
* @discussion 
* Kexts are looked up first by whether they are loaded, second by version. 
* Specifically, if <code>kextIdentifier</code> identifies a kext 
* that is currently loaded, 
* the returned URL will locate that kext if it's still present on disk. 
* If the requested kext is not loaded, 
* or if its bundle is not at the location it was originally loaded from, 
* the returned URL will locate the latest version of the desired kext, 
* if one can be found within the system extensions folder. 
* If no version of the kext can be found, <code>NULL</code> is returned. 
*/ 
CFURLRef KextManagerCreateURLForBundleIdentifier(
    CFAllocatorRef allocator, 
    CFStringRef kextIdentifier); 

注意,之前雪豹,它 可以僅對於在/ S/L/E kext文件工作; API已存在,但沒有描述其行爲的headerdoc。

對我而言,這在Mac OS X 10.5上運行得非常好。

9

使用此

NSString *path = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.TextEdit"]; 
+0

不完全!這隻適用於應用程序,我的例子是kext。 – 2008-10-13 21:30:23

0

如果你正在尋找什麼,絕對是一個內核擴展,那麼你可以看看信息字典中/ S/L/ES /文件夾,每捆,直到你找到你。除了應用程序(LaunchServices可以執行此操作)以外,沒有按標識符搜索捆綁軟件,並且已經找到了已加載的捆綁軟件包。

+0

到目前爲止,他們都是kexts,但這可能是純粹的機會。假設他們是這樣的,從捆綁ID中竊取路徑有什麼問題,或者我真的應該重複信息字典嗎?助教。 – 2008-10-13 23:43:40

4

我不認爲Mac OS X保持全球所有捆綁ID的全局數據庫。

如上所述,您可以使用NSWorkspace以非常簡單的方式找到應用程序。

此外,由於您在您的示例中使用了kext,因此在Leopard(10.5)上有一個名爲「kextfind」的工具,您可以運行該工具在系統Exensions文件夾中搜索kexts(不會在其他地方找到kexts除非您將工具指向其他地方)。 kextfind有很多的選擇 - 詳見手冊頁 - 但要找到包ID的內核擴展,你可以這樣做:

kextfind -bundle-id com.apple.iokit.IOStorageFamily 

,我們現在還沒有一個C級API用於查找kext文件通過捆綁ID。

至於黑客從束ID的最後一個組件的路徑:不這樣做。沒有什麼要求包裝器名稱與包ID的最後一個組件匹配,並且我已經看到kexts(對其他包沒有任何說明),兩者不匹配。

0

爲了回答這個問題,我想一個真正需要知道的是「你爲什麼要用這種方式查看包標識符?」如果總是有kexts,你可以在一些相當合理的地方搜索,如果他們是應用程序,你可以使用LS,我沒有看到你想要這樣做的情況,所以我沒有看到需要有一個常見的方式來做到這一點。

需要注意的是,捲上可以有多個相同束標識符的實例。

0

爲了完整起見,我應該提及您可以使用kMDItemCFBundleIdentifier Spotlight /元數據鍵搜索具有給定束標識符的所有包(不僅僅是KEXT);當然你必須準備好處理不止一個(通常它們應該有不同的版本)。