Возникла специфическая задача: добавить программно папку в раздел «Избранное» на боковой панели 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)