diff --git a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift index 1fced293d6ac3239eb2df2ebf977b1dcc1e6dbcc..5be3f716372983cd204baf9bbe9701fbffd37544 100644 --- a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift @@ -48,7 +48,7 @@ class WebViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - + //webviewの生成 self.setWebView() @@ -80,12 +80,12 @@ class WebViewController: UIViewController { pinch.delegate = self self.view.addGestureRecognizer(pinch) } - + //書類表示時のピンチイン・アウト処理 @objc func pinchHandler(_ gesture: UIPinchGestureRecognizer) { //拡大・縮小比率 let pinchRatio = 0.2 - + // 拡大 if pinchLevel + pinchRatio <= gesture.scale { pinchLevel += pinchRatio @@ -316,7 +316,7 @@ class WebViewController: UIViewController { if let url = change![NSKeyValueChangeKey.newKey] as? URL { let urlString: String = url.absoluteString self.nowURL = urlString - + if urlString != loadURL { mainWebView.allowsBackForwardNavigationGestures = true } @@ -412,7 +412,7 @@ class WebViewController: UIViewController { if viewReload { //履歴をリセットする mainWebView.allowsBackForwardNavigationGestures = false - + if mainWebView.canGoBack { if mainWebView.backForwardList.backList.first!.url.absoluteString != self.loadURL { setWebView() @@ -463,11 +463,11 @@ extension WebViewController: WKUIDelegate { subWebView.navigationDelegate = self subViewStack.push(subWebView, superView: mainWebView) subWebView.load(navigationAction.request) - + //キャンセルボタンの表示 self.closeButton.title = getDisplayString(key: "Close", comment: "") self.closeButton.isEnabled = true - + return subWebView } return nil @@ -496,10 +496,14 @@ extension WebViewController: WKNavigationDelegate { } private func attachmentFileName(ofResponce navigationResponse: WKNavigationResponse) -> String? { - guard let response = navigationResponse.response as? HTTPURLResponse, - let contentDisposition = response.allHeaderFields["Content-Disposition"] as? String + guard let response = navigationResponse.response as? HTTPURLResponse + else { return nil } + return attachmentFileName(response) + } + + private func attachmentFileName(_ response: HTTPURLResponse) -> String? { + guard let contentDisposition = response.allHeaderFields["Content-Disposition"] as? String else { return nil } - print(response.allHeaderFields) if let (fileNameStar: fileNameStar, fileName: fileName) = getAttachmentFileName(contentDisposition: contentDisposition) { if let name = fileNameStar, let decoded = parseFilenameStar(name) { return decoded @@ -579,21 +583,62 @@ extension WebViewController: WKNavigationDelegate { private func download(url: URL, saveAs fileName: String) { var request = downloadRequest(url: url) - let tempPath: URL = FileManager.default.temporaryDirectory.appendingPathComponent(fileName) - Session.shared.dataTask(with: request) { data, _, err in + var tempPath: URL = FileManager.default.temporaryDirectory.appendingPathComponent(fileName) + Session.shared.dataTask(with: request) { data, res, err in guard let data = data, err == nil else { log.e(err) return } do { + let response = res as? HTTPURLResponse + var fileName: String? + if response != nil { + fileName = self.attachmentFileName(response!) + } + + if fileName != nil { + tempPath = FileManager.default.temporaryDirectory.appendingPathComponent(fileName!.removingPercentEncoding!) + } + try data.write(to: tempPath, options: .atomic) } catch { log.e(error) return } DispatchQueue.main.async {[self] in - self.subWebView.loadFileURL(tempPath, allowingReadAccessTo: tempPath) + let activityViewController = UIActivityViewController(activityItems: [tempPath], applicationActivities: nil) + activityViewController.completionWithItemsHandler = { (activityType: UIActivity.ActivityType?, completed: Bool, returnedItems: [Any]?, activityError: Error?) in + self.closeTapped() + + guard completed else { + return + } + var url = URL(string: "") + //ActivityTypeで動作を分ける場合は以下に追加 + switch activityType { + case UIActivity.ActivityType.saveToCameraRoll: + url = URL(string: "photos-redirect://") + case UIActivity.ActivityType(rawValue: "com.apple.CloudDocsUI.AddToiCloudDrive"): + url = URL(string: "shareddocuments://") + case UIActivity.ActivityType(rawValue: "com.apple.DocumentManagerUICore.SaveToFiles"): + url = URL(string: "shareddocuments://") + default: + break + } + + //該当するアプリを開く + if url != nil { + UIApplication.shared.open(url!) + } + + do { + try FileManager.default.removeItem(at: tempPath) + } catch { + log.e(error) + } + } + self.present(activityViewController, animated: true, completion: nil) } }.resume() }