TransWikia.com

WKWebviewのタイムアウト設定について

スタック・オーバーフロー Asked by momoyuri on December 7, 2021

WKWebviewのloadRequestで読み込んだwebページにタイムアウトの設定をしたいと思っております。

let configuration = WKWebViewConfiguration()
let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
let req = NSURLRequest(URL: "https://test.com/a.html", cachePolicy: .UseProtocolCachePolicy, timeoutInterval: 10.0)
print("loadRequest=(req.timeoutInterval)") // -> 10秒になっている
webView.loadRequest(req)

上記のように、loadRequestで読み込んだページについては、設定通り10秒程で didFailProvisionalNavigationDelegateが呼ばれます。

ただ、例えばhttps://test.com/a.htmlb.htmlへのリンクをタップした時に、decidePolicyForNavigationActionDelegateが呼ばれはするのですが、そこで下記のようにtimeoutIntervalを見てみると、上記で設定した値になっておりません。

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
    let request = navigationAction.request
    log("decidePolicyForNavigationAction (request.URL?.absoluteString)=(request.timeoutInterval)")
    // ↑ https://test.com/b.html=2147483647.0 と表示される
}

また、この場合にdidFailProvisionalNavigationDelegateは、前述の10秒程度ではなく、1分以上戻ってこない状態になってしまいます。(90〜120秒程で戻ってくる。)

UIWebViewの読み込みのタイムアウト値を変更する – Qiita

上記サイトを参考にdecidePolicyForNavigationActionDelegateを下記のようにしてみました。

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
    let request = navigationAction.request
    log("decidePolicyForNavigationAction (request.URL?.absoluteString)=(request.timeoutInterval)")
    // ↑ https://test.com/b.html=2147483647.0 と表示される
    if let url = request.URL?.absoluteString {
        if (request.timeoutInterval != 10) {
            let req = NSURLRequest(URL: url, cachePolicy: .UseProtocolCachePolicy, timeoutInterval: 10.0)
            print("decidePolicyForNavigationAction=(req.timeoutInterval)") // -> 10秒になっている
            webView.loadRequest(req)
            decisionHandler(.Cancel)
        }
    }
}

このようにすると、GETの処理ではうまくタイムアウト時間を設定出来たのですが、POSTの処理でパラメータが渡らずに意図した動きにはなりませんでした。

swift3 webview with post request – Stack Overflow

上記サイトのように、POSTの時にもパラメータを再設定し直して、loadRequestし直すと言うような、手間なことをしなければいけないのでしょうか?

もっとうまい方法をご存知の方がいらっしゃいましたら、ご教授頂けますと幸いでございます。

何卒、宜しくお願い致します。

One Answer

timeoutInterval など NSURLRequest のプロパティは webView.loadRequest() で使われるリクエストに対しての設定になるので、ロードした後のリンクなどの押下については同じ NSURLRequest は使われないため、毎回タイムアウトを設定するなら毎回 NSURLRequest を作り直す必要があると思われます。

Answered by zeero on December 7, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP