NSServices : "How to create new file in Finder" with Sandbox App

NSServices : "How to create new file in Finder" with Sandbox App

我尝试向我的应用程序添加服务。这个应用程序有一个名为 "MyService" 的服务。 我在 Finder 中有一个文件,我想将该文件以新名称复制到同一位置。用户将右键单击文件和 select MyService。一个带有新文件名的新文件将出现在原始文件的旁边。 问题是我的应用程序被沙盒化了。我可以得到文件 selected 的 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 是允许的? 感谢您的帮助

很抱歉,但在沙盒中是不可能的。您必须征求用户的许可才能创建新文件。它只适用于非常特殊的情况,如 Related items and here 中所述,只需更改文件扩展名。

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

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

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