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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

2回答

4101閲覧

WKWebview で input type="file"でファイル選択後にリロード処理が走ってしまう

momoyuri

総合スコア35

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2020/06/12 04:01

現在、WKWebviewを使ってwebviewアプリを開発しております。
そこで、表題のようにinput type="file"でファイルを選択した後に、なぜかリロード処理が走ってしまい困ってしまっております。
今まで、このような事に遭遇した事がなかったので、解決方法をご存知の方がいらっしゃいましたら、ご教授頂けませんでしょうか。

同じような事象がこちらで議論されているようだったのですが、解決もされていないようで。。

HTMLは、下記のような単純なページで再現されております。

<!DOCTYPE html> <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta charset="UTF-8"> <title>Document</title> </head> <body> <hr> <p><input type="text" /></p> <p><input type="file" /></p> </body> </html>

swift側は下記のコードです。

import UIKit import WebKit class RootViewController: UIViewController { // MARK: - Class variables lazy var webView: WKWebView = WKWebView() // MARK: - IBOutlet references @IBOutlet weak var contentView: UIView! // MARK: - LifeCycle override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. setupWebView() } override func viewDidAppear(_ animated: Bool) { loadRequest(withUrl: "https://example.id/") } func loadRequest(withUrl urlString: String) { if let urlLogin = URL(string: urlString) { var urlRequest = URLRequest(url: urlLogin) webView.load(urlRequest) } } // MARK: - setupWebView func setupWebView() { let configuration = WKWebViewConfiguration() configuration.processPool = WKProcessPool() configuration.websiteDataStore = WKWebsiteDataStore.default() configuration.preferences.javaScriptEnabled = true webView = WKWebView(frame: CGRect.zero, configuration: configuration) webView.scrollView.showsVerticalScrollIndicator = false webView.scrollView.showsHorizontalScrollIndicator = false webView.uiDelegate = self webView.navigationDelegate = self webView.scrollView.contentInsetAdjustmentBehavior = .never webView.scrollView.bounces = false contentView.addSubview(webView) // webViewの制約設定時、AutoresizingMaskによって自動生成される制約と競合するため、自動生成をやめる webView.translatesAutoresizingMaskIntoConstraints = false // webViewの制約 NSLayoutConstraint.activate([webView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), webView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), webView.topAnchor.constraint(equalTo: self.view.topAnchor), webView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)]) } } extension RootViewController: WKUIDelegate, WKNavigationDelegate { func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { print("didFinish:(webView.url?.absoluteString)") } func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { print("decidePolicyFor=(webView.url?.absoluteString)") print("navigationType=(navigationAction.navigationType.rawValue)) // if navigationAction.navigationType == .other { // decisionHandler(.cancel) // return // } decisionHandler(.allow) } }

ファイル選択後に、なぜか下記のように decidePolicyFor navigationAction: WKNavigationAction が動いてしまって、リロードが走っているようなのです。
その時のprintの結果が下記になります。

decidePolicyFor=Optional("https://example.com") navigationType=-1 didFinish:Optional("https://example.com")

開発環境

xcode: 11.5
swift: 5

何卒、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

momoyuri さん

当課題について解決済みでしょうか?
同じ現象が発生しており、解決策があればご教示いただきたいのですが
いかがでしょうか?

投稿2023/07/11 02:29

funefuneyaaa

総合スコア2

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

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

0

Apple Developer Documentation から引用:

webView(_:decidePolicyFor:decisionHandler:)

Decides whether to allow or cancel a navigation.

webView(_:decidePolicyFor:decisionHandler:)は何らかの許可が必要なナビーゲーションをサイトが実行した時に呼び出されるメソッドのはずなので、呼ばれるのはおかしくないと思います。

投稿2020/06/21 05:12

編集2020/06/21 05:14
shuntar30

総合スコア80

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

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

momoyuri

2020/06/22 00:06

ご回答ありがとうございます。なるほどですね。 `webView(_:decidePolicyFor:decisionHandler:)` が動くのは良しとして、ファイル選択をした時にリロードが走ってしまう原因はおわかりになりますでしょうか・・・?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問