

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

[code]

    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)
    
[/code]

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

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

[code]

    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 と表示される
    }
    
[/code]

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

[UIWebViewの読み込みのタイムアウト値を変更する -
Qiita](http://qiita.com/laiso/items/00e9241c3b329b4d9cdc)

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

[code]

    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)
            }
        }
    }
    
[/code]

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

[swift3 webview with post request - Stack
Overflow](https://stackoverflow.com/questions/41409180/swift3-webview-with-
post-request)

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

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

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


CC BY-SA 4.0
2017-06-19T13:38:50.997
35719
2023-07-30T02:02:55.353
2020-07-23T08:19:51.980
3060
8755
question
swift ios webview
WKWebviewのタイムアウト設定について


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


CC BY-SA 4.0
2020-05-24T03:05:32.423
66935
2020-05-24T03:05:32.423
39936
35719
answer