Сбой NSData WriteToFile при сохранении фотографии из галереи через расширение общего доступа

Я пишу приложение с расширением общего доступа для сохранения выбранной фотографии в локальном хранилище моего приложения из фотогалереи iphone. NSData WriteToFile возвращает YES, но я не смог найти сохраненный файл в каталоге, путь к которому я указал при записи. Итак, короче говоря, 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];
}

Любая помощь будет очень ценна.

Спасибо.


person Paras Gorasiya    schedule 30.03.2016    source источник
comment
Пожалуйста, проверьте «dataPath», т.е. содержит ли он путь к вашему локальному хранилищу, например DocumentDirectory?   -  person Mahendra    schedule 30.03.2016
comment
он находится в DocumentDirectory, я создал папку внутри DocumentDirectory и храню в ней фотографию. Есть ли у него проблемы с этим?   -  person Paras Gorasiya    schedule 30.03.2016
comment
Запишите свой путь к консоли отладки в симуляторе, затем скопируйте все, кроме имени файла, в буфер обмена, перейдите в средство поиска, нажмите команду shift G и вставьте путь в диалоговое окно «Перейти к папке». Посмотрите, что происходит. Также запишите путь к каталогу документов в applicationDidFinishLaunching и убедитесь, что ваш путь указывает на файл в этом каталоге.   -  person Duncan C    schedule 30.03.2016


Ответы (2)


Если вы пытаетесь получить доступ к каталогу документов из расширения общего доступа, НЕТ вы не можете этого сделать. Расширение общего доступа или другие виджеты представляют собой отдельное приложение от содержащего их приложения и, следовательно, имеют собственную песочницу. Поэтому вам нужно будет использовать группы приложений для обмена файлами.

Группы приложений в первую очередь предназначены для расширений, а точнее для виджетов.

NSFileManager имеет метод containerURLForSecurityApplicationGroupIdentifier: где вы можете передать идентификатор, созданный вами при включении групп приложений для ваших приложений.

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

Вы можете сохранить файлы в этом месте, потому что вы можете получить доступ к общим группам приложений как из расширения, так и из хост-приложения.

person Surya Subenthiran    schedule 30.03.2016
comment
Да, вы правы насчет URL-адреса контейнера, но когда я сохраняю какой-либо файл по этому URL-адресу, он каждый раз терпит неудачу. Мне нужно сделать какой-либо каталог, а затем попытаться сохранить? Это показывает мне ошибку, что нет такого файла или каталога - person Paras Gorasiya; 30.03.2016
comment
Вам необходимо создать группу приложений на вкладке «Возможности проекта», которая должна быть общей как для виджета, так и для хост-приложения. И измените имя созданного идентификатора группы приложений в приведенном выше коде. Тогда это должно работать. - person Surya Subenthiran; 30.03.2016

Вы изменяете dataPath при каждом проходе цикла, добавляя к нему другое имя файла. Это создаст постоянно растущую серию неправильно сформированных путей, содержащих все имена файлов.

Не делай этого. Создайте новую локальную переменную filePath и создайте имя файла в filePath, используя

filePath = [docsPath stringByAppendingPathComponent: filename];

Запишите свой путь и ПОСМОТРИТЕ НА ЭТО. Когда ваша программа ведет себя не так, как ожидалось, не доверяйте ни одному из своих предположений, потому что одно или несколько из них могут оказаться неверными.

person Duncan C    schedule 30.03.2016