小编Oli*_* M.的帖子

强制Android WebView脱机

我们希望使用股票Android WebView作为沙箱来执行本地HTML/JS应用程序.主要的安全性要求是将WebView设置为完全脱机,并且只允许调用某些javascript接口.使用WebView.addJavascriptInterface()方法将这些接口传递到javascript运行时.

Android应用程序本身具有访问网络的权限(android.permission.INTERNET).

我能够禁用正常的http/https请求,但完全无法阻止WebSocket请求.看起来这些处理与普通的http请求不同.

一种替代方法是覆盖WebSocket JavaScript方法.但是这让我感觉不好,因为它违背了沙箱的概念.似乎也可以使用delete来恢复原始函数指针.

另一种方法是将自己的自定义WebView(例如Crosswalk-Project)与我们的应用程序捆绑在一起,但是想要避免它,因为编译和更新是相当费力的.

我尝试了以下公共WebView接口,但它们似乎都没有阻止WebSocket调用:

  • webSettings.setBlockNetworkLoads(真);
  • webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
  • webView.setNetworkAvailable(假);
  • WebViewClient.shouldOverrideUrlLoading()(回调)
  • WebViewClient.shouldInterceptRequest()(回调,试过两个版本)
  • WebChromeClient.onPermissionRequest()

在Android 4.4.4(19)和Android 5/5.1(21/22)上测试过.

我正在执行的javascript:

ws = new WebSocket("wss://echo.websocket.org");

ws.onmessage = function(event) {
  console.log("received: " + event.data);
};

ws.onclose = function() {
  console.log("External Socket closed");
};

ws.onopen = function() {
  console.log("Connected to external ws");
  ws.send("Hello from " + navigator.userAgent);
};
Run Code Online (Sandbox Code Playgroud)

有什么想法可以做到这一点?

非常感谢

javascript android offline webview

5
推荐指数
1
解决办法
836
查看次数

标签 统计

android ×1

javascript ×1

offline ×1

webview ×1