在OS X 10.8中为别名创建一个applevent描述符



我在一个项目中有以下代码

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;
}

它创建一个别名描述符,将一个文件传递给一个不是 applescriptable的程序,但响应这个applescriptable。

当我在10.8下编译时,我得到警告,因为所有的Carbon FSNewAlias*函数都已弃用,我们应该使用NSURL API之外的不透明书签NSData对象。然而,我没有幸运地将这些数据转换为别名AppleEvent描述符。

如何在10.8中制作没有FSNewAlias*typeAlias描述符

你基本上不能。(别名的现代替代品是cflbookmark。这里有一个从Alias数据创建Bookmark的例程,但没有其他方法。)然而,可以做的是创建一种不同类型的文件描述符,它可以强制转换为别名——最直接的是typeFileURL,其中的内容只是URL的字节。不可否认,这取决于正确编写的目标应用程序,但它应该可以工作。

如果有人正在寻找一个更直接的解决方案,像这样的东西可以很好地从书签数据创建Apple事件描述符:

+ (NSAppleEventDescriptor *)descriptorWithBookmarkDataForFileURL:(NSURL *)fileURL {
    NSData *targetBookmarkData = [fileURL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:nil];
    return [NSAppleEventDescriptor descriptorWithDescriptorType:typeBookmarkData data:targetBookmarkData];
}

最新更新