我已经在Apple的开发者论坛上发布了这个问题,并且在一周之后没有得到回复,所以我希望我能在这里有更好的运气。
我创建了一个标准的基于文档的应用程序(使用NSDocument,保存简单的XML文件),我现在需要扩展它以将文档范围的书签保存到用户选择的外部文件中。
一切正常,除了文档范围的书签在我从文件中读回后无法解决这一事实,原来是由于NSDocument以原子方式编写文件。
背景
因为我发现通过Apple的开发者论坛或网络搜索找到有关报告错误的信息非常困难,所以我会快速记录我发现的情况,以防它帮助同一船上的任何人。
失败尝试返回的错误是:
错误Domain = NSCocoaErrorDomain Code = 256“无法打开文件”somefile.xml“。”
其中,somefile.xml是(文件名组件)在下面的代码块中作为“relativeToURL:”传递的绝对URL。
当启用原子文件保存时,有App Sandbox: document-scoped bookmark not resolving; not returning any error等报告表明沙盒/书签存在问题。
此问题的先前报告没有给出相同的错误(它们通常是指没有错误消息的失败),但我创建了一个单独的测试应用程序(不使用NSDocument)来测试它,并发现我能够在编写文件时使用以下代码重现上述相同的错误消息:
// HACK: Save a temporary value to the file so that the file exists when creating the bookmark
NSString *temp = @"Temp";
[temp writeToURL:saveURL atomically:NO encoding:NSUTF8StringEncoding error:&error];
// Create bookmark to imageURL relative to the save location
NSData *bookmarkData = [imageURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:[saveURL absoluteURL] error:&error];
if(bookmarkData == nil) return;
// Convert NSData to a string format.
NSString *bookmarkString = [bookmarkData base64EncodedString];
// Write the file.
[bookmarkString writeToURL:saveURL atomically:YES encoding:NSUTF8StringEncoding error:&error];
将最后一行更改为“原子地:否”时,书签正确解析,一切都按预期工作。
NSDocument和原子写作
由于NSDocument的默认和推荐设置使用原子写入,并且这不适用于Sandbox的核心功能之一,我正在寻找一种方法来使文档范围的书签和NSDocument协同工作,我认为这意味着找到一种让NSDocument直接写文件而不是原子文件的方法。
我还没有找到解决Apple框架失败问题的任何工作解决方案(在这些论坛或更广泛的搜索中)。
我可以覆盖其中一个
但在每种情况下,文档都说“如果你覆盖这个方法,一定要调用超类实现”,这可能会继续以原子方式保存文件。
我的目标是以一种可以继续支持Apple推动开发人员(无论好坏)的其他用户体验期望的方式来实现这一目标 - 例如。 autosavesInPlace,版本等。但我愿意牺牲那些细节,以便有一个可以发布到AppStore中的工作沙盒应用程序。