通过共享扩展从图库保存照片时 NSData WriteToFile 失败

NSData WriteToFile Fails while saving a photo from gallery through Share Extension

我正在编写一个具有共享扩展功能的应用程序,用于将所选照片从 iphone 照片库保存到我的应用程序的本地存储中。 NSData WriteToFile returns 是的,但我无法在写入时提供路径的目录中找到存储的文件。 因此,简而言之,NSData WriteToFile 无法在给定路径保存照片。

下面是我的代码。

   - (IBAction)acceptButtonTapped:(id)sender
{
    __block UIImage *photo;
    for (NSExtensionItem *item in self.extensionContext.inputItems)
    {
        for (NSItemProvider *itemProvider in item.attachments)
        {
            if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage])
            {
                [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) {
                    if(image)
                    {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            photo = image;

                            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

                            [formatter setDateFormat:@"yyyy_MM_dd_hh_mm_ss"];

                            NSString *fileName;

                            fileName = [NSString stringWithFormat:@"%@.jpeg",[formatter stringFromDate:[NSDate date]]];

                            dataPath = [dataPath stringByAppendingPathComponent:fileName];
                            NSData * imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)];
                            BOOL isdone = [imageData writeToFile:dataPath atomically:NO];
                            NSLog(@"%u", isdone);
                        });
                    }
                }];
                break;
            }
        }
    }

    [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}

任何帮助将不胜感激。

谢谢。

您在每次通过循环时修改数据路径,向其附加另一个文件名。这将创建一系列不断增长的格式错误的路径,其中包含所有文件名。

不要那样做。新建一个局部变量fi​​lePath,并使用

构造一个文件名到filePath中
filePath = [docsPath stringByAppendingPathComponent: filename];

记录您的路径并查看它。当您的程序没有按预期运行时,请不要相信您的任何假设,因为其中一个或多个假设可能是错误的。

如果您尝试从共享扩展访问文档目录,您不能这样做。共享扩展或其他小部件是独立于它们包含的应用程序的应用程序,因此有自己的沙箱。因此,您将需要使用应用组来共享文件。

应用程序组主要针对扩展,更具体地说,针对小部件。

NSFileManager 有一个方法 containerURLForSecurityApplicationGroupIdentifier:您可以在其中传入在为您的应用程序打开应用程序组时创建的标识符

NSURL *containerURL = [[NSFileManager defaultManager] 
           containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];

您可以将文件保存到此位置,因为您可以从扩展程序和主机应用程序访问共享应用程序组。