Ошибка загрузки urlSession с удаленного URL-адреса - появился файл CFNetworkDownload_gn6wzc.tmp

Я пытался загрузить файл с удаленного URL-адреса, используя urlSession. Но когда загрузка завершена, появился неожиданный файл с именем CFNetworkDownload_gn6wzc.tmpзатем я не могу открыть этот файл с помощью uidocumentinteractioncontroller. Что это за файл? как исправить эту проблему. Спасибо за ответ.

Вот сообщение

Your location is file:///Users/pisal/Library/Developer/CoreSimulator/Devices/26089E37-D4EA-49E5-8D45-BB7D9C52087D/data/Containers/Data/Application/767E966E-5954-41BA-B003-90E2D27C5558/Library/Caches/com.apple.nsurlsessiond/Downloads/com.SamboVisal.downloadTask/CFNetworkDownload_gn6wzc.tmp

Вот мой пример кода: я отправляю ссылку с помощью этого метода

@IBAction func startDownload(_ sender: Any) {
    let url = URL(string: "http://www.tutorialspoint.com/swift/swift_tutorial.pdf")!
    let task = DownloadManager.shared.activate().downloadTask(with: url)
    task.resume()

}

Затем, когда загрузка завершена:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        debugPrint("Download finished: \(location)")
        debugPrint("download task : \(downloadTask)")
        ViewController().documentInteraction(location: location)

    }

Когда я пытался открыть uidocumentinteractioncontroller

let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
    let destinationPath = documentDirectoryPath.appendingPathComponent("swift.pdf")
    let destinationUrl = URL(fileURLWithPath: destinationPath)

    do{
        try FileManager.default.copyItem(at: locat, to: destinationUrl)
    }
    catch {
        print("error copying file: \(error.localizedDescription)")
    }

    documentInteractionController.url = destinationUrl

    if !documentInteractionController.presentOpenInMenu(from: openButton.bounds, in: view, animated: true) {
        print("You don't have an app installed that can handle pdf files.")
    }

person Visal Sambo    schedule 17.05.2018    source источник


Ответы (1)


Загруженные данные сохраняются во временном файле. Вам нужно записать эти данные в свой файл и использовать их. Напишите следующий код в методе func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL):

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
    debugPrint("Download finished: \(location)")
    do {
        let downloadedData = try Data(contentsOf: location)

        DispatchQueue.main.async(execute: {
            print("transfer completion OK!")

            let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! as NSString
            let destinationPath = documentDirectoryPath.appendingPathComponent("swift.pdf")

            let pdfFileURL = URL(fileURLWithPath: destinationPath)
            FileManager.default.createFile(atPath: pdfFileURL.path,
                                           contents: downloadedData,
                                           attributes: nil)

            if FileManager.default.fileExists(atPath: pdfFileURL.path) {
                print("pdfFileURL present!") // Confirm that the file is here!
            }
        })
    } catch {
        print(error.localizedDescription)
    }
}

ИЗМЕНИТЬ

Когда любой файл загружается с сервера, ваше приложение сохраняет все данные во временном файле. После загрузки файла он дает вам URL-адрес, где он временно хранит ваши данные. Теперь вам решать, как и где вы хотите хранить эти данные. Временные файлы не хранятся в каталоге документов. Вам нужно скопировать содержимое этого файла в свой файл с правильным расширением. Замените данный метод в вашем коде. Если вы хотите прочитать этот файл, используйте swift.pdf, а не tmp.

person Chanchal Chauhan    schedule 17.05.2018
comment
Я реализовал эти методы, но они возвращают мне не файл PDF. Вместо этого он дал мне файл CFNetworkDownload_jJB6ly.tmp. - person Visal Sambo; 17.05.2018
comment
(ralfebert.de/ios-examples/networking/) можешь скачать мой проект и сказать, работает он или нет? - person Visal Sambo; 17.05.2018
comment
Я отредактировал свой ответ. Замените указанный код. Это будет работать. :) - person Chanchal Chauhan; 17.05.2018
comment
Да, я заменил его, и теперь он работает. Спасибо за ваше время ;). - person Visal Sambo; 17.05.2018