Файл, записанный в фоновом режиме, не сохраняется - PullRequest
0 голосов
/ 08 мая 2018

Я занимаюсь разработкой приложения, которое может получать сообщения / файлы в фоновом режиме через webRTC.

Когда файл получен, я записываю его на диск. Но при попытке доступа к нему позже (даже между запусками приложений) этот файл не существует.

Папка с документами пользователя имеет атрибут NSFileProtectionCompleteUntilFirstUserAuthentication.

Я пытался создать файл на диске, используя NSData s [writeToURL:options:error:], [writeToFile:options:error:]; NSFileManager s [createFileAtPath:contents:attributes:], а также методы NSFileHandle.

Все они успешно создают файл по указанному пути / URL. Сразу после создания я проверяю, существует ли файл с NSFileManager s [attributesOfItemAtPath:error:], который показывает мне следующее:

attributes: { 
   NSFileCreationDate = "2018-05-07 18:47:50 +0000";
   NSFileExtensionHidden = 0;
   NSFileGroupOwnerAccountID = 501;
   NSFileGroupOwnerAccountName = mobile;
   NSFileModificationDate = "2018-05-07 18:47:50 +0000";
   NSFileOwnerAccountID = 501;
   NSFileOwnerAccountName = mobile;
   NSFilePosixPermissions = 420;
   NSFileProtectionKey = NSFileProtectionCompleteUntilFirstUserAuthentication;
   NSFileReferenceCount = 1;
   NSFileSize = 92156;
   NSFileSystemFileNumber = 695101;
   NSFileSystemNumber = 16777219;
   NSFileType = NSFileTypeRegular;
}

[[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]] также показывает, что файл существует после записи.

Учитывая, что это может быть проблема с многопоточностью, я также попытался записать этот файл, поместив его в блок основного потока, но результат тот же. Первый файл, кажется, записан, но при попытке получить к нему доступ, как будто его никогда не было.

Есть ли что-то, что я мог бы пропустить?

edit: добавлена ​​функция, которую я использую для записи.

- (void) saveFileData:(NSData *)fileData completionHandler:(void(^)(BOOL success))completionHandler {
   NSURL *fileURL = [self fileURL];

   NSError *error = nil;
   [fileData writeToURL:fileURL options:NSDataWritingAtomic error:&error];

   if (error) {
      ZLogError(ZLogTypeFile, @"[%@] could not be saved: %@", self.fileKey, error);
      completionHandler(NO);
      return;
   }

   ZLogDebug(ZLogTypeFile, @"<file: %@> exists after write:%d", fileURL, [[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]]);
   NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[fileURL path] error:&error];
   ZLogDebug(ZLogTypeFile, @"attributes: %@", attributes);

   completionHandler(YES);
}

выводится как (где Documents - пользователи NSDocumentDirectory в приложении)

[file: /Documents/57/Downloads/Images/9d1687ab5f4374a2c00429a24316b5ccd3fb0a67.png] exists after write:1

и получение файла (изображения):

- (UIImage *) imageFromURL:(NSURL *)imageURL {
   BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:[imageURL path]];

   if (!fileExists) {
      ZLogDebug(ZLogTypeFile, @"[file: %@] exists: %d", imageURL, fileExists);
      return nil;
   }

   return [UIImage imageWithData:[NSData dataWithContentsOfURL:imageURL]];
}

в журнале (заметьте, что я удалил длинный путь перед каталогом документов здесь):

[file: /Documents/57/Downloads/Images/9d1687ab5f4374a2c00429a24316b5ccd3fb0a67.png] exists: 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...