gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:33:50 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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

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

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

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

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

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

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

将其捆绑为 MyConfirmDirectoryPanel

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

  1. 确定该文件的目录

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

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

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

您通过这种方式获得的访问权限将持续到您的应用程序的剩余执行时间;因此,例如,如果您的用户选择同一目录中的另一个文件,您将不必再次请求许可。如果您想保留应用程序执行之间的访问权限,您也可以这样做。您可以使用安全范围的书签来实现这一点,请查找这些书签的文档。使用该机制,您可以创建已保存书签的缓存 - 将它们存储在您的用户默认值中 - 您可以根据需要激活该缓存以重新获得对用户先前授予您的目录的访问权限。如果您随着时间的推移执行此操作,则必须明确请求用户许可的次数将会减少,并且您的用户将获得他们期望的 UI 体验 - 拖动文件,调整大小,在同一目录中在其旁边创建图像。

HTH

关于objective-c - 使用 OS X 沙箱写入多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27261842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com