1

我使用此代码告诉我的第二个班级将文件保存到给定路径:

if ([defaults boolForKey:@"SaveAutomatically"]) {
        basepath = [defaults objectForKey:@"SaveAutomaticallyPath"];
        basepath = [basepath stringByAppendingPathComponent:[defaults objectForKey:@"SaveAutomaticallyName"]];
}
[NSThread detachNewThreadSelector:@selector(saveTo:) toTarget:controller withObject:basepath];

因此,该saveTo:方法被调用。它首先检查给定的路径是否正常

if (![[[aPath pathExtension] lowercaseString] isEqualToString:@"icns"]) {
    aPath = [aPath stringByAppendingPathExtension:@"icns"];
}

if ([[NSFileManager defaultManager] fileExistsAtPath:aPath]) {
    [delegate error:@"File exists already."];
    [self performSelectorOnMainThread:@selector(fs)
                           withObject:nil waitUntilDone:NO];
}

然后它做一些事情并创建一个CGImageDestinationRef

NSURL *fileURL = [NSURL fileURLWithPath:aPath];
CGImageDestinationRef dr = CGImageDestinationCreateWithURL((CFURLRef)fileURL, kUTTypeAppleICNS , count, NULL);
if (!dr) {
    [delegate error:@"Unable to save icon file."];
    [self performSelectorOnMainThread:@selector(fs)
                           withObject:nil waitUntilDone:NO];
    return;
}

dr每次都是零。如果我saveTo使用 a 给 a 路径,NSSavePanel它不会抱怨并且工作正常。我尝试登录路径,saveTo:但效果很好(例如/Users/Home/Desktop/Result.icns)。

换句话说,当上面的代码保存到/Users/Home/Desktop/Result.icns时它会失败,但是当我让用户决定使用 保存到同一路径NSSavePanel时,没有问题。

我正在使用沙盒。我该如何解决这个问题?

4

1 回答 1

3

沙盒应用程序在其自己的容器文件夹之外没有文件访问权限,除非用户使用打开/保存面板或通过拖放明确允许它。您将需要允许用户选择他们希望保存到的路径并保留该文件夹的安全范围书签以供以后使用(即,如果您想在应用程序重新启动后更新该文件)。

这是苹果沙盒设计指南中的一段话:

您的沙盒应用可以通过以下三种方式访问​​其容器外的文件系统位置:

  • 在用户的特定方向
  • 通过使用特定文件系统位置的权利(在“权利和系统资源访问”中描述)
  • 当文件系统位置位于世界可读的某些目录中时
于 2013-01-01T16:55:32.373 回答