0

我的 OS X 应用程序需要持久访问用户选择的目录。在我打开应用沙箱之前,UI 有一个 NSPathControlvalue绑定到数据模型。模型中的数据类型是NSData,并且绑定使用了NSKeyedUnarchiveFromData值转换器。效果很好。

打开应用程序沙盒后,这显然会失败,因为 NSURL 不是安全范围。为了解决这个问题,我用NSKeyedUnarchiveFromData自己的变压器替换了绑定中的变压器,如下所示。

不幸的是,它并不总是正常工作。有时,当我(作为用户)从 NSPathControl 中选择一个文件时,transformedValue:即使传递给它的 NSData 参数不是 nil,也会返回 nil。换句话说,NSURL 不解析书签数据。有人知道这里发生了什么吗?当它失败时,返回的错误URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:

错误域 = NSCocoaErrorDomain 代码 = 259 “文件无法打开,因为它的格式不正确。”

@implementation URLFromBookmarkDataTransformer

+ (BOOL)allowsReverseTransformation {
    return YES;
}

+ (Class)transformedValueClass {
    return [NSURL class];
}

- (id)transformedValue:(id)value {
    if (value == nil) {
        return nil;
    }
    NSAssert([value isKindOfClass:[NSData class]], @"value must be NSData");
    return [NSURL URLByResolvingBookmarkData:value options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:NULL error:NULL];
}

- (id)reverseTransformedValue:(id)value {
    if (value == nil) {
        return nil;
    }
    NSAssert([value isKindOfClass:[NSURL class]], @"value must be NSURL");
    return [value bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
}

@end
4

1 回答 1

1

我看到的行为的原因是(惊喜......)飞行员错误。我应该注意到,我在上面发布的值转换器子类确实可以在 NSURL 和书签 NSData 之间顺利转换。请注意,com.apple.security.files.bookmarks.app-scope 必须在权利文件中声明。

于 2013-07-02T03:10:37.730 回答