Каков максимальный размер файла во временном каталоге в iOS?
Я пытаюсь сохранить изображение размером 7,9 МБ, загруженное отсюда. Но в строке 'try data.write...' расширение падает, и я получаю это в консоли.
ядро EXC_RESOURCE -> Расширение уведомлений [3137] превысило предел памяти: ActiveHard 12 МБ (фатально)
ядро 46710.034, состояние памяти: killing_specific_process pid 3137 [Расширение уведомлений] (ограничение на процесс 3) - memorystatus_available_pages: 73906
ReportCrash запуск таймера транзакции продления по умолчанию 18:39:53.104640 +0530
Расширение уведомлений о процессах ReportCrash [3137] уничтожено причиной jetsam для каждого процесса-лимита
Это потому, что размер 7,9 МБ слишком велик, чтобы справиться с этим. Если это так, то это не имеет смысла, поскольку необходимо сохранить носитель во временном хранилище перед созданием объекта UNNotificationAttachment. В официальной документации лимит для png файлов указан как 10 МБ, а для видео - 50 МБ. Как мне это решить?
let fileManager = FileManager.default
let folderName = ProcessInfo.processInfo.globallyUniqueString
guard let folderURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(folderName, isDirectory: true) else {
return nil
}
do {
try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: true, attributes: nil)
let fileURL = folderURL.appendingPathComponent(fileIdentifier)
try data.write(to: fileURL, options: [])
let attachment = try UNNotificationAttachment(identifier: fileIdentifier, url: fileURL, options: options)
return attachment
} catch let error {
}
2 ответа
Я не знаю, существует ли ограничение на размер содержимого, которое вы можете записать во временный каталог (кроме свободного места), но я могу вам сказать, что я написал клиентские приложения, которые записывают сотни мегабайт в этот каталог. Это не твоя проблема.
Это сработало так. Вместо загрузки данных с помощью NSData(contentsOf:)
, Я использовал URLSession.shared.downloadTask(with:)
, Это хранит загруженные данные отдельно, поэтому нам не нужно их записывать. Он просто должен быть перемещен в нужное временное местоположение с помощью FileManager.shared.moveItem(at:to:)
, Похоже, проблема была с NSData.write(to:options:)
функция. У него есть ограничение по размеру.
URLSession.shared.downloadTask(with: url) { (location, response, error) in
if let location = location {
let tmpDirectory = NSTemporaryDirectory()
let tmpFile = "file://".appending(tmpDirectory).appending(url.lastPathComponent)
let tmpUrl = URL(string: tmpFile)!
try! FileManager.default.moveItem(at: location, to: tmpUrl)
if let attachment = try? UNNotificationAttachment(identifier: "notification-img", url: tmpUrl) {
bestAttemptContent.attachments = [attachment]
}
}
contentHandler(bestAttemptContent)
}.resume()