在Android和iOS中加载并执行脚本

我的需求:

  • 这应该在Android和iOS中工作
  • 我想从文件中加载脚本(可以是Javascript或Lua或任何其他脚本语言),而不一定是网络上的
  • 脚本应该在后台线程中运行,并能够发布到UI线程
  • 我想在iOS和Android中使用相同的脚本,以便可以在Android和iOS应用程序中重用脚本代码

我的选择是什么?

点赞
用户4428159
用户4428159

WebView Android with Javascript Enabled

我认为iOS中的SFWebView也支持Javascript。

不确定是否可以在后台线程中使用它,因为Android WebView只能在UI线程上运行。

2017-08-23 10:58:06
用户6168433
用户6168433
  1. 您必须将 HTML 加载到字符串中:
private String readHtml(String remoteUrl) {
String out = "";
BufferedReader in = null;
try {
    URL url = new URL(remoteUrl);
    in = new BufferedReader(new InputStreamReader(url.openStream()));
    String str;
    while ((str = in.readLine()) != null) {
        out += str;
    }
} catch (MalformedURLException e) {
} catch (IOException e) {
} finally {
    if (in != null) {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
return out;
}
  1. 使用基本 URL 加载 WebView:
String html = readHtml("Your Web URL");
mWebView.loadDataWithBaseURL("file:///android_asset/", html, "text/html", "utf-8", "");

在这种特定情况下,您应该将您要在页面上使用的所有 .js 文件都放在项目的“assets”文件夹下。例如:

 /MyProject/assets/jquery.min.js
  1. 在您的远程 HTML 页面中,您必须加载 .js 和 .css 文件,它们位于您的应用程序中,例如:

同样适用于所有其他本地资源,例如图像等,它们的路径必须以

file:///android_asset/

开头。WebView 首先加载您提供的原始 HTML,然后挑选 .js、.css 和其他本地资源,最后会加载远程内容。

2017-08-23 11:05:42
用户7867325
用户7867325

在android中,当在webview中加载页面时,拦截脚本调用。

public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
   if ( url.endsWith("script.js") ) {
      AssetFileDescriptor fileDescriptor = assetManager.openFd("script.js");
      FileInputStream stream = fileDescriptor.createInputStream();
      return new WebResourceResponse("text/javascript","UTF-8",stream);
   }
}

WebView运行在UI线程上。我不确定是否有办法从后台线程加载Web资源。

2017-08-23 11:16:54