0

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

- (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 是允许的?谢谢您的帮助

4

1 回答 1

1

很抱歉,但在沙盒中是不可能的。您必须询问用户创建新文件的权限。它仅适用于仅更改文件扩展名的特殊情况,如相关项目此处所述。

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

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

要请求整个目录的权限,请使用此答案NSOpenPanel中的 a 和适当的属性,然后使用 SSB 读取和存储 URL。setCanChooseDirectories:YESsetCanChooseFiles:NO

于 2015-04-16T13:10:48.537 回答