Blu*_*lue 8 cocoa objective-c nssavepanel appstore-sandbox
我在使用NSSavePanel沙盒化Mac App Store的应用程序后保存字符串文件时遇到问题.我设置com.apple.security.files.user-selected.read-write了YES,NSOpenPanel它正在按预期工作.
但是,当我尝试保存一个新文件时,似乎一切正常,但是没有保存的文件应该是....
这是我用来保存文件的代码:
NSSavePanel *save = [NSSavePanel savePanel];
long int result = [save runModal];
if (result == NSOKButton)
{
NSString *selectedFile = [save filename];
NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile];
NSString *arrayCompleto = [[NSString alloc]initWithFormat:@"bla bla bla"];
[arrayCompleto writeToFile:fileName
atomically:NO
encoding:NSUTF8StringEncoding
error:nil];
}
Run Code Online (Sandbox Code Playgroud)
Dov*_*Dov 11
首先,-[NSSavePanel filename]选择器已被弃用.请-[NSSavePanel URL]改用.第二,-[NSString writeToFile:atomically:encoding:error]告诉你你做错了什么的方式是error:(NSError**)参数.
您还应特别处理文件I/O的错误,因为即使您的代码100%正确,用户系统上仍可能存在错误(权限不足等),并且向用户显示错误将允许他们看到它失败了(并且知道为什么).处理代码中的错误还可以让您的应用程序恢复.例如,如果您尝试在下面的文件中读取您粘贴的代码(将其写入磁盘后),但是用户尝试将其写入他们无权访问的网络共享,则您的应用可能会崩溃.如果您知道写入失败,则可以相应地进行(可能会提示输入不同的保存位置).
但是,在这种情况下,我认为以下行是您的问题:
NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile];
Run Code Online (Sandbox Code Playgroud)
当您的应用程序是沙盒时,用户需要通过打开/保存面板为您授予特定文件或特定目录的权限,以将它们带入您的沙箱.您正在做的是获取用户授予您写入权限的文件并说"这很好,但我想保存另一个文件",这违反了沙盒.您应该做的是在保存面板中设置扩展名.完整的固定解决方案是:
NSSavePanel *save = [NSSavePanel savePanel];
[save setAllowedFileTypes:[NSArray arrayWithObject:@"dat"]];
[save setAllowsOtherFileTypes:NO];
NSInteger result = [save runModal];
if (result == NSOKButton)
{
NSString *selectedFile = [[save URL] path];
NSString *arrayCompleto = @"bla bla bla";
NSError *error = nil;
[arrayCompleto writeToFile:selectedFile
atomically:NO
encoding:NSUTF8StringEncoding
error:&error];
}
if (error) {
// This is one way to handle the error, as an example
[NSApp presentError:error];
}
Run Code Online (Sandbox Code Playgroud)
如果将来出现其他问题,您可以检查error运行时的值.在调试时,在if (error)语句中设置断点以检查error对象的值(po error在Xcode的调试器中执行).这应该可以帮助你弄清楚什么是错的.