我使用此代码告诉我的第二个类将文件保存到给定路径:
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
给NSSavePanel
一个路径它不会抱怨并且正常工作。
我尝试在saveTo:
中记录路径但是工作正常(例如 /Users/Home/Desktop/Result.icns )。
换句话说,当上面的代码保存到 /Users/Home/Desktop/Result.icns 时,它会失败,但是当我让用户决定使用{{{ 1}},没问题。
我正在使用SandBoxing。我该如何解决这个问题?
答案 0 :(得分:3)
沙盒应用程序在其自己的容器文件夹之外没有文件访问权限,除非用户明确允许使用打开/保存面板或通过拖放操作。您需要允许用户选择他们希望保存的路径并保留该文件夹的安全范围书签供以后使用(即,如果您想在应用程序重新启动后更新该文件)。
以下是Apple's Sandbox Design Guide的引用:
您的沙盒应用可以访问其外部的文件系统位置 容器有以下三种方式:
- 在用户的特定方向
- 通过使用特定文件系统位置的权利(在“权利和系统资源访问”中描述)
- 当文件系统位置在某些世界可读的目录中时