如何将plist中的NSURL绑定到沙盒应用程序中的NSPathControl?
我的OS X应用程序需要持久访问用户选择的目录。在我打开app sandbox之前,UI有一个NSPathControl,它具有一个绑定到数据模型的如何将plist中的NSURL绑定到沙盒应用程序中的NSPathControl?,nsurl,appstore-sandbox,sandbox,nspathcontrol,security-scoped-bookmarks,Nsurl,Appstore Sandbox,Sandbox,Nspathcontrol,Security Scoped Bookmarks,我的OS X应用程序需要持久访问用户选择的目录。在我打开app sandbox之前,UI有一个NSPathControl,它具有一个绑定到数据模型的值。模型中的数据类型为NSData,绑定使用了NSKeyedUnarchiveFromData值转换器。效果很好 打开应用程序沙箱后,这显然会失败,因为NSURL没有安全范围。为了解决这个问题,我将绑定中的NSKeyedUnarchiveFromData转换器替换为我自己的转换器,如下所示 不幸的是,它并不总是正常工作。有时,当我(作为用户)从NSP
值。模型中的数据类型为NSData
,绑定使用了NSKeyedUnarchiveFromData
值转换器。效果很好
打开应用程序沙箱后,这显然会失败,因为NSURL没有安全范围。为了解决这个问题,我将绑定中的NSKeyedUnarchiveFromData
转换器替换为我自己的转换器,如下所示
不幸的是,它并不总是正常工作。有时,当我(作为用户)从NSPathControl中选择文件时,transformedValue:
返回nil,即使传入该文件的NSData参数为非nil。换句话说,NSURL不会解析书签数据。有人知道这是怎么回事吗?失败时,URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:
返回的错误为
Error Domain=NSCOCAERRORDOMAIN Code=259“无法打开该文件,因为它的格式不正确。”
我看到的行为的原因是(令人惊讶的…)飞行员失误。我应该注意,我上面发布的值转换器子类在NSURL和bookmark NSData之间进行了平滑转换。请注意,com.apple.security.files.bookmarks.app-scope必须在权限文件中声明
@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