我尝试将一项服务添加到我的应用程序中。这个应用程序有一个叫做的服务,比如说," 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];
我收到错误! 我知道我在做什么是错的,但是如何告诉Finder用户确实提交了操作,因此这个操作在某种程度上是安全的。如何告诉这个newFileURL是允许的? 谢谢你的帮助
答案 0 :(得分:1)
很抱歉在沙箱中说但不可能。您必须要求用户获得创建新文件的权限。它只能在Related items和here中描述的仅更改文件扩展名的特定情况下工作。
或者,您可以要求用户一次获得写入整个目录的权限,存储安全范围书签(SSB)并在每次启动应用时重新获得访问权限。
编辑:Mac App Store中的Unarchiver实际上是这样做的,只是经过测试。它发布了三个名为“Unarchive To Current Folder”,“Unarchive To Desktop”和“Unarchive To ...”的NSServices。他们都至少要求许可一次。要获取整个目录的权限,请使用NSOpenPanel
中的this answer以及相应的属性setCanChooseDirectories:YES
和setCanChooseFiles:NO
,然后使用SSB读取并存储网址。