使用OS X沙箱写入多个文件

时间:2014-12-03 00:54:50

标签: objective-c macos cocoa sandbox

我正在编写OS X沙盒应用程序。它接收@ 3x和@ 2x图像文件并将其转换为低分辨率图像。我通过拖动到应用程序窗口中的文件或使用NSOpenPanel选择的目录来获取图像URL。

拖动图像或选择文件夹后,我运行for循环并使用此方法调整每个图像的大小

-(BOOL)writeImage:(NSImage*)image toFile:(NSString*)file withRepresentation:(NSString*)extension{

CGImageRef cgRef = [image CGImageForProposedRect:NULL
                                         context:nil
                                           hints:nil];
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:cgRef];
[newRep setSize:[image size]];
NSData *pngData = [newRep representationUsingType:[self getRepresentationType:extension] properties:nil];
return [pngData writeToFile:[file stringByAppendingString:[NSString stringWithFormat:@".%@",extension]] atomically:YES];

这打破了沙盒模型。我已经读过我应该使用NSSavePanel,但是这需要我为每个保存的图像指定最终的文件路径/文件名,这会破坏用户体验。

有没有办法让沙盒应用程序permision写入某个目录而不是请求写入每个文件的权限?

1 个答案:

答案 0 :(得分:2)

是的,您可以轻松地请求写入某个目录的权限。

您已经知道如何使用NSOpenPanel来允许用户选择目录 - “或使用NSOpenPanel选择的目录”。当用户这样做时,您将获得该目录的读/写权限,因此您可以读取文件 name@3x.ext 并编写一个名为 name@2x.ext 等的文件

现在,除了能够使用NSOpenPanel选择目录外,您还可以:

  1. 指定委托方法以确定应为用户选择哪些项目,以及确定用户选择的项目是否可接受;

  2. 设置打开NSOpenPanel对话框时首次显示的目录;以及

  3. NSOpenPanel对话框中设置提示消息和按钮标签。

  4. 结合这些功能,您可以显示一个对话框,要求用户确认对特定目录的访问权限:

    1. 将提示设置为“请确认访问目录”;

    2. 将“打开”按钮上的标签设置为“确认”;

    3. 将初始目录设置为您所在目录的;以及

    4. 使用委托方法只允许用户选择要取消的目录。

    5. 将其捆绑为MyConfirmDirectoryPanel

      现在,当用户向您显示文件时:

      1. 确定该文件的目录

      2. 使用access()系统调用检查您是否具有对目录的写访问权限 - 请参阅“Unix”手册的第2部分(只需在Xcode的文档中搜索access)。如果您有写入权限,请转到(4)。

      3. 如果您没有访问权限,请使用MyConfirmDirectoryPanel让用户选择目录,从而授予您访问权限。

      4. 您现在拥有该目录的写入权限,请继续创建缩放的图像文件。

      5. 您以这种方式获得的访问将持续执行您的应用;因此,例如,如果您的用户随后在同一目录中选择了另一个文件,则无需再次请求权限。如果您想保留应用程序执行之间的访问权限,您也可以这样做。您使用安全范围书签,查看这些文档。使用该机制,您可以创建已保存书签的缓存 - 将其存储在您的用户默认值中 - 您可以根据需要激活它们以重新获得用户先前授予您的目录的访问权限。如果你这样做,你必须明确要求用户获得许可的次数会减少,你的用户将获得他们期望的用户体验 - 拖动一个文件,在其旁边创建的resd imaged在同一目录中。

        HTH

相关问题