在照片和沙盒应用程序之间拖放
Drag & Drop between Photos and a Sandboxed app
我有一个沙盒应用程序。我希望用户能够将图片从照片应用拖到我的沙盒应用中。
我编写了所有用于处理来自照片的 "promised file" 的代码,在与非沙盒应用程序一起使用时没有问题。但是对于我的沙盒应用程序,照片告诉我它无权将图片文件写入目标文件夹...这是我的沙盒应用程序中的临时文件夹。
即使在临时文件夹中,照片也不能写入我的沙箱,这是合乎逻辑的。但是由于我的应用程序无法访问沙箱之外的内容,我该如何将文件从照片交换到我的应用程序???
编辑以根据要求提供一些代码
NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]] ;
NSError *error = nil ;
[[NSFileManager defaultManager] createDirectoryAtPath:tempPath
withIntermediateDirectories:NO
attributes:nil
error:&error] ;
filenames = [sender namesOfPromisedFilesDroppedAtDestination:[NSURL fileURLWithPath:tempPath]] ;
(文件名是全局变量NSArray)
还有照片显示的错误消息(对不起,图片是法语的,但消息并不是很有用,因为它无法完全显示。显示的部分显示“0 文件(out of 1) exported.Impossible to move "image" to "folder" : 要么这个文件夹不存在,要么文件夹不能被 //cut//
我当然检查过该文件夹确实存在。
编辑更多信息
我想我找到了一条调查路径:
当我在临时文件夹中创建唯一文件夹时,它会得到一个 "quarantine" 标志。我检查了使用终端和 "ls -l",可以在权限后看到一个“@”。现在,如果我不创建唯一文件夹,照片可以直接将文件放到临时文件夹中。因此问题是照片无法使用 "quarantined" 文件夹。
现在这还没有用。无论如何,拖放图片文件也设置了隔离标志,我的应用程序无法读取它!
我找不到摆脱那些隔离标志的方法。
最奇怪的是,如果我只是一步一步地使用调试器,一切都运行良好。
沙盒将允许文件承诺提供程序应用程序写入文档文件夹。
[[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:NULL];
好的,我发现哪里不对了。它与隔离或应用程序被沙盒无关。
事实上,当调用 namesOfPromisedFilesDroppedAtDestination: 时,提供程序应用程序(在我的例子中是照片)开始在临时文件夹中写入文件。这可能需要一些时间。因此,我开始监视目标文件夹中的事件,并且 仅对第一个事件做出反应 。 (检查这个:)。
但是
照片应用正在分几步发送文件。第一步创建一个临时文件,稍后将其重命名为 "correct" 图像文件。这个临时文件的创建是我的应用程序捕获的事件。我的应用随后正在检查图像文件是否存在,但还没有。
因此,解决方案是继续检查文件夹事件,直到承诺的文件确实存在。如果还没有,则继续等待。希望有前途的应用有一天能实现它的承诺。
感谢 catlan 推动我重新调查。
我有一个沙盒应用程序。我希望用户能够将图片从照片应用拖到我的沙盒应用中。
我编写了所有用于处理来自照片的 "promised file" 的代码,在与非沙盒应用程序一起使用时没有问题。但是对于我的沙盒应用程序,照片告诉我它无权将图片文件写入目标文件夹...这是我的沙盒应用程序中的临时文件夹。
即使在临时文件夹中,照片也不能写入我的沙箱,这是合乎逻辑的。但是由于我的应用程序无法访问沙箱之外的内容,我该如何将文件从照片交换到我的应用程序???
编辑以根据要求提供一些代码
NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]] ;
NSError *error = nil ;
[[NSFileManager defaultManager] createDirectoryAtPath:tempPath
withIntermediateDirectories:NO
attributes:nil
error:&error] ;
filenames = [sender namesOfPromisedFilesDroppedAtDestination:[NSURL fileURLWithPath:tempPath]] ;
(文件名是全局变量NSArray)
还有照片显示的错误消息(对不起,图片是法语的,但消息并不是很有用,因为它无法完全显示。显示的部分显示“0 文件(out of 1) exported.Impossible to move "image" to "folder" : 要么这个文件夹不存在,要么文件夹不能被 //cut//
我当然检查过该文件夹确实存在。
编辑更多信息
我想我找到了一条调查路径:
当我在临时文件夹中创建唯一文件夹时,它会得到一个 "quarantine" 标志。我检查了使用终端和 "ls -l",可以在权限后看到一个“@”。现在,如果我不创建唯一文件夹,照片可以直接将文件放到临时文件夹中。因此问题是照片无法使用 "quarantined" 文件夹。
现在这还没有用。无论如何,拖放图片文件也设置了隔离标志,我的应用程序无法读取它!
我找不到摆脱那些隔离标志的方法。
最奇怪的是,如果我只是一步一步地使用调试器,一切都运行良好。
沙盒将允许文件承诺提供程序应用程序写入文档文件夹。
[[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:NULL];
好的,我发现哪里不对了。它与隔离或应用程序被沙盒无关。
事实上,当调用 namesOfPromisedFilesDroppedAtDestination: 时,提供程序应用程序(在我的例子中是照片)开始在临时文件夹中写入文件。这可能需要一些时间。因此,我开始监视目标文件夹中的事件,并且 仅对第一个事件做出反应 。 (检查这个:
但是
照片应用正在分几步发送文件。第一步创建一个临时文件,稍后将其重命名为 "correct" 图像文件。这个临时文件的创建是我的应用程序捕获的事件。我的应用随后正在检查图像文件是否存在,但还没有。
因此,解决方案是继续检查文件夹事件,直到承诺的文件确实存在。如果还没有,则继续等待。希望有前途的应用有一天能实现它的承诺。
感谢 catlan 推动我重新调查。