Descargar, guardar y ver PDF en Swift

Buenas tardes, les presento una traducci贸n de un art铆culo sobre el trabajo de PDF en Swift.
Cualquier persona interesada, bienvenido a cat.

Estoy trabajando en una aplicaci贸n que deber铆a poder descargar archivos PDF, guardarlos y abrirlos. Para esta tarea, debe realizar 3 pasos:

  • Downloadtask
  • Gesti贸n de archivos
  • Pdfview

Paso 1. DownloadTask

Para descargar un archivo a trav茅s de una URL, debe usar downloadTask. Tambi茅n es necesario rastrear d贸nde se han movido nuestros archivos, por lo que el observador, que en mi caso es ViewController , debe admitir URLSessionDownloadDelegate .

import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func downloadButtonPressed(_ sender: Any) { guard let url = URL(string: "https://www.tutorialspoint.com/swift/swift_tutorial.pdf") else { return } let urlSession = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue()) let downloadTask = urlSession.downloadTask(with: url) downloadTask.resume() } } extension ViewController: URLSessionDownloadDelegate { func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { print("downloadLocation:", location) } } 

Para comprender d贸nde se guard贸 el archivo, simplemente imprima el resultado de la variable de ubicaci贸n en la consola Xcode.

Despu茅s de hacer clic en el bot贸n "Descargar", el archivo se descarg贸 en menos de un segundo y luego fue eliminado por el sistema. Este comportamiento se repite tanto en el simulador como en el dispositivo real.

imagen

Paso 2. Administraci贸n de archivos

Cada aplicaci贸n en iOS tiene su propio entorno de prueba. En su interior hay 3 componentes que todo desarrollador de iOS debe conocer: Bundle Container, Data Container e iCloud Container. En este art铆culo, consideraremos solo el Contenedor de datos con m谩s detalle, ya que lo necesitaremos para nuestra tarea: descargar un archivo PDF.

imagen

Usando el contenedor de datos, podemos administrar archivos guardados desde Internet. A continuaci贸n enumerar茅 las propiedades importantes:

  • Los archivos dentro de la biblioteca , as铆 como los archivos tmp se eliminar谩n autom谩ticamente
  • iTunes realiza una copia de seguridad de todos los archivos excepto Caches, tmp y archivos designados como .isExcludedFromBackup = true . Durante la revisi贸n de la aplicaci贸n, si Apple encuentra en iTines archivos guardados que no deber铆an estar all铆, lo m谩s probable es que la aplicaci贸n sea rechazada.
  • Los archivos guardados deben almacenarse en Documentos .

De ello se deduce que nuestro siguiente paso es guardar el archivo de tmp a Documentos. Esto es lo que hice:

  1. Copi茅 el nombre del archivo pdf
  2. URL creada en documentos
  3. Se elimin贸 un archivo con el mismo nombre para evitar un error de copia: "CFNetworkDownload_mdrFNb.tmp" no se pudo copiar a "Documentos" porque ya existe un elemento con el mismo nombre.
  4. Copi茅 el archivo a Documentos.

 extension ViewController: URLSessionDownloadDelegate { func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { print("downloadLocation:", location) // create destination URL with the original pdf name guard let url = downloadTask.originalRequest?.url else { return } let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let destinationURL = documentsPath.appendingPathComponent(url.lastPathComponent) // delete original copy try? FileManager.default.removeItem(at: destinationURL) // copy from temp to Document do { try FileManager.default.copyItem(at: location, to: destinationURL) self.pdfURL = destinationURL } catch let error { print("Copy Error: \(error.localizedDescription)") } } } 

imagen

Paso 3. PDFView

Entonces, movimos el archivo PDF, y ahora el usuario tiene acceso a 茅l. Ahora veamos c贸mo abrirlo con el PDFView integrado en PDFKit, el pr谩ctico marco de trabajo de Apple disponible con iOS 11.

Aunque muchos tutoriales PDFKit usan el gui贸n gr谩fico para crear un PDFView utilizando la propiedad UIView, esto no se puede hacer a trav茅s de Xibs . Por lo tanto, lo crear茅 a trav茅s del c贸digo.

 @IBAction func openPDFButtonPressed(_ sender: Any) { let pdfViewController = PDFViewController() pdfViewController.pdfURL = self.pdfURL present(pdfViewController, animated: false, completion: nil) } 

 import UIKit import PDFKit class PDFViewController: UIViewController { var pdfView = PDFView() var pdfURL: URL! override func viewDidLoad() { super.viewDidLoad() view.addSubview(pdfView) if let document = PDFDocument(url: pdfURL) { pdfView.document = document } DispatchQueue.main.asyncAfter(deadline: .now()+3) { self.dismiss(animated: true, completion: nil) } } override func viewDidLayoutSubviews() { pdfView.frame = view.frame } } 

imagen

Voila! Extrajimos y abrimos el archivo PDF. S茅 que el formato del libro es un poco diferente, por lo que veremos PDFKit con m谩s detalle en el pr贸ximo art铆culo .

Source: https://habr.com/ru/post/es430860/


All Articles