2013-06-21 4 views
0

History API를 사용하는 Cordova/PhoneGap 응용 프로그램이 있습니다. 웹 및 코도 바 앱 간의 코드 공유로 History API를 사용합니다. 모바일 웹킷은 History API를 지원하는 것처럼 보입니다 (실제로 지원은 버그입니다).Cordova/PhoneGap에서 페이지 새로 고침을 처리하는 방법

그래서 어떤 곳에서는 클라이언트 js-code가 document.location.reload를 만들고 현재 url은 ANY (초기 URL과 다를 수 있음)가 될 수 있습니다. 코르도바 어플에서 이것은 "응용 프로그램 오류 : 네트워크 오류 (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); 

경우 재정의 shouldOverrideUrlLoading :

public boolean shouldOverrideUrlLoading(WebView webView, String url) { 

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

    return super.shouldOverrideUrlLoading(webView, url); 
} 

그러나이 방법은 클라이언트 JS 코드에서 페이지를 다시로드에서 호출되지 않습니다.

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); 
    } 
} 
: 여기

답변

0

내가 생각해 솔루션입니다
관련 문제