質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

PrimeFaces

PrimeFacesは、トルコのソフトウェア会社Prime Teknolojiが提供する、 JSFリッチユーザーインターフェースコンポーネントです。 Apache License V2ライセンスのオープンソースソフトウェアです。

Q&A

0回答

882閲覧

「PrimeFaces」のダウンロードをWKWebViewで実現させたい。

yamasa

総合スコア23

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

PrimeFaces

PrimeFacesは、トルコのソフトウェア会社Prime Teknolojiが提供する、 JSFリッチユーザーインターフェースコンポーネントです。 Apache License V2ライセンスのオープンソースソフトウェアです。

0グッド

0クリップ

投稿2021/01/04 01:20

バージョン情報
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

何らかの方法で画像ファイルを端末にダウンロード出来れば良いのですが
何か情報があれば、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問