objective-c - NS服务 : "How to create new file in Finder" with Sandbox App

标签 objective-c cocoa appstore-sandbox nspasteboard

我尝试向我的应用程序添加一项服务。该应用程序有一个名为“MyService”的服务。 我在 Finder 中有一个文件,我想在同一位置使用新名称复制该文件。用户右键单击该文件并选择 MyService。将出现一个新文件,其新文件名位于原始文件旁边。 问题是我的应用程序是沙盒的。我可以通过以下方式获取所选文件的网址:

- (NSPasteboardItem*)merge:(NSPasteboard *)pboard
 userData:(NSString *)userData error:(NSString **)error {
    NSArray* fileArray=[pboard propertyListForType:NSFilenamesPboardType];
}

我的 fileArray 将包含文件路径。然后我可以使用新文件名更改此文件路径。如果我只是使用以下命令创建一个新文件:

NSString *filePath = [filesArray objectAtIndex:0];
PDFDocument *PDF = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:filePath]];
NSURL *newFileUrl =[NSURL fileURLWithPath:newfilepath];
[PDF writeToURL:newFileURL];

我收到错误! 我知道我所做的事情是错误的,但如何告诉查找器用户确实提交了该操作,因此该操作在某种程度上是安全的。如何判断这个newFileURL是否被允许? 谢谢您的帮助

最佳答案

抱歉地说,但在沙盒中不可能。您必须请求用户允许创建新文件。它仅适用于仅更改文件扩展名的非常特殊的情况,如 Related items 中所述。和 here

或者,您可以向用户请求一次写入整个目录的权限,存储安全范围书签 (SSB) 并在每次启动应用程序时重新获得访问权限。

编辑:Mac App Store 中的 Unarchiver 实际上就是这样做的,刚刚经过测试。它发布了三个 NSService,名为“取消归档到当前文件夹”、“取消归档到桌面”和“取消归档到...”。他们都至少请求一次许可。

要请求整个目录的权限,请使用 NSOpenPanelthis answer以及适当的属性 setCanChooseDirectories:YESsetCanChooseFiles:NO 然后使用 SSB 读取和存储 URL。

关于objective-c - NS服务 : "How to create new file in Finder" with Sandbox App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28139729/

相关文章:

iphone - 在 UITableViewCell 中访问 UITextField

iphone - 区分动态生成的按钮

iphone - 使对象沿路径动画时,使其保持指向点的方向

objective-c - Cocoa App 帮助手册的目录(侧边栏)

ios - spritekit 游戏中的音效开/关

iphone - 如何使用 Core Graphics/Quartz 创建实心圆的一部分

objective-c - 如何使 NSView 透明,但保持属于它的对象不变?

macos - 沙盒应用程序中的 AppleScript `activate` 不会将窗口带到前台

ios - 我可以在沙盒 macOS 应用程序中使用 Peertalk 或 usbmuxd 吗?

objective-c - cocoa 沙盒应用程序 : Spawn FFMPEG