NSServices:"如何在Finder中创建新文件"使用Sandbox App

时间:2015-01-25 18:12:26

标签: 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];

我收到错误! 我知道我在做什么是错的,但是如何告诉Finder用户确实提交了操作,因此这个操作在某种程度上是安全的。如何告诉这个newFileURL是允许的? 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

很抱歉在沙箱中说但不可能。您必须要求用户获得创建新文件的权限。它只能在Related itemshere中描述的仅更改文件扩展名的特定情况下工作。

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

编辑:Mac App Store中的Unarchiver实际上是这样做的,只是经过测试。它发布了三个名为“Unarchive To Current Folder”,“Unarchive To Desktop”和“Unarchive To ...”的NSServices。他们都至少要求许可一次。

要获取整个目录的权限,请使用NSOpenPanel中的this answer以及相应的属性setCanChooseDirectories:YESsetCanChooseFiles:NO,然后使用SSB读取并存储网址。