Я занимаюсь разработкой приложения, которое может получать сообщения / файлы в фоновом режиме через 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