【问题标题】:urlSession download from remote url fail - CFNetworkDownload_gn6wzc.tmp appeared从远程 url 下载 urlSession 失败 - 出现 CFNetworkDownload_gn6wzc.tmp
【发布时间】:2018-10-27 05:50:57
【问题描述】:

我尝试使用 urlSession 从远程 url 下载文件。但是当下载完成时,出现了一个名为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.")
    }

【问题讨论】:

    标签: swift nsurlsession uidocumentinteraction nsurlsessiondownloadtask iosdeployment


    【解决方案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。现在由您决定如何以及在何处存储该数据。临时文件不存储在 Document 目录中。您需要将该文件的内容复制到具有正确扩展名的文件中。替换代码中的给定方法。当您想读取该文件时,请使用 swift.pdf 而不是 tmp 文件。

    【讨论】:

    • 我已经实现了这些方法,但它返回给我的不是 pdf 文件。它给了我文件CFNetworkDownload_jJB6ly.tmp
    • (ralfebert.de/ios-examples/networking/…) 你能下载我的项目并告诉它是否有效吗?
    • 我已经编辑了我的答案。替换给定的代码。它会起作用的。 :)
    • 是的,我已经更换了它,现在它可以工作了。感谢您的宝贵时间;)。
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2022-10-12
    • 2020-11-01
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多