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