我尝试向我的应用程序添加一项服务。该应用程序有一个名为“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,名为“取消归档到当前文件夹”、“取消归档到桌面”和“取消归档到...”。他们都至少请求一次许可。
要请求整个目录的权限,请使用 NSOpenPanel
如this answer以及适当的属性 setCanChooseDirectories:YES
和 setCanChooseFiles:NO
然后使用 SSB 读取和存储 URL。
关于objective-c - NS服务 : "How to create new file in Finder" with Sandbox App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28139729/