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

约什

我正在编写一个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,但是这将要求我为每个保存的图像指定最终的文件路径/文件名,这会破坏用户体验。

有什么方法可以让沙盒应用程序权限写入特定目录,而不是请求写入每个文件的权限?

CRD

是的,您可以轻松地请求允许写入特定目录的权限。

您已经知道如何使用NSOpenPanel以允许用户选择目录-“或使用NSOpenPanel选择的目录”。当用户这样做时,您将获得目录的读/写权限,因此您可以读取文件名@ 3x.ext并写入一个名为[email protected]的文件,依此类推

现在,除了可以NSOpenPanel用来选择目录之外,您还可以:

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

  2. 设置NSOpenPanel打开对话框时首先显示的目录

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

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

  1. 将提示设置为“请确认对目录的访问”之类的内容;

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

  3. 将初始目录设置为您要查找的目录的目录;

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

捆绑在一起,例如MyConfirmDirectoryPanel

现在,当用户为您提供文件时:

  1. 确定该文件的目录

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

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

  4. 现在,您对该目录具有写许可权,继续创建缩放的图像文件。

您以这种方式获得的访问权限将持续到应用程序的其余执行过程。因此,例如,如果您的用户随后在同一目录中选择了另一个文件,则无需再次请求权限。如果要保留应用程序执行之间的访问权限,也可以执行此操作。您可以使用安全范围的书签来查看此文件,并查找那些文件。使用该机制,您可以创建一个保存的书签的缓存-将其保存为用户默认设置-您可以根据需要激活该书签,以重新获得对该用户先前授予您的目录的访问权限。如果您随时间推移执行此操作,则必须显式地向用户询问权限的次数将会减少,并且您的用户将获得他们期望的UI体验-在同一目录中拖动文件,调整大小并在其旁边创建镜像。

高温超导

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章