gpt4 book ai didi

objective-c - NSSavePanel 在沙盒应用程序后不保存文件

转载 作者:太空狗 更新时间:2023-10-30 03:32:03 25 4
gpt4 key购买 nike

在对 Mac App Store 的应用程序进行沙盒处理后,我在使用 NSSavePanel 保存字符串文件时遇到问题。我将 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];
}

最佳答案

首先,-[NSSavePanel filename] 选择器已被弃用。请改用 -[NSSavePanel URL]。其次,-[NSString writeToFile:atomically:encoding:error] 告诉您做错了什么的方式是使用 error:(NSError**) 参数.

你还应该特别处理文件 I/O 的错误,因为即使你的代码 100% 正确,用户系统上仍然可能存在错误(权限不足等),并且将错误呈现给用户将让他们看到它失败了(并且知道为什么)。处理代码中的错误还可以让您的应用恢复。例如,如果您尝试读取粘贴代码下方的文件(将其写入磁盘后),但用户尝试将其写入他们无权访问的网络共享,则您的应用可能会崩溃。如果您知道写入失败,您可以相应地继续(可能提示不同的保存位置)。

不过,在这种情况下,我相信以下行是您的问题:

NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile];

当您的应用程序被沙盒化时,用户需要通过打开/保存面板授予您对特定文件特定目录的权限,以便将它们放入您的沙箱。你正在做的是获取用户授予你写入权限的文件并说“这很好,但我想保存一个不同的文件”,这违反了沙箱。您应该做的是在保存面板中设置扩展名。完整的固定解决方案是:

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];
}

如果以后出现其他错误,您可以在运行时检查error 的值。调试时,在 if (error) 语句中设置断点以检查 error 对象的值(在 Xcode 的调试器中执行 po error)。这应该可以帮助您找出问题所在。

关于objective-c - NSSavePanel 在沙盒应用程序后不保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com