我正在尝试保存从here下载的7.9MB大小的图像。但是在“ try data.write ...”行中,扩展崩溃了,我在控制台中得到了它。
内核EXC_RESOURCE->通知扩展[3137]超出内存限制:ActiveHard 12 MB(致命)
内核46710.034 memorystatus:killing_specific_process pid 3137 [通知扩展名](每个进程限制3)-memorystatus_available_pages:73906
ReportCrash启动延长事务计时器 默认18:39:53.104640 +0530
ReportCrash流程通知扩展[3137]被jetsam原因per-process-limit杀死
是因为7.9MB的大小太大而无法处理。如果是这样,则没有意义,因为必须在创建UNNotificationAttachment对象之前将媒体保存在临时存储中。在官方文档中,png文件的限制为10 MB,视频文件的限制为50 MB。我该如何解决?
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 {
}
答案 0 :(得分:2)
我不知道您可以写入临时目录(除了可用空间)的内容是否有大小限制,但是我可以告诉您我已经编写了客户端应用程序,将数百兆字节写入该目录。那不是你的问题。
答案 1 :(得分:0)
以这种方式工作。我没有使用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()