バージョン情報
swift 5.0
Xcode 12.3
質問
ダウンロードボタン押下後にSafariと同様に確認ダイアログ(ダウンロード or 表示)を表示させたいのですが、
JSFベースのリッチUIコンポーネント「PrimeFaces」のダウンロードをWKWebViewで表示した場合
確認ダイアログが表示されず、画像がそのまま表示されます。
※画面キャプチャはPrimeFacesのサンプルページです。
https://www.primefaces.org/showcase/ui/file/download.xhtml
WKWebViewで確認ダイアログを表示して端末に保存する方法がわからず困っています。
確認した事
PrimeFacesのダウンロードボタン押下後の挙動を比較
■PCブラウザ
Safari:確認ダイアログが表示される。
Chrome:確認ダイアログが表示される。
■スマホブラウザ
Safari:確認ダイアログが表示される。
Chrome:確認ダイアログが表示されず、画像が表示される。(※WKWebViewと同様の動きをします。)
画像ファイルのURL取得について
Swift
1func webView(_ webView: WKWebView, 2 decidePolicyFor navigationAction: WKNavigationAction, 3 decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
WKNavigationDelegateのDelegate関数で取得したURLで画像ファイルのパスが取得出来れば良いのですが
"https://www.primefaces.org/showcase/ui/file/download.xhtml"
が表示されます。
targetUrlをJavaScriptのダウンロードサンプルページにした場合には、画像のファイルパスが取得出来ます。
JavaScript サンプル: ファイルのダウンロード
ソースファイル
Swift
1import UIKit 2import WebKit 3 4class ViewController: UIViewController, WKNavigationDelegate { 5// let targetUrl = "https://knooto.info/example/javascript/file-download.html" 6 let targetUrl = "https://www.primefaces.org/showcase/ui/file/download.xhtml" 7 var webView: WKWebView! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view, typically from a nib. 12 webView = WKWebView(frame: CGRect.zero) 13 webView.frame = view.frame 14 webView.navigationDelegate = self 15 16 let urlRequest = URLRequest(url:URL(string:targetUrl)!) 17 webView.load(urlRequest) 18 view.addSubview(webView) 19 } 20 21 override func didReceiveMemoryWarning() { 22 super.didReceiveMemoryWarning() 23 // Dispose of any resources that can be recreated. 24 } 25 26 // MARK: - WKNavigationDelegate(画面の読み込み、画面遷移系) 27 // 読み込み設定(リクエスト前) 28 func webView(_ webView: WKWebView, 29 decidePolicyFor navigationAction: WKNavigationAction, 30 decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 31 let navigationURL = navigationAction.request.url?.absoluteURL 32 print("取得URL" , navigationURL ?? "URL取得出来ない。") 33 decisionHandler(.allow) 34 } 35 36 // 読み込み設定(レスポンス取得後) 37 func webView(_ webView: WKWebView, 38 decidePolicyFor navigationResponse: WKNavigationResponse, 39 decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { 40 print("レスポンス取得後") 41 decisionHandler(.allow) 42 } 43} 44
何らかの方法で画像ファイルを端末にダウンロード出来れば良いのですが
何か情報があれば、よろしくお願い致します。
あなたの回答
tips
プレビュー