Я пытался открыть файл в своем приложении, используя Swift. Это файл PDF, который я скачал из Интернета через URL. Часть загрузки работала хорошо для меня, но я не могу найти способ открыть этот же файл PDF через его локальное расположение в моем приложении, не загружая его снова. Я знаю, что могу просто открыть его в веб-представлении сразу после загрузки, но я планирую сделать так, чтобы файл мог быть доступен без Интернета; следовательно, почему я сохранил расположение файла в UserDefaults.
Я читал в Интернете везде и тоже искал видео на YouTube, но, похоже, не могу найти способ сделать это. Также, пожалуйста, исправьте меня, если я не должен использовать UserDefaults или если это нормально, потому что я не хочу получать доступ к каким-либо серверам вообще, и это казалось идеальным способом сделать это.
Код, который я использовал до сих пор:
import UIKit
import WebKit
class ViewController: UIViewController, URLSessionDownloadDelegate, UIDocumentInteractionControllerDelegate {
var downloadTask: URLSessionDownloadTask!
var backgroundSession: URLSession!
let name = "Accounting"
@IBAction func startDownload(_ sender: AnyObject) {
let url = URL(string: "https://pastpapers.papacambridge.com/Cambridge%20International%20Examinations%20(CIE)/AS%20and%20A%20Level/Accounting%20(9706)/2005%20Nov/9706_w05_qp_4.pdf")!
downloadTask = backgroundSession.downloadTask(with: url)
downloadTask.resume()
}
@IBAction func pause(_ sender: AnyObject) {
if downloadTask != nil{
downloadTask.suspend()
}
}
@IBAction func resume(_ sender: AnyObject) {
if downloadTask != nil{
downloadTask.resume()
}
}
@IBAction func cancel(_ sender: AnyObject) {
if downloadTask != nil{
downloadTask.cancel()
}
}
@IBOutlet var progressView: UIProgressView!
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "backgroundSession")
backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)
progressView.setProgress(0.0, animated: false)
}
override func viewWillAppear(_ animated: Bool) {
if let file = UserDefaults.standard.object(forKey: "Biology") {
print(file) //prints the file location where UserDefaults stores it in
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func showFileWithPath(path: String){
let isFileFound:Bool? = FileManager.default.fileExists(atPath: path)
if isFileFound == true{
UserDefaults.standard.set(path, forKey: "Biology")
let viewer = UIDocumentInteractionController(url: URL(fileURLWithPath: path))
viewer.delegate = self
viewer.presentPreview(animated: true)
}
}
//URLSessionDownloadDelegate
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didFinishDownloadingTo location: URL){
let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
let documentDirectoryPath:String = path[0]
let fileManager = FileManager()
let destinationURLForFile = URL(fileURLWithPath: documentDirectoryPath.appendingFormat("/\(name).pdf"))
if fileManager.fileExists(atPath: destinationURLForFile.path){
showFileWithPath(path: destinationURLForFile.path)
}
else{
do {
try fileManager.moveItem(at: location, to: destinationURLForFile)
// show file
showFileWithPath(path: destinationURLForFile.path)
}catch{
print("An error occurred while moving file to destination url")
}
}
}
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64,
totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64){
progressView.setProgress(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite), animated: true)
}
//URLSessionTaskDelegate
func urlSession(_ session: URLSession,
task: URLSessionTask,
didCompleteWithError error: Error?){
downloadTask = nil
progressView.setProgress(0.0, animated: true)
if (error != nil) {
print(error!.localizedDescription)
}else{
print("The task finished transferring data successfully")
}
}
//UIDocumentInteractionControllerDelegate
func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController
{
return self
}
}