I am not able to create a simple Finder Sync Extension.
I have created a new OS X project and added the Finder Sync Extension target and I ran the extension attached to finder. The code appears to be running the init methods and the toolbar items methods are getting called but nothing is displaying in finder.
The terminal is showing this when it runs
2015-04-20 12:45:52.700 pcssyncextension[3196:62451] Failed to connect
(colorGridView) outlet from (NSApplication) to
(NSColorPickerGridView): missing setter or instance variable
2015-04-20 12:45:52.701 pcssyncextension[3196:62451] Failed to connect
(view) outlet from (NSApplication) to (NSColorPickerGridView): missing
setter or instance variable 2015-04-20 12:45:58.887
pcssyncextension[3196:62451] -[FinderSync init] launched from
/Users/user/Library/Developer/Xcode/DerivedData/findersynctest-dkyjmfmqzedkquhbhqxejzlzzukn/Build/Products/Debug/findersynctest.app/Contents/PlugIns/pcssyncextension.appex
; compiled at 12:36:01
Is there anything else I need to do to get this to work other that just creating an empty project and adding the Finder Sync Extension?
I was able to find a few things that helped me. By default the toolbar item is not added to the finder window unless the user drags it in. I was not able to find a way to programmatically add the item to the finder window toolbar.
Add Item to the finder side bar
// 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);
Code to Remove Item From Sidebar
// 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);
Reload Directory in 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];
Code to Enable Extension (bundle ID)
system("pluginkit -e use -i com.mycompany.finderExt")
Code to Disable Extension (bundle ID)
system("pluginkit -e ignore -i com.mycompany.finderExt")