Каков максимальный размер файла во временном каталоге в 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()