スタック・オーバーフロー 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秒程で didFailProvisionalNavigation
Delegateが呼ばれます。
ただ、例えばhttps://test.com/a.html
にb.html
へのリンクをタップした時に、decidePolicyForNavigationAction
Delegateが呼ばれはするのですが、そこで下記のように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 と表示される
}
また、この場合にdidFailProvisionalNavigation
Delegateは、前述の10秒程度ではなく、1分以上戻ってこない状態になってしまいます。(90〜120秒程で戻ってくる。)
UIWebViewの読み込みのタイムアウト値を変更する – Qiita
上記サイトを参考にdecidePolicyForNavigationAction
Delegateを下記のようにしてみました。
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し直すと言うような、手間なことをしなければいけないのでしょうか?
もっとうまい方法をご存知の方がいらっしゃいましたら、ご教授頂けますと幸いでございます。
何卒、宜しくお願い致します。
timeoutInterval など NSURLRequest のプロパティは webView.loadRequest() で使われるリクエストに対しての設定になるので、ロードした後のリンクなどの押下については同じ NSURLRequest は使われないため、毎回タイムアウトを設定するなら毎回 NSURLRequest を作り直す必要があると思われます。
Answered by zeero on December 7, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP