{"id":1251,"date":"2017-10-21T08:59:07","date_gmt":"2017-10-20T23:59:07","guid":{"rendered":"http:\/\/blue-bear.jp\/kb\/?p=1251"},"modified":"2017-10-21T08:59:07","modified_gmt":"2017-10-20T23:59:07","slug":"swift4-how-to-download-files-from-internet-as-background","status":"publish","type":"post","link":"https:\/\/blue-bear.jp\/kb\/swift4-how-to-download-files-from-internet-as-background\/","title":{"rendered":"[swift4] How to download files from Internet as background"},"content":{"rendered":"<p>How to download files from Internet as background, is below code<\/p>\n<p>Can get completionheader by adding &#8220;handleEventsForBackgroundURLSession&#8221; at AppDelegate when download completed at background<\/p>\n<p>in this case, Download progress info is displayed at progress bar<\/p>\n<h2>AppDelegate.swift<\/h2>\n<pre>\r\n\r\n    \/\/MARK: BackgroundDownload\r\n    private func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {\r\n        \r\n        print(\"Background OK\")\r\n        completionHandler()\r\n        \r\n    }\r\n<\/pre>\n<h2>viewController.swift<\/h2>\n<p>Have to setup URLSessionDownloadDelegate<\/p>\n<p>on didFinishDownloadingTo, run method when download complete.<br \/>\nfor instance, move tmp downloaded file to local <\/p>\n<p>on didWriteData, get download progress info, then update progress bar.<\/p>\n<p>on didCompleteWithError, call this method in the case of error.<\/p>\n<pre>\r\n\r\n\r\nclass viewContoller: UIViewController,URLSessionDownloadDelegate{\r\n    \r\n    @IBOutlet var progressBar: UIProgressView!\r\n\r\n    \/\/MARK: didload\r\n    override func viewDidLoad() {\r\n        super.viewDidLoad()\r\n\r\n        if let url:NSURL = NSURL(string: \"https:\/\/xxxxxxx\") {\r\n           self.startDownload(url: url as URL, id: \"252\", name: \"\u30c6\u30b9\u30c8\")\r\n        }\r\n    }\r\n\r\n    \/\/MARK: Progress Bar\r\n    func resetProgress(){\r\n        DispatchQueue.main.async {\r\n            self.progressBar.isHidden = true\r\n            self.progressBar.progress = 0\r\n        }\r\n        \r\n    }\r\n    \r\n    \/\/Custom fucntion\r\n    func startDownload(url : URL, id: String, name: String){\r\n        progressBar.isHidden = false\r\n        \r\n        let session = initSession(delegate:self)\r\n        let downloadTask = session.downloadTask(with: url)\r\n        downloadTask.taskDescription = \"\\(id),\\(name)\"\r\n        downloadTask.resume() \/\/start download\r\n        \r\n    }\r\n    \r\n    \r\n    \/\/ MARK: - URLSessionDownloadDelegate\r\n   \r\n    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {\r\n        \r\n        print(\"download complete\")\r\n        \r\n        resetProgress()\r\n        \r\n        let fileName = downloadTask.originalRequest?.url?.lastPathComponent\r\n        let localURL = NSURL(string: \"file:\/\/\"+fileInLibraryDirectory(filename: fileName!))\r\n        let info = downloadTask.taskDescription?.components(separatedBy: \",\")\r\n\r\n        \/\/save file from tmp to local\r\n        do {\r\n            try FileManager.default.copyItem(at: location, to: localURL! as URL)\r\n            \/\/other method after saving file to local\r\n            \r\n        } catch (let writeError) {\r\n            print(\"error writing file \\(location) : \\(writeError)\")\r\n        }\r\n        \r\n    }\r\n    \r\n    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {\r\n        \r\n        let progress = Float(totalBytesWritten) \/ Float(totalBytesExpectedToWrite)\r\n        \r\n        print(String(format: \"%.2f\", progress * 100) + \"%\")\r\n        \r\n        DispatchQueue.main.async {\r\n            self.progressBar.setProgress(progress, animated: true)\r\n        }\r\n        \r\n    }\r\n    \r\n    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {\r\n        if error != nil {\r\n            print(\"download error: \\(error)\")\r\n        }\r\n        \r\n    }\r\n\r\n\r\n    \/\/MARK:Library folder\r\n    func getLibraryURL() -> NSURL {\r\n    \r\n        let libraryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0]\r\n    \r\n        return libraryURL as NSURL\r\n    }\r\n\r\n    func fileInLibraryDirectory(filename: String) -> String {\r\n        let folderName = \"media\"\r\n        createDirectory(foldername: folderName)\r\n        let fileURL = getLibraryURL().appendingPathComponent(\"\\(folderName)\/\\(filename)\")\r\n        return fileURL!.path\r\n    \r\n    }\r\n\r\n    \/\/MARK:Create Directory\r\n    func createDirectory(foldername : String){\r\n        let fileManager = FileManager.default\r\n        let paths = (NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(foldername)\r\n        if !fileManager.fileExists(atPath: paths){\r\n        try! fileManager.createDirectory(atPath: paths, withIntermediateDirectories: true, attributes: nil)\r\n        }else{\r\n            print(\"Already dictionary created.\")\r\n        }\r\n    }\r\n    \r\n}\r\n\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>How to download file<\/p>\n","protected":false},"author":1,"featured_media":88,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts\/1251"}],"collection":[{"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/comments?post=1251"}],"version-history":[{"count":1,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts\/1251\/revisions"}],"predecessor-version":[{"id":1252,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts\/1251\/revisions\/1252"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/media\/88"}],"wp:attachment":[{"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/media?parent=1251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/categories?post=1251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/tags?post=1251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}