2016-12-14 9 views
1

私が書いているアプリでは、サーバーからPDFをダウンロードしてUIWebViewに表示する必要があります。この目的のために、エンドポイントからPDFを取得するためのコードをいくつか用意しています(これはURLではなく、デスクトップコンピュータではブラウザのように保存するためのダイアログを開きます)、グラブPDFGrabberと呼ばれるクラスのデータ:PDFが要求されたときにSwift 3.0:URLSessionDownloadDelegateを使用してダウンロードを完了したら、別のView ControllerでPDFを開く方法

func getPDF(completionHandler:@escaping (URL) -> Void) 
{ 
    let theURL:String = "https://mywebsite.com/Endpoint" 
    let fileURL:URL = URL(string: theURL)! 
    var request = URLRequest(url: fileURL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) 
    let session = URLSession.shared 

    let task = session.dataTask(with: request, completionHandler: {data, response, error -> Void in 

    var documentURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last 
    documentURL = documentURL?.appendingPathComponent("MyDocument.pdf") 

    do 
    { 
     try data?.write(to: documentURL!, options: .atomic) 
     completionHandler(documentURL!) 
     } 
     catch 
     { 
      print(error) 
     } 
    }) 

    task.resume() 
} 

次に、(のはPDFTableViewそれを呼びましょうPDFファイルを示すテーブルビューコントローラでは、私はセルをタップして(PDFGrabberからdocumentURLを使用することができます表):最後に

PDFGrabber.getPDF(){fileURL ->() in 
    DispatchQueue.main.async 
    { 
     if let resultController = self.storyboard!.instantiateViewController(withIdentifier: "PDFViewer") as? PDFViewer 
     { 
      resultController.thePDFPath = stringURL 
      self.present(resultController, animated: true, completion: nil) 
     } 
    } 

、私はPDFViewer Vの文字列として「WebViewの」属性「thePDFPath」と呼ばれるのUIWebViewで別のビューコントローラを持っていますコントローラを見る。 viewDidLoad()メソッドでは、次のように言うことができます。

override func viewDidLoad() 
{ 
    let pathToPDF:URL = URL(string: thePDFPath)! 
    WebView.loadRequest(URLRequest(url: pathToPDF)) 
} 

これは、WebビューにPDFを読み込みます。ただし、読み込み時間は少し遅くなる可能性があります。プログレスバーと文字列を使用して、ユーザーのデバイスに読み込まれたPDFの量を計算できるようにしたいと考えています。他の質問から、私は自分のPDFGrabberクラスがURLSessionDownloadDelegateを拡張し、その関数を実装する必要があるよりも集まります。私は単純に行くことができますので、ダウンロードされたバイトの量は、簡単です取得するには:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) 
{ 
    percentDownloaded = (Float(writ)/Float(exp)) * 100 
    print("Progress: " + String(describing: percentDownloaded)) 
} 

しかし、私はまた、唯一のPDF後PDFViewを開くことができるようにしたいのですが、完全とその進捗状況を表示した後にダウンロードされます%(これを行うオーバーレイビューがあります)。以前は、完成ハンドラを使用してPDFがダウンロードされるまで待ってから開くことができました。

ただし、この方法でダウンロードしたバイト数にアクセスすることはできません。

urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) 

の機能を表示するか、何か他に必要なことがありますか?

提案をいただければ幸いです。ありがとう!

答えて

0

輸入のWebKitここ

あなたはあなたのアプリケーションで、あなたのPDFファイルを読み込むことができます

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     if let pdfURL = Bundle.main.url(forResource: "food-and-drink-menu-trafalgar-tavern", withExtension: "pdf", subdirectory: nil, localization: nil) { 
      do { 
       let data = try Data(contentsOf: pdfURL) 
       let webView = WKWebView(frame: CGRect(x:0,y:NavigationView.frame.size.height,width:view.frame.size.width, height:view.frame.size.height-NavigationView.frame.size.height)) 
       webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent()) 
       view.addSubview(webView) 

      } 
      catch { 
       // catch errors here 
      } 

     } 
} 
関連する問題