私が書いているアプリでは、サーバーから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)
の機能を表示するか、何か他に必要なことがありますか?
提案をいただければ幸いです。ありがとう!