프로젝트 소개
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 라이선스.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.