Программное добавление папки в «Избранное» в Finder


Возникла специфическая задача: добавить программно папку в раздел «Избранное» на боковой панели Finder в macOS. Эта и другая подобная информация хранится в *.sfl файлах, в ~/Library/Application Support/com.apple.sharedfilelist/. Работать с ними напрямую не получится, для этого существует системная утилита sfltool.

Через терминал выполняем следующую команду:

/usr/bin/sfltool add-item com.apple.LSSharedFileList.FavoriteItems file:///Users/$USER/Desktop/

Если нужно произвести такую операцию непосредственно из кода программы, то придется работать с API LSSharedFileList, которое объявлено Apple устаревшим, при этом альтернативных способов сделать это компания не предложила. Применяя этот метод, следует также помнить, что он не будет работать в sandbox-режиме.

На Objective-C:

- (void)appendFavoriteItemWithURL:(NSString *)itemPath {
    NSURL *url = [NSURL fileURLWithPath:itemPath];
    LSSharedFileListRef list = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL);
    if (list) {
        LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(list,
                                                                    kLSSharedFileListItemLast,
                                                                    NULL,
                                                                    NULL,
                                                                    (__bridge CFURLRef)url,
                                                                    NULL,
                                                                    NULL);
        if (item) {
            CFRelease(item);
        }
        
        CFRelease(list);
    }
}

Пример использования:

NSString * itemPath = [@"~/Documents/src" stringByExpandingTildeInPath];
[self appendFavoriteItemWithURL:itemPath];

На Swift:

func appendFavoriteItemWithURL(itemPath: String) {
    let url = NSURL(fileURLWithPath: itemPath) as CFURL
    let list = LSSharedFileListCreate(nil,
                                    kLSSharedFileListFavoriteItems.takeRetainedValue(),
                                    nil).takeRetainedValue()
    let startPosition: LSSharedFileListItem = kLSSharedFileListItemBeforeFirst.takeRetainedValue()
    
    LSSharedFileListInsertItemURL(list,
                                startPosition,
                                nil,
                                nil,
                                url,
                                nil,
                                nil)
}

Пример использования:

let itemPath = NSString(string: "~/Documents/src").expandingTildeInPath
appendFavoriteItemWithURL(itemPath: itemPath)

Источники