web-dev-qa-db-ja.com

WKWebViewがバックグラウンドでJavaScriptを実行しない

WebViewをバックグラウンドに移動すると(別のビューコントローラーが上に表示される)、JavaScript関数の実行が停止し、フォアグラウンドに戻ったときにのみ実行されることに気付きました。
ここ 同様の問題のあるスレッドですが、ほとんどの解決策は、Webビューをキーウィンドウに追加したり、ダミーの呼び出しをループして評価JavaScriptをループしたりして、Webビューがtアイドルモードに移行し、JavaScriptを停止します。
これらのソリューションはうまくいきますが、私はそれらがまったく好きではありません。
この問題のより良い解決策、アイドルモードに入らないようにwebViewを構成する方法、またはJavaScriptを優先するよりエレガントな方法があるかどうか疑問に思いました。
ありがとうございます。

18
ItayAmza

残念ながら、WKWebViewを使用するには、ビュー階層に含まれている必要があります。オンスクリーンビューコントローラのサブビューとして追加しておく必要があります。

これを画面外に追加して、表示されないようにすることができます。非表示の属性も機能した可能性があります。どちらの方法でも、addSubviewを呼び出して機能させる必要があります。

ここに他のいくつかの 質問と回答があります これを確認します

だから、私はこれを見つけた少しを調査しました

WKWebViewConfiguration* webViewConfig = // set up config

// provide empty frame rect
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero 
configuration:webViewConfig];

// add to keyWindow to ensure it is 'active'
[UIApplication.sharedApplication.keyWindow addSubview:webView];

このアプローチにより、少なくともアプリがアクティブで、UIに影響を与えないときにJavaScriptが実行されることが保証されます。後で表示する必要がある場合は、レンダリング後にキーウィンドウからwebViewを削除し、フレームをリセットできます。

お役に立てれば!

[〜#〜]編集[〜#〜]

Javascriptはデフォルトで無効になっています。Javascriptを実行するには、 WKPreferences で有効にする必要があります。設定オブジェクトのjavascriptEnabledフィールドをtrueに設定する必要があります。

具体的には、WKWebViewを初期化するコードは次のようになります。

let contentController = WKUserContentController()
contentController.add(self, name: "handler") 

let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
configuration.preferences = WKPreferences()
configuration.preferences.javaScriptEnabled = true

webview = WKWebView(frame: self.view.frame, configuration: configuration)
webview.uiDelegate = self
webview.navigationDelegate = self
self.view = self.webview

また、この post をチェックして、別のアプローチを確認できます。

3