cordova 원 격 h5 페이지 로 컬 js 호출

로 컬 webview 에서 원 격 h5 페이지 를 여 는 방법;
가끔 은 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/시작 요청 은 해당 파일 의 구체 적 인 내용 을 수 동 으로 되 돌려 줍 니 다.
마지막 으로 다시 싸 면 되 는데...

좋은 웹페이지 즐겨찾기