рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдкреАрдбреАрдПрдл рджреЗрдЦреЗрдВ

рд╢реБрдн рджреЛрдкрд╣рд░, рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдкреАрдбреАрдПрдл рдХреЗ рдХрд╛рдо рдкрд░ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рдХрд┐рд╕реА рдХреЛ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдореИрдВ рдПрдХ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ, рдЙрдиреНрд╣реЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рдЦреЛрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 3 рдЪрд░рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:

  • DownloadTask
  • рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдмрдВрдзрди
  • PDFView

рдЪрд░рдг 1. рдбрд╛рдЙрдирд▓реЛрдбрдЯреИрд╕реНрдХ

рдХрд┐рд╕реА URL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбрд╛рдЙрдирд▓реЛрдбрдЯреИрд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдлрд╛рдЗрд▓реЗрдВ рдХрд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реБрдИ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ, рдЬреЛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ ViewController рд╣реИ , 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) } } 

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд╣рд╛рдБ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рдмрд╕ Xcode рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕реНрдерд╛рди рдЪрд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред

"рдбрд╛рдЙрдирд▓реЛрдб" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлрд╝рд╛рдЗрд▓ рдПрдХ рд╕реЗрдХрдВрдб рд╕реЗ рднреА рдХрдо рд╕рдордп рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рдЧрдИ рдФрд░ рдлрд┐рд░ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдорд╛рд░ рджреА рдЧрдИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбрд┐рд╡рд╛рдЗрд╕ рджреЛрдиреЛрдВ рдкрд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЫрд╡рд┐

рдЪрд░рдг 2. рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдмрдВрдзрди

IOS рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЕрдкрдирд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрдВрджрд░ 3 рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рд╣рд░ iOS рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдмрдВрдбрд▓ рдХрдВрдЯреЗрдирд░, рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░ рдФрд░ рдЖрдИрдХреНрд▓рд╛рдЙрдб рдХрдВрдЯреЗрдирд░ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдПрдХ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ред

рдЫрд╡рд┐

рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рд╕рд╣реЗрдЬреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдореИрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдгреЛрдВ рдХреА рд╕реВрдЪреА рджреВрдВрдЧрд╛:

  • рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдВрджрд░ рдХреА рдлрд╛рдЗрд▓реЗрдВ, рд╕рд╛рде рд╣реА tmp рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрдиреЗ рдЖрдк рдбрд┐рд▓реАрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреА
  • рдЖрдЗрдЯреНрдпреВрдиреНрд╕ рдХреИрд╢, tmp, рдФрд░ .isExcludedFromBackup = true рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрддрд╛ рд╣реИ ред рдРрдк рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рджреМрд░рд╛рди, рдпрджрд┐ Apple iTines рдореЗрдВ рдкрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрдЪрд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рд╕рд╣реЗрдЬреЗ рдЧрдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдирд┐рдореНрди рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЕрдЧрд▓рд╛ рдХрджрдо рдлрд╝рд╛рдЗрд▓ рдХреЛ tmp рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рд╣реИред рдпрд╣рд╛рдБ рдореИрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ:

  1. рдореИрдВрдиреЗ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдХреЙрдкреА рдХрд┐рдпрд╛
  2. рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ url рдмрдирд╛рдпрд╛ рдЧрдпрд╛
  3. рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рддреНрд░реБрдЯрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдирд╛рдо рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛: "CFNetworkDownload_mdrFNb.tmp" рдХреЛ "рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ" рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╣реА рдирд╛рдо рд╡рд╛рд▓рд╛ рдЖрдЗрдЯрдо рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред
  4. рдлрд╝рд╛рдЗрд▓ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ред

 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)") } } } 

рдЫрд╡рд┐

рдЪрд░рдг 3. PDFView

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреА рдкрд╣реБрдВрдЪ рд╣реИред рдЪрд▓рд┐рдП рдЕрдм рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ PDFKit рдореЗрдВ рдирд┐рд░реНрдорд┐рдд PDFView рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдЦреЛрд▓реЗрдВ, iOS 11 рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз Apple рдХрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдврд╛рдВрдЪрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдИ PDFKit рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ UIVIV рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PDFView рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╣ Xibs рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдКрдВрдЧрд╛ред

 @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 } } 

рдЫрд╡рд┐

рджреЗрдЦрд╛! рд╣рдордиреЗ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдирд┐рдХрд╛рд▓реА рдФрд░ рдЦреЛрд▓реАред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреАрдбреАрдПрдлрдХрд┐рдЯ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ ред

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


All Articles