2008-10-13 28 views
6

Tôi muốn tạo một gói từ số nhận dạng gói tùy ý
ví dụ: com.apple.iokit.IOStorageFamilyĐịnh vị các nhóm theo số nhận dạng

Nó không phải là một điều bất hợp lý để làm như ID bó có nghĩa vụ phải
phải là duy nhất, tuy nhiên các mã rõ ràng không hoạt động:

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

Mã này chỉ hoạt động cho bó bạn đã nạp
(xin chào, vấn đề gà và trứng), và trên thực tế, bạn có
để biết nhiều hơn một chút so với số nhận dạng
trước khi bạn có thể làm bất cứ điều gì. Đối với phong cách trên của ID
Tôi grep ra thành phần cuối cùng và chuyển nó thành
/System/Library/Extensions/IOStorageFamily.kext
mà sau đó tôi tải theo đường dẫn.

Đây có phải là trạng thái của nghệ thuật hoặc có cách tổng quát hơn không?

+0

Tôi trễ gần một năm để trả lời. Nó vẫn hữu ích? –

+0

Thật tuyệt khi biết. Mã cũ hoạt động, nhưng tôi sẽ thêm KextManagerCreateURLForBundleIdentifier vào một nhận xét ở đâu đó. Cảm ơn. –

Trả lời

3

Chỉ gần đây Andrew Myrick answered a similar question trên darwin-dev mailing list:

KextManagerCreateURLForBundleIdentifier() trong <IOKit/kext/KextManager.h> có thể sử dụng, mặc dù tôi tin rằng nó chỉ hoạt động cho kexts được hoặc là 1) nạp, hoặc 2) trong/S/L/E /. Dưới đây là Snow Leopard 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); 

Lưu ý rằng trước khi Snow Leopard, nó chỉ có thể làm việc cho kexts trong/S/L/E; API đã tồn tại, nhưng không có tiêu đề mô tả hành vi của nó.

Đối với tôi, tính năng này hoạt động rất tốt trên Mac OS X 10.5.

+0

Tôi đang cố gắng định vị Gói với cùng một ID chính xác như áp phích gốc và mã này luôn trả về NULL cho tôi, nhưng đây là do Sandboxing. Quá xấu, điều này không thể được sử dụng cho các ứng dụng trong App Store nữa. –

9

Sử dụng này

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

Không hoàn toàn! Đó là chỉ cho các ứng dụng, ví dụ của tôi là một kext. –

0

Nếu bạn đang tìm kiếm chắc chắn là một kext, sau đó bạn có thể nhìn vào các thông tin từ điển cho mỗi bó trong thư mục/S/L/E/thư mục cho đến khi bạn tìm thấy bạn . Không có tìm kiếm cho gói theo định danh ngoài các ứng dụng (nơi LaunchServices sẽ làm điều đó), và nạp bó như bạn đã tìm thấy.

+0

Cho đến nay tất cả chúng đều là kexts, nhưng đó có thể là cơ hội thuần túy. Hãy nói rằng họ là mặc dù, là có bất cứ điều gì hết sức sai lầm với hack đường dẫn từ bundleID hoặc tôi thực sự nên lặp lại các từ điển thông tin? Ta. –

+0

Luôn có "điều gì xảy ra nếu" một KEXT được cài đặt không khớp với lược đồ đó. Tất nhiên, bạn không thực sự cần phải lặp lại _every_ thời gian, bạn có thể xây dựng một kế hoạch tra cứu và sử dụng nó (giữ nó cập nhật ...). –

4

Tôi không nghĩ rằng Mac OS X giữ cơ sở dữ liệu toàn cầu của tất cả các ID gói ở mọi nơi.

Như đã lưu ý, bạn có thể tìm ứng dụng một cách khá đơn giản với NSWorkspace.

Ngoài ra, vì bạn đã sử dụng kext cho ví dụ của mình, trên Leopard (10.5) có một công cụ gọi là "kextfind" mà bạn có thể chạy để tìm kexts trong thư mục Exensions của hệ thống (kexts ở những nơi khác sẽ không được tìm thấy trừ khi bạn chỉ công cụ ở những nơi khác). kextfind có nhiều lựa chọn - xem man page để biết chi tiết - nhưng để tìm một kext bởi bó ID bạn có thể làm điều này:

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

Chúng tôi hiện không có một API C cấp cho nhìn lên kexts theo ID gói.

Để lấy cắp đường dẫn từ thành phần cuối cùng của ID gói: không làm điều đó. Không có gì yêu cầu tên trình bao bọc để khớp với thành phần cuối cùng của ID gói và tôi đã thấy các kexts (không nói gì về các gói khác), trong đó cả hai không khớp.

0

Để trả lời câu hỏi này, tôi nghĩ thực sự cần biết "Tại sao bạn lại tìm kiếm số nhận dạng theo cách này?" Nếu luôn có kexts bạn có thể tìm kiếm ở một số nơi khá hợp lý, nếu chúng là ứng dụng bạn có thể sử dụng LS, tôi không thấy trường hợp bạn muốn làm cả hai, vì vậy tôi không thấy cần phải có cách phổ biến để làm điều đó.

Cần lưu ý rằng bạn có thể có nhiều phiên bản nhận dạng gói giống hệt nhau trên một Tập.

0

Để hoàn tất, tôi nên đề cập đến bạn có thể tìm kiếm tất cả các gói (không chỉ KEXT) với một số nhận dạng gói nhất định bằng cách sử dụng phím kMDItemCFBundleIdentifier Tiêu điểm/siêu dữ liệu; tất nhiên bạn phải sẵn sàng để xử lý có nhiều hơn một (thông thường họ nên có các phiên bản khác nhau).

Các vấn đề liên quan