Расширение синхронизации OS X Finder

Я не могу создать простое расширение Finder Sync.

Я создал новый проект OS X и добавил цель расширения синхронизации Finder, и я запустил расширение, прикрепленное к поиску. Кажется, что код выполняет методы init, и методы элементов панели инструментов вызываются, но в Finder ничего не отображается.

Терминал показывает это при запуске

2015-04-20 12:45:52.700 pcssyncextension[3196:62451] Не удалось подключить выход (colorGridView) из (NSApplication) к (NSColorPickerGridView): отсутствует сеттер или переменная экземпляра 2015-04-20 12:45:52.701 pcssyncextension[3196:62451] Не удалось подключить (просмотреть) выход из (NSApplication) к (NSColorPickerGridView): отсутствует сеттер или переменная экземпляра 2015-04-20 12:45:58.887 pcssyncextension[3196:62451] -[FinderSync init] запущен из /Users/user/Library/Developer/Xcode/DerivedData/findersynctest-dkyjmfmqzedkquhbhqxejzlzzukn/Build/Products/Debug/findersynctest.app/Contents/PlugIns/pcssyncextension.appex; составлено в 12:36:01

Есть ли что-то еще, что мне нужно сделать, чтобы заставить это работать, кроме создания пустого проекта и добавления расширения Finder Sync?

1 ответ

Решение

Я смог найти несколько вещей, которые помогли мне. По умолчанию элемент панели инструментов не добавляется в окно поиска, если пользователь не перетаскивает его. Я не смог найти способ программно добавить элемент на панель инструментов окна поиска.

Добавить элемент в боковую панель поиска

// Create a reference to the shared file list.
LSSharedFileListRef favoriteItems = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL);

// Check Items
if (favoriteItems)
{
    // Get CFURL for Application
    CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];

    // Add Item
    LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(favoriteItems, kLSSharedFileListItemBeforeFirst, NULL, NULL, url, NULL, NULL);

    // Release
    if (item)
        CFRelease(item);
}

// Release
if (favoriteItems != NULL)
    CFRelease(favoriteItems);

Код для удаления элемента с боковой панели

// Create a reference to the shared file list.
LSSharedFileListRef favoriteItems = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL);

// Check Items
if (favoriteItems)
{
    // Get Login Items
    CFArrayRef favoriteItemsArray = LSSharedFileListCopySnapshot(favoriteItems, NULL);

    // Loop Through Items
    for (id item in (__bridge NSArray *)favoriteItemsArray)
    {
        // Get Item Ref
        LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item;

        // Get Item URL
        CFURLRef itemURL = LSSharedFileListItemCopyResolvedURL(itemRef, kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes, NULL);
        if (itemURL != NULL)
        {
            // If Item Matches Remove It
            if ([[(__bridge NSURL *)itemURL path] hasPrefix:path])
                LSSharedFileListItemRemove(favoriteItems, itemRef);

            // Release
            if (itemURL != NULL)
                CFRelease(itemURL);
        }
    }

    // Release
    if (favoriteItemsArray != NULL)
        CFRelease(favoriteItemsArray);
}

// Release
if (favoriteItems != NULL)
    CFRelease(favoriteItems);

Перезагрузить каталог в Finder

// Reload Finder (change the word directory to file if updating file)
NSAppleScript * update = [[NSAppleScript alloc] initWithSource:[NSString stringWithFormat:@"tell application \"Finder\" to update POSIX directory \"%@\"",path]];
[update executeAndReturnError:nil];

Код для включения расширения (идентификатор пакета)

system("pluginkit -e use -i com.mycompany.finderExt")

Код для отключения расширения (идентификатор пакета)

system("pluginkit -e ignore -i com.mycompany.finderExt")
Другие вопросы по тегам