2009-08-18 8 views
45

Tôi đang tìm kiếm một hướng dẫn hoặc mã mẫu để viết các trình bổ sung cho Mac OS X Finder? Nó muốn biết làm thế nào để làm một số hành động đơn giản:Làm thế nào để viết plugin OS X Finder

  1. thêm overlayers ảnh để biểu tượng
  2. thêm các mục menu ngữ cảnh
  3. nghe tập tin thay đổi

tôi thấy hai nguồn sau:

Tôi rất muốn xem lại mã SCPlugin, nhưng hy vọng tìm được mẫu dễ tiêu hóa hơn.

+2

Đã lâu rồi kể từ khi đăng bài này, với 10.6 sẵn có. Bạn đã đạt được những gì bạn đang cố gắng? Bạn đã đi với chiến thuật plugin của Trình tìm kiếm chưa? – epologee

+1

Mọi cập nhật về điều này cho sư tử? – Tony

+0

@LesNie bên dưới liên kết với dự án [Finder Icon Overlay] (https://github.com/lesnie/Finder-Icon-Overlay) của anh ấy. Liên kết trong trường hợp bất kỳ ai khác gặp khó khăn khi tìm một ví dụ về Plugin tìm kiếm OS X nguồn mở (như tôi đã làm). – pkamb

Trả lời

16

Đáng buồn thay, lập trình plugin Trình tìm kiếm thực tế không vẫn yêu cầu bạn bị bẩn tay với COM. Nếu bạn nhìn vào tiểu dự án SCFinderPlugin của dự án SCPlugin, bạn sẽ thấy rằng nó tuân theo chính xác các kỹ thuật tương tự được nêu trong liên kết đầu tiên của bạn, bao gồm thiết lập vtable cho COM, viết các hàm AddRef/ReleaseRef, v.v. Viết một plugin, nơi bạn đồng thời quản lý quản lý bộ nhớ Carbon cũ, quản lý bộ nhớ kiểu COM và quản lý bộ nhớ Carbon kiểu mới/ca cao, có thể là một nỗi đau khó tin — và điều đó hoàn toàn bỏ qua thực tế là bạn sẽ tương tác trong ba hoặc nhiều API hoàn toàn khác nhau, với các quy ước đặt tên khác nhau và ngữ nghĩa gọi. Kêu gọi tình hình điên loạn sẽ là một cách nói rất lớn.

Về mặt tươi sáng, Trình tìm kiếm trong Mac OS X 10.6 Snow Leopard đã được viết lại hoàn toàn bằng Cocoa - và với giao diện plugin cấp cao hơn rất nhiều. Nếu bạn đủ may mắn để ở trong tình huống mà bạn thực sự có thể nhắm mục tiêu đến Snow Leopard, bạn có thể nên lấy một ADC Premier hoặc thành viên cao hơn, tải xuống các bản dựng trước và mã ngược lại. Bên cạnh đó, plugin của bạn có thể không hoạt động trên 10.6 dù sao không có ghi đè Cocoa, do đó, nó có thể có ý nghĩa tốt để xem Snow Leopard trước khi nó được phát hành, bất kể.

+0

cảm ơn lời giải thích. Tôi sẽ chờ bản phát hành công khai của Snow Leopard. – notnoop

+1

Bất kỳ ý tưởng nào tôi có thể tìm thấy thông tin về giao diện plugin của Trình tìm kiếm được đề cập (dành cho OS X Lion)? – jsherk

+0

Rất tiếc là không được đề cập. Các plugin mà tôi biết (ví dụ: Dropbox's) hoạt động bằng cách tự tiêm vào Finder thông qua các cuộc gọi Mach — không chính xác theo hướng mà tôi nghĩ Apple đang đi vào thời điểm đó. –

1

Lựa chọn rất mỏng; nó không bao giờ được thực sự rõ ràng với tôi cho dù Plugins Finder thực sự được hỗ trợ. Tuy nhiên, một vài khách hàng tiềm năng khác:

  • SampleCMPlugIn - Tất nhiên, dựa trên Carbon, vì đó là Finder. Lưu ý rằng hầu như mọi plugin Trình tìm kiếm có thể sẽ ngừng hoạt động với 10.6.
  • Máy tự động có thể lưu mọi thứ dưới dạng "Plugin trình tìm kiếm". Đó là phiên bản được hỗ trợ nhiều hơn về những gì bạn đang thảo luận, nhưng tất nhiên là ít linh hoạt hơn.
2

Theo như tôi biết, không có kiến ​​trúc plugin chính thức nào cho Trình tìm kiếm. Bạn có thể thêm lớp phủ hình ảnh vào các biểu tượng thông qua ứng dụng bên ngoài mà không cần phải móc vào Trình tìm kiếm, mặc dù nó sẽ không hoạt động. Tôi không nghĩ rằng có một cách để thêm các mục menu ngữ cảnh ngoài Folder Actions và Automator. Bạn cũng có thể xem xét việc viết ứng dụng bên ngoài để theo dõi các thay đổi của Hệ thống tệp bằng cách sử dụng FSEvents API.

14

Không có hệ thống plugin chính thức hoặc được hỗ trợ nào cho Trình tìm kiếm. Bắt đầu với OS X 10.6, bạn sẽ cần phải tiêm mã vào quá trình Finder và ghi đè lên các phương thức C mục tiêu trong quá trình Finder.

Tôi đã thực hiện việc này cho một dự án độc quyền. Tôi có thể nói với bạn rằng lý do không có ví dụ hoặc hướng dẫn cho điều này là bởi vì nó là một nhiệm vụ phát triển tốn thời gian và khó khăn đáng kể. Vì lý do này, có rất nhiều khuyến khích cho các cá nhân hoặc tổ chức đã thực hiện điều này để bảo vệ các chi tiết cụ thể của quá trình của họ chặt chẽ.

Nếu có bất kỳ cách nào bạn có thể hoàn thành mục tiêu của mình bằng API dịch vụ, hãy thực hiện. Viết plugin trình tìm kiếm sẽ đưa bạn 1-2 solid tháng phát triển siêng năng và hiểu biết sâu sắc hợp lý về nội dung C và Objective-C.

Nếu bạn vẫn bị thuyết phục rằng bạn muốn thực hiện việc này, hãy lấy mach_star. Chúc may mắn.

28

Dự án ví dụ Finder Icon Overlay đại diện cho một ví dụ nhỏ và rất cơ bản nhưng thực sự hoạt động của câu trả lời bên dưới.

https://github.com/lesnie/Finder-Icon-Overlay

Tôi biết điều này là rất cũ, nhưng một số có thể vẫn còn quan tâm đến chủ đề (?)

Dưới đây là những gì tôi có nó thực hiện dưới Leopard (10.6). Đầu tiên, cần có các tiêu đề phù hợp của Finder. Sử dụng công cụ đổ lớp để lấy nó. Sau đó viết mã của bạn như một plugin SIMBL (tham khảo tài liệu hướng dẫn cách thực hiện), một số phương pháp. Ví dụ để vẽ một cái gì đó trên biểu tượng trong ListView, drawIconWithFrame: phương pháp của phương pháp TIconAndTextCell phải được overriden.

Dưới đây là các mã cho phương pháp swizzling:

+ (void) Plugin_load 
{ 
    Method old, new; 
    Class self_class = [self class]; 
    Class finder_class = [objc_getClass("TIconAndTextCell") class]; 

    class_addMethod(finder_class, @selector(FT_drawIconWithFrame:), 
        class_getMethodImplementation(self_class, @selector(FT_drawIconWithFrame:)),"[email protected]:{CGRect={CGPoint=dd}{CGSize=dd}}"); 

    old = class_getInstanceMethod(finder_class, @selector(drawIconWithFrame:)); 
    new = class_getInstanceMethod(finder_class, @selector(FT_drawIconWithFrame:)); 
    method_exchangeImplementations(old, new); 

} 

Tôi trọng "drawIconWithFrame:" phương pháp với phương pháp của tôi "FT_drawIconWithFrame:". Dưới đây là triển khai mẫu cho phương pháp này.

- (void) FT_drawIconWithFrame:(struct CGRect)arg1 
{ 
    [self FT_drawIconWithFrame:arg1]; 
    if ([self respondsToSelector:@selector(node)]) { 
     if ([[[[NSClassFromString(@"FINode") nodeWithFENode:[(TNodeIconAndNameCell *)self node]] fullPath] lastPathComponent] hasPrefix:@"A"]) 
      [myPrettyIconOverlayImage drawInRect:NSMakeRect(arg1.origin.x, arg1.origin.y, arg1.size.height, arg1.size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
    } 
} 

Về cơ bản nó vẽ "myPrettyIconOverlayImage" trên mọi biểu tượng cho tệp có tên bắt đầu bằng chữ "A". Logic này tùy thuộc vào bạn.

Chú ý đến dòng này: [self FT_drawIconWithFrame:arg1]; đây là cách gọi 'siêu' để nhận biểu tượng và tên bình thường, v.v. Tôi biết, trông kỳ quặc, giống như vòng lặp, nhưng thực ra không phải vậy. Sau đó, đưa vào SIMBL plugin, cài đặt SIMBL và ... chạy.

Do những thay đổi trong Lion, một số công việc phải được thực hiện ngay từ đầu (tạo tệp "Finder.h" mới với tất cả các khai báo cần thiết, tìm lớp thích hợp và phương pháp để ghi đè), nhưng kỹ thuật này vẫn hoạt động.

Hacking vui vẻ!

+0

Sau khi sử dụng mã này, bạn không thể bán sản phẩm của mình trên cửa hàng ứng dụng của Apple. –

+0

Vâng, tôi cũng đồng ý với @jennifer .. những gì bạn đang làm dường như không hoàn toàn hợp pháp –

+4

Có thể. Tuy nhiên đây là phương pháp duy nhất bạn có thể tiếp cận chức năng như vậy (lớp phủ biểu tượng) trong Finder. Đó có thể là lý do Dropbox không có trong AppStore. –

2

Đây là giải pháp hoàn chỉnh cho phù hiệu biểu tượng Trình tìm kiếm và các menu ngữ cảnh trong Lion và Mountain Lion sử dụng các kỹ thuật được mô tả bởi Les Nie.

Liferay Nativity cung cấp một gói tập lệnh sẽ làm lu mờ các phương thức tìm kiếm có liên quan và trình khách Java để thiết lập các biểu tượng và trình đơn ngữ cảnh. Nó cũng bao gồm các dự án tương đương cho Windows và Linux.

Dự án là nguồn mở theo LGPL, vì vậy vui lòng đóng góp bất kỳ sửa lỗi hoặc cải tiến nào!

21

Đối với Yosemite (MacOS 10.10 & mới hơn), bạn có thể sử dụng của Apple FinderSync framework, cho phép mở rộng Finder để:

  • lãi Express trong thư mục cụ thể các tầng nấc
  • Cung cấp "phù hiệu" để chỉ trạng thái của mục bên trong những hệ thống phân cấp
  • Cung cấp động mục menu trong trình đơn ngữ cảnh Finder, khi các mục được chọn (hoặc mục tiêu cửa sổ) nằm trong các cấu trúc phân cấp đó
  • Cung cấp một mục Thanh công cụ hiển thị menu có mục động (ngay cả khi lựa chọn là không liên quan)
+0

bật lên cho thông tin này! –

0

Để thêm Finder/File lớp phủ biểu tượng trình duyệt và menu ngữ cảnh, một cách nền tảng, từ Java, hãy nhìn vào các thư viện Liferay Nativity.

Tôi cũng đề cập đến điều này trong another SO post, cũng chứa liên kết đến tài liệu và API 'Finder Sync' của Apple.