프로젝트 소개

JsBridge는 Android WebView와 JavaScript 간의 양방향 통신을 위한 브리지 라이브러리로, WeChat의 WebView JsBridge 구현에서 영감을 받았습니다. Java에서 JavaScript로, JavaScript에서 Java로의 양방향 호출을 지원하며, 안전하고 신뢰할 수 있는 메시지 전달 메커니즘을 제공합니다. ## 주요 기능 - **양방향 통신**: Java와 JavaScript 간의 양방향 호출을 지원하며, 콜백 메커니즘을 포함합니다. - **다중 통신 채널**: URL Scheme 인터셉트, @JavascriptInterface, evaluateJavascript(), loadUrl("javascript:") 네 가지 채널을 지원하여 다양한 Android 버전과 호환됩니다. - **지속적 콜백**: 여러 번 응답할 수 있는 콜백을 지원하여 실시간 업데이트, 이벤트 스트림 등 시나리오에 적합합니다. - **도메인 화이트리스트**: 네이티브 메서드를 호출할 수 있는 도메인을 제한하여 보안을 강화합니다. - **메시지 큐**: JS 주입 완료 전에 전송된 메시지는 자동으로 대기열에 쌓이며, 주입 완료 후 일괄 전달되어 메시지 손실을 방지합니다. - **사용자 정의 WebView 통합**: BridgeHelper를 통해 사용자 정의 WebView에 쉽게 통합할 수 있습니다. ## 설치 JitPack 저장소를 통해 의존성을 추가합니다: ```groovy repositories { maven { url "https://jitpack.io" } } dependencies { implementation 'com.github.happydog-intj:JsBridge:v2.1.0' } ``` ## 빠른 시작 ### BridgeWebView 사용 레이아웃에 BridgeWebView를 추가하고 Activity에서 초기화합니다: ```java BridgeWebView webView = findViewById(R.id.webView); webView.setGson(new Gson()); webView.addJavascriptInterface( new MainJavascriptInterface( webView.getCallbacks(), webView.getPersistentCallbacks(), webView), "WebViewJavascriptBridge"); webView.loadUrl("file:///android_asset/demo.html"); ``` ### Java에서 JavaScript 호출 JS 측에서 핸들러를 등록한 후 Java에서 호출합니다: ```javascript WebViewJavascriptBridge.registerHandler("functionInJs", function(data, responseCallback) { document.getElementById("show").innerHTML = "data from Java: = " + data; responseCallback("Javascript Says Right back aka!"); }); ``` ```java webView.callHandler("functionInJs", new Gson().toJson(user), new OnBridgeCallback() { @Override public void onCallBack(String data) { Log.d(TAG, "response from JS: " + data); } }); ``` ### JavaScript에서 Java 호출 @JavascriptInterface 클래스를 생성하면 JS 측에서 호출할 수 있습니다: ```java public class MainJavascriptInterface extends BridgeWebView.BaseJavascriptInterface { @JavascriptInterface public void submitFromWeb(String data, String callbackId) { Log.d("JSInterface", "data from web: " + data); mWebView.responseFromWeb("response from Java", callbackId); } } ``` ```javascript WebViewJavascriptBridge.callHandler( 'submitFromWeb', {'param': 'value'}, function(responseData) { document.getElementById("show").innerHTML = "response: " + responseData; } ); ``` ### 지속적 콜백 기본 콜백은 첫 호출 후 자동으로 삭제됩니다. `callHandlerPersistent()`를 사용하여 여러 번 응답할 수 있습니다: ```java webView.callHandlerPersistent("functionInJs", data, new OnBridgeCallback() { @Override public void onCallBack(String data) { Log.d(TAG, "called again: " + data); } }); ``` ### 도메인 화이트리스트 네이티브 메서드를 호출할 수 있는 도메인을 제한합니다: ```java webView.addAllowedHost("example.com"); webView.addAllowedHost("*.example.com"); ``` 화이트리스트가 비어 있으면(기본값) 모든 도메인이 허용됩니다. ## 사용자 정의 WebView 통합 BridgeHelper를 통해 사용자 정의 WebView에 통합할 수 있습니다: ```java public class CustomWebView extends WebView implements WebViewJavascriptBridge, IWebView { private BridgeHelper bridgeHelper; private void init() { getSettings().setJavaScriptEnabled(true); bridgeHelper = new BridgeHelper(this); setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { bridgeHelper.onPageStarted(); } @Override public void onPageFinished(WebView view, String url) { bridgeHelper.onPageFinished(); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return bridgeHelper.shouldOverrideUrlLoading(url); } }); } } ``` ## 호환성 - **Android 11+ (API 30+)**: 적응 완료, 기본적으로 파일 접근 권한이 꺼져 있으며, 캐시 정책은 호스트 앱이 결정합니다. - **HarmonyOS**: 커뮤니티에서 `@alvin917/jsbridge` 포팅 버전을 제공합니다. - **임베디드 기기**: WebView 생성 시 충돌이 발생하면 기기의 WebView 제공자를 확인하세요. ## 라이선스 MIT 라이선스.