web-dev-qa-db-ja.com

「Chrome」(または同等のもの)をプロセスではなくスレッドとして開始する方法は?

Qt/C++で書かれたアプリがあります。そのGUIはHtml/Css/JSにあります。

アプリはChrome&Edgeで正常に動作します。デスクトップでは、アプリは別のプロセスとしてOSブラウザーを呼び出します。ブラウザーはWebsocketを介してアプリに接続し、表示目的でメッセージを交換します。これはうまくいきます。

ただし、これは携帯電話では機能しません。別のプロセスとしてブラウザーを呼び出すため、Android&iOSでは実際のアプリがバックグラウンドに送信されます。
SOに関する多くの回答は、組み込みのモバイルWebViewを使用することを提案しています。しかし、Androidすべてのデバイスのすべての要件を満たし、iOS Webviewは単に標準以下で弱くなっています。

質問:クロムのようなブラウザをアプリ自体のスレッドとして起動する方法はありますか?

その目的は、Webviewの制限に妥協することなく、アプリをフォアグラウンドで維持することです。必要に応じて、ソースコードの統合とコンパイルで問題ありません。

9
iammilind

Webエンジンは、ブラウザーの実行方法の原動力です。 chromeはchrome Webエンジンに基づいているため、それに応じてエンジンを変更する必要があります。

Chromeは各タブのプロセスを使用しますが、Firefoxは代わりにスレッドを使用します。

Chromeアーキテクチャには2つの主要なプロセスブラウザプロセスおよびレンダラープロセスがあります。ブラウザUIはブラウザプロセスで実行されており、Chromeブラウザで新しいタブを開くと、タブごとにRenderer Processと呼ばれる新しいプロセスが作成されます。レンダラープロセスハンドルHTMLコンテンツのレンダリング。

chrome=で10個のタブを開いたとすると、10個のレンダラープロセスと1個のブラウザープロセスが作成されます。

タブごとにレンダラープロセスを分離する理由

何らかの理由でいくつかのタブがクラッシュしたためにインターネットを閲覧しているときはいつでも、そのレンダラープロセスのみが強制終了され、他のプロセスはまだ生きていると仮定します。 9つのタブはまだ反応し、機能しています。ブラウザUIが別のプロセスで実行されているため。ブラウザのUIは一般的にハングすることはなく、十分な応答性があります。各レンダラーは異なるプロセスとして実行されているため、タブ間のデータセキュリティを提供する共有データアクセスは困難です(スレッドは共有データにアクセスできます)。他にも多くのプロセスが実行されており、独自の目的があります。

1
Nikhil Ghule

Chrome Custom Tabs をご覧ください。このアプローチは、WebViewとChromeで外部でリンクを開くことの間にあります。

私が知る限り、すべてはブラウザのプロセスで発生しますが、特別なサービスを介してウォームアップできます。 mayLaunchUrl を使用してコンテンツを事前レンダリングすることもできます。

0
Mister Smith