Каков максимальный размер файла во временном каталоге в iOS? - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь сохранить изображение размером 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 по каждому процессу-limit

Это потому, что размер 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 ]

0 голосов
/ 07 декабря 2018

Так получилось.Вместо загрузки данных с помощью 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()
0 голосов
/ 07 декабря 2018

Я не знаю, есть ли ограничение размера содержимого, которое вы можете записать во временный каталог (кроме свободного места), но я могу сказать, что я написал клиентские приложения, которые пишутсотни мегабайт в этот каталог.Это не твоя проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...