使用 OS X 沙箱写入多个文件
Posted
技术标签:
【中文标题】使用 OS X 沙箱写入多个文件【英文标题】:Write multiple files using OS X sandbox 【发布时间】:2014-12-03 00:54:49 【问题描述】:我正在编写一个 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,但这需要我为每个保存的图像指定最终文件路径/文件名,这会破坏用户体验。
有没有办法让沙盒应用程序允许写入某个目录而不是请求写入每个文件的权限?
【问题讨论】:
向搜索引擎询问安全范围的书签。 也许你有其他理由这样做,但你可以使用 automator 来批量调整图像大小... 【参考方案1】:是的,您可以轻松地请求写入某个目录的权限。
您已经知道如何使用NSOpenPanel
来允许用户选择一个目录 - “或使用 NSOpenPanel 选择的目录”。当用户这样做时,您将获得目录的读/写权限,因此您可以读取文件 name@3x.ext 并写入一个名为 name@2x.ext 等的文件.
现在除了可以使用NSOpenPanel
选择目录之外,您还可以:
指定委托方法以确定应启用哪些项目供用户选择,并确定用户选择的项目是否可接受;
设置NSOpenPanel
对话框打开时首先显示的目录;和
在NSOpenPanel
对话框中设置提示信息和按钮标签。
结合这些功能,您可以显示一个对话框,要求用户确认对特定目录的访问:
将提示设置为“请确认访问目录”;
将“打开”按钮上的标签设置为“确认”;
将初始目录设置为您所在目录的父;和
使用委托方法只允许用户选择要取消的目录。
将其捆绑为 MyConfirmDirectoryPanel
。
现在当用户向你展示一个文件时:
确定该文件的目录
使用access()
系统调用检查您是否对目录具有写访问权限 - 请参阅“Unix”手册的第 2 节(只需在 Xcode 的文档中搜索 access
)。如果您有写入权限,请转到 (4)。
如果您没有访问权限,请使用 MyConfirmDirectoryPanel
让用户选择目录,从而授予您访问权限。
您现在对该目录具有写入权限,继续创建您的缩放图像文件。
您以这种方式获得的访问权限将持续到您的应用程序的剩余执行期间;因此,例如,如果您的用户随后在同一目录中选择了另一个文件,则您不必再次请求许可。如果您想保留应用程序执行之间的访问权限,您也可以这样做。您使用安全范围的书签,查看这些文档。使用该机制,您可以创建已保存书签的缓存 - 将它们存储在您的用户默认值中 - 您可以根据需要激活它以重新获得对用户先前授予您的目录的访问权限。如果您随着时间的推移这样做,您必须明确要求用户许可的次数将会减少,您的用户将获得他们期望的 UI 体验 - 拖动一个文件,并在同一目录中在它旁边创建调整大小的图像。
HTH
【讨论】:
以上是关于使用 OS X 沙箱写入多个文件的主要内容,如果未能解决你的问题,请参考以下文章
jQuery 将 iframe 写入 XLS 导致 iPhone 上的沙箱访问冲突
全网首发:(解决办法)MAC OS Xcode给应用设置沙箱(Enable App Sandbox)之后,运行报错Illegal instruction: 4
全网首发:(解决办法)MAC OS Xcode给应用设置沙箱(Enable App Sandbox)之后,运行报错Illegal instruction: 4