Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将plist中的NSURL绑定到沙盒应用程序中的NSPathControl?_Nsurl_Appstore Sandbox_Sandbox_Nspathcontrol_Security Scoped Bookmarks - Fatal编程技术网

如何将plist中的NSURL绑定到沙盒应用程序中的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

我的OS X应用程序需要持久访问用户选择的目录。在我打开app sandbox之前,UI有一个NSPathControl,它具有一个绑定到数据模型的
值。模型中的数据类型为
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