0

我有一个使用 History API 的 Cordova/PhoneGap 应用程序。它使用 History API,因为它是 Web 和 Cordova 应用程序之间的共享代码。移动 webKit 看起来支持 History API(但实际上支持是错误的)。

因此,在某些地方,客户端 js-code 会生成 document.location.reload,并且当前 url 可以是 ANY(并且与初始 URL 不同)。在 Cordova 应用程序中,这会导致“应用程序错误:网络错误 (file:///display/...)”。那是因为之前有 history.pushState("/display/..") 。

事实上,我可以在它产生history.pushState 的地方修补客户端代码,但我不想这样做。

相反,我想处理 Cordova Java 代码中的 url 加载并将其重定向到加载“index.html”(资产/www 中的主应用程序页面)。

这该怎么做?

我试图用我自己的实现覆盖 CordovaWebViewClient :

    CordovaWebViewClient webViewClient = new MyWebViewClient(this, this.appView);
    this.appView.setWebViewClient(webViewClient);

在哪里覆盖应该OverrideUrlLoading:

public boolean shouldOverrideUrlLoading(WebView webView, String url) {

    if (url.startsWith("file:///display/"))
        return true;

    return super.shouldOverrideUrlLoading(webView, url);
}

但是在从客户端 js 代码重新加载页面时不会调用该方法。

4

1 回答 1

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);
    }
}
于 2013-06-21T14:51:39.893 回答