cordova 원 격 h5 페이지 로 컬 js 호출
4497 단어 cordovacordova-android
가끔 은 app 에서 스타일, 기능 등 을 직접 디 버 깅 하려 고 하지만 수정 할 때마다 재배 치 해 야 하기 때문에 귀 찮 습 니 다. 따라서 각 문 서 를 참고 한 후에 개인 이 가장 좋다 고 생각 하 는 해결 방안 을 알 게 되 었 습 니 다. 방안 은 다음 과 같 습 니 다.
기본적으로 원 격 h5 페이지 를 열 면 로 컬 브 라 우 저 로 열 립 니 다.그래서 우 리 는 cofig. xml 에 코드 를 추가 해 야 합 니 다.
//
첫 걸음 에 완성 했다.
h5 페이지 로 컬 플러그 인 인터페이스 호출
방법 1: 먼저 로 컬 에 플러그 인 을 설치 한 다음 에 간단하게 cordova. js plugin 등 모든 js 파일 을 서버 에 함께 놓 습 니 다.h5 페이지 는 cordova. js 만 참조 하면 됩 니 다. (필요 한 파일 은 platforms / android / assets / www /) 또는 (platform / android / platform www);이런 방법 은 단점 이 많다. 예 를 들 어 다운로드 한 데이터 가 증가 하고 앱 스토어 심 사 를 통과 할 수 없다.
방법 2: 위의 js 파일 은 서버 에 놓 여 있 습 니 다. 그러면 h5 에 게 로 컬 cordova. js 등 파일 을 직접 사용 하 게 할 수 있 습 니까? 그러면 그렇게 많은 js 파일 을 다시 내 리 는 문제 가 존재 하지 않 습 니 다.
그러나 오류 가 발생 했 습 니 다: Not allowed to load local resource:file:///android_asset / www / cordova. js 는 http 프로 토 콜 에서 file: / 방식 으로 로 컬 파일 에 접근 하 는 것 을 금지 한 다 는 뜻 입 니 다.
근 데 cordova app 이 방문 한 거 라면file://android_asset / www / index. html 이면 다른 file: / 자원 을 불 러 오 는 데 문제 가 없습니다.
이것 은 웹 뷰 의 보안 메커니즘 이다.
해결 방법 은 웹 뷰 의 요청 을 차단 하여 로 컬 js 를 불 러 오 는 것 입 니 다. 구체 적 으로 다음 과 같 습 니 다.
platforms / android / CordovaLib / src / org / apache / cordova / engine / System WebViewClient. java 열기
public void clearAuthenticationTokens() {
this.authenticationTokens.clear();
}
private static final String INJECTION_TOKEN = "http://injection/"; //
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
--- ---
if(url != null && url.contains(INJECTION_TOKEN)) {
String assetPath = url.substring(url.indexOf(INJECTION_TOKEN) + INJECTION_TOKEN.length(), url.length());
try {
WebResourceResponse response = new WebResourceResponse(
"application/javascript",
"UTF8",
view.getContext().getAssets().open(assetPath)
);
return response;
} catch (IOException e) {
e.printStackTrace(); // Failed to load asset file
return new WebResourceResponse("text/plain", "UTF-8", null);
}
}
--- ---
try {
// Check the against the whitelist and lock out access to the WebView directory
// Changing this will cause problems for your application
if (!parentEngine.pluginManager.shouldAllowRequest(url)) {
LOG.w(TAG, "URL blocked by whitelist: " + url);
// Results in a 404.
return new WebResourceResponse("text/plain", "UTF-8", null);
}
CordovaResourceApi resourceApi = parentEngine.resourceApi;
Uri origUri = Uri.parse(url);
// Allow plugins to intercept WebView requests.
Uri remappedUri = resourceApi.remapUri(origUri);
if (!origUri.equals(remappedUri) || needsSpecialsInAssetUrlFix(origUri) || needsKitKatContentUrlFix(origUri)) {
CordovaResourceApi.OpenForReadResult result = resourceApi.openForRead(remappedUri, true);
return new WebResourceResponse(result.mimeType, "UTF-8", result.inputStream);
}
// If we don't need to special-case the request, let the browser load it.
return null;
} catch (IOException e) {
if (!(e instanceof FileNotFoundException)) {
LOG.e(TAG, "Error occurred while loading a file (returning a 404).", e);
}
// Results in a 404.
return new WebResourceResponse("text/plain", "UTF-8", null);
}
}
메모: cordova - plugin - crosswalk - webview 플러그 인 을 사용 했다 면 cordova - plugin - crosswalk - webview platformandroidsrcorgcrosswalkengineXWalk CordovaResource Client. java 를 열 어야 합 니 다.
shouldInterceptLoadRequest 방법 을 수정 합 니 다.
마지막 으로 우 리 는 외부 체인 의 h5 페이지 에서 cordova. js 경 로 를 아래 의 것 으로 바 꿉 니 다.
사고방식: "file: / /" 에 접근 할 수 없 으 니 http: / 로 바 꾸 고 웹 뷰 의 요청 을 차단 하 겠 습 니 다.http://injection/시작 요청 은 해당 파일 의 구체 적 인 내용 을 수 동 으로 되 돌려 줍 니 다.
마지막 으로 다시 싸 면 되 는데...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
cordova 원 격 h5 페이지 로 컬 js 호출로 컬 webview 에서 원 격 h5 페이지 를 여 는 방법; 가끔 은 app 에서 스타일, 기능 등 을 직접 디 버 깅 하려 고 하지만 수정 할 때마다 재배 치 해 야 하기 때문에 귀 찮 습 니 다. 따라서 각 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.