我有一个使用History API的Cordova / PhoneGap应用程序。它使用History API作为Web和Cordova应用程序之间的共享代码。移动webKit看起来像支持History API(但实际上支持是错误的)。
所以在某些地方客户端js-code生成document.location.reload,当前url可以是ANY(与初始url不同)。在Cordova应用程序中,这导致“应用程序错误:网络错误(文件:///显示/ ...)”。那是因为之前有history.pushState(“/ display / ..”)。
事实上,我可以修改它创建history.pushState的客户端代码,但我不喜欢这样做。
相反,我希望处理Cordova Java代码中的url加载并将其重定向到“index.html”(assets / www中的主应用程序页面)的加载。
怎么做?
我试图用我自己的实现覆盖CordovaWebViewClient:
CordovaWebViewClient webViewClient = new MyWebViewClient(this, this.appView);
this.appView.setWebViewClient(webViewClient);
其中override shouldOverrideUrlLoading:
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
if (url.startsWith("file:///display/"))
return true;
return super.shouldOverrideUrlLoading(webView, url);
}
但是从客户端js代码重新加载页面时不会调用该方法。
答案 0 :(得分:0)
这是我提出的解决方案:
public class MyApp extends DroidGap
{
@Override
public void onCreate(Bundle savedInstanceState)
{
CordovaWebViewClient webViewClient = new MyWebViewClient(this, this.appView);
this.appView.setWebViewClient(webViewClient);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MyWebViewClient extends CordovaWebViewClient {
private DroidGap context;
public MyWebViewClient(DroidGap ctx, CordovaWebView view) {
super(ctx, view);
this.context = ctx;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{
if (url.startsWith("file:///display/")) {
InputStream stream;
try {
stream = this.context.getAssets().open("www/index.html");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
WebResourceResponse response = new WebResourceResponse ("text/html", "utf-8", stream);
// this' important as page has many other assets,
view.loadUrl(Config.getStartUrl());
return response;
}
return super.shouldInterceptRequest(view, url);
}
}