Создание дескриптора AppleEvent для псевдонима в OS X 10.8

У меня есть следующий код в проекте

NSAppleEventDescriptor *JHCreateAliasDescriptorForURL(NSURL *aURL) {
    NSAppleEventDescriptor *retObj = nil;
    FSRef fsReference;

    if (CFURLGetFSRef((__bridge CFURLRef)aURL, &fsReference)) {
        AliasHandle aliasHandle = NULL;
        OSStatus err = FSNewAliasMinimal(&fsReference, &aliasHandle);
        if (err == noErr && aliasHandle != NULL) {

            HLock((Handle)aliasHandle);
            retObj = [NSAppleEventDescriptor descriptorWithDescriptorType:typeAlias
                            data:[NSData dataWithBytes:*aliasHandle
                                                length:GetHandleSize((Handle)aliasHandle)]];
            HUnlock((Handle)aliasHandle);
            DisposeHandle((Handle)aliasHandle);
        }
    }

    return retObj;
}

Он создает дескриптор псевдонима, который передает файл в программу, которая не является приемлемой для Apple, но отвечает на этот AppleEvent.

Когда я компилирую это под 10.8, я получаю предупреждения, потому что весь углерод FSNewAlias* функции устарели, и мы должны использовать непрозрачную закладку NSData объекты из NSURL API. Однако мне не повезло превратить эти данные в псевдонимы дескрипторов AppleEvent.

Как я могу сделать typeAlias дескриптор в 10.8 без FSNewAlias*?

2 ответа

Решение

Вы в принципе не можете. (Современная замена для псевдонима - CFURLBookmark. Существует процедура для создания закладки из данных псевдонима, но не наоборот.) Однако вы можете создать другой тип файлового дескриптора, который можно использовать для псевдонима -- самый простой typeFileURLгде содержимое - это просто байты URL. По общему признанию это зависит от того, правильно ли написано целевое приложение, но оно должно работать.

В случае, если кто-то еще ищет более прямое решение, что-то вроде этого хорошо работает для создания дескриптора Apple Event из данных закладок:

+ (NSAppleEventDescriptor *)descriptorWithBookmarkDataForFileURL:(NSURL *)fileURL {
    NSData *targetBookmarkData = [fileURL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:nil];
    return [NSAppleEventDescriptor descriptorWithDescriptorType:typeBookmarkData data:targetBookmarkData];
}
Другие вопросы по тегам