NSSavePanel沙盒应用程序后不保存文件(NSSavePanel is not saving

2019-07-29 12:32发布

我在保存一个字符串文件有问题NSSavePanel沙箱为Mac App Store中的后。 我设置com.apple.security.files.user-selected.read-writeYESNSOpenPanel工作,因为它应该。

当我尝试保存新文件,不过,似乎一切正常,但随后没有保存的文件,它应该是....

这是我使用的保存文件的代码:

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

Answer 1:

首先,在-[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对象的值(做一个po error在Xcode的调试器)。 这应该帮助你找出什么是错的。



文章来源: NSSavePanel is not saving a file after sandboxing an app