0

History API を使用する Cordova/PhoneGap アプリケーションがあります。Web アプリと Cordova アプリの間でコードを共有するため、History API を使用します。また、モバイル WebKit は History API をサポートしているように見えます (ただし、実際にはサポートにバグがあります)。

したがって、ある場所では、クライアントの js コードが document.location.reload を作成し、現在の URL は ANY にすることができます (最初の URL とは異なります)。Cordova アプリでは、これにより「アプリケーション エラー: ネットワーク エラー (file:///display/...)」が発生します。以前に history.pushState("/display/..") があったからです。

実際、history.pushState を作成するクライアント コードにパッチを適用することはできますが、これはやりたくありません。

代わりに、Cordova Java コードで URL の読み込みを処理し、それを "index.html" (assets/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 に答える