Cordova 플러그 인 은 JavaScript 와 자바 의 통신 을 실현 하 는 상세 한 과정 입 니 다.

배경
Cordova 플랫폼 은 오픈 소스 의 크로스 플랫폼 개발 프레임 워 크 로 모 바 일 애플 리 케 이 션 개발 분야 에 널리 활용 되 고 안 드 로 이 드,iOS 등 시스템 을 뛰 어 넘 는 애플 리 케 이 션 을 개발 할 수 있 습 니 다.Cordova 플랫폼 은 HTML/JavaScript 언어 를 바탕 으로 하 는데 어떻게 서로 다른 플랫폼 에서 해당 기능 을 실행 하고 실현 할 수 있 습 니까?여기 서 Cordova 가 제공 하 는 풍부 한 플러그 인 을 사 용 했 습 니 다.Cordova 의 대량의 플러그 인 은 자신의 프레임 워 크 와 결합 하여 응용 개발 자 에 게 플랫폼 을 뛰 어 넘 는 능력 을 제공 합 니 다.개발 자 는 운영 체제 차원 의 인터페이스 와 상호작용 을 하지 않 아 도 응용 기능 자체 에 관심 을 가 질 수 있 습 니 다.HMS 코 어 는 코르도바 개발 자가 HMS 코어 에 보다 편리 하고 빠르게 접속 할 수 있 는 능력 을 편리 하 게 하기 위해 능력 별 로 를 제공 했다Cordova 플러그 인
간단 한 소개
여기 에는 가장 많이 사용 되 는 화 웨 이 푸 시 서비스 인 코르도바 플러그 인 을 결합 해 HMS 코어 가 사용 하 는 JS-Java 메시지 인 터 랙 션 방식 을 소개 하고,JS 측 에서 Java 사 이 드 인 터 페 이 스 를 어떻게 호출 해 HMS 코어 능력 을 구현 하 는 지 설명 한다.물론 문제 포 지 셔 닝 을 할 때 도 본 고 를 참고 하여 분석 할 수 있다.
코르도바 기본 구조
앱 이 시 작 될 때 MainActivity 에서 loadUrl 함 수 를 호출 합 니 다.즉,Cordova WebView 의 초기 화 를 촉발 하여 Cordova 를 시작 합 니 다.이 때 Cordova WebView 는 PluginManager 대상,NativeToJsMessage Queue 대상,JavascriptInterface 의 ExposedJsApi 대상 을 만 듭 니 다.후속 메시지 인 터 랙 션 에 서 는 주로 ExposedJsApi 와 NativeToJsMessage Queue 를 통 해 진행 된다.
플러그 인의 로드 는 두 단계 로 나 뉜 다.우선 플러그 인 관리자 대상 을 만 들 때 설정 파일 의 모든 플러그 인 을 읽 고 맵 을 만 듭 니 다.이 플러그 인 을 처음 호출 할 때 실례 화하 고 관련 기능 을 수행 합 니 다.
메시지 반환 모드 는 동기 화 와 비동기 두 가지 모드 를 포함 하고 Cordova 에 서 는 함수 에 async 키 워드 를 설정 하여 구분 합 니 다.
동기 화 모드 에 대해 시스템 은 NativeToJSMessage Queue 대기 열 에서 데 이 터 를 가 져 오고 되 돌려 줍 니 다.그리고 콜 백 ID 에 따라 요청 을 찾 아 success 함수 에 되 돌려 줍 니 다.
비동기 모드 에 대해 서 는 실행 후 순환 함수 가 끊임없이 대기 열 에 있 는 데 이 터 를 가 져 옵 니 다.대응 하 는 요청 을 찾 았 을 때 success 함수 에 되 돌려 줍 니 다.
4화 웨 이 푸 시 서비스플러그 인 에서 동기 화 방식 을 사용 합 니 다.
푸 시 를 예 로 들 어 플러그 인 호출 방식 을 설명 합 니 다.
위 에서 알 아 보지 못 하면 상관 없고 아래 의 과정 만 알 면 된다.
1.플러그 인 설치
명령 을 실행 하 는 cordova plugin add@hmscore/cordova-plugin-hms-push 에 최신 플러그 인 을 설치 합 니 다.실행 후 plugins 에 플러그 인 정 보 를 추가 합 니 다.

그 중에서 plugin.xml 에 사용 되 는 모든 js 류,android 류 등 정 보 를 기 록 했 습 니 다.plugin 초기 화 시 시스템 에 불 러 옵 니 다.함수 나 인터페이스 가 설정 되 어 있 지 않 으 면 사용 할 수 없습니다.
2.메시지 맵
플러그 인 은 4 가지 메시지 맵 방식 을 제공 합 니 다:
(1)HmsMessaging 메시지 호출
HmsPush.js 에 서 는 runHmsMessaging 인 터 페 이 스 를 통 해 안 드 로 이 드 플랫폼 에 메 시 지 를 전달 하고,비동기 호출 방식 을 통 해 안 드 로 이 드 가 되 돌아 온 결 과 는 Promise 를 통 해 되 돌아 갑 니 다.
메 시 지 는 HmsPushMessaging 클래스 로 전 환 됩 니 다.HmsPushMessaging 의 execute 함수 에서 각 기능 에 따라 다른 함수 로 전 환 됩 니 다.

public void execute(String action, final JSONArray args, final CallbackContext callbackContext)
        throws JSONException {
    hmsLogger.startMethodExecutionTimer(action);
    switch (action) {
        case "isAutoInitEnabled":
            isAutoInitEnabled(callbackContext);
            break;
        case "setAutoInitEnabled":
            setAutoInitEnabled(args.getBoolean(1), callbackContext);
            break;
        case "turnOffPush":
            turnOffPush(callbackContext);
            break;
        case "turnOnPush":
            turnOnPush(callbackContext);
            break;
        case "subscribe":
            subscribe(args.getString(1), callbackContext);
            break;
각 함수 호출 에서 결 과 를 설정 하 는 방식 으로 결 과 를 JS 층 에 되 돌려 줍 니 다.내용 은 nativeToJSMessage Queue 대기 열 에 기 록 됩 니 다.

callBack.sendPluginResult(new PluginResult(PluginResult.Status.OK,autoInit));
(2)HmsInstanceId 메시지 호출
HmsPush.js 에서 runHmsInstance 인 터 페 이 스 를 통 해 안 드 로 이 드 플랫폼 에 메 시 지 를 전달 하고 비동기 호출 방식 을 통 해 플랫폼 은 결 과 를 Promise 를 통 해 되 돌려 줍 니 다.
메 시 지 는 HmsPushInstanceId 클래스 로 전 환 됩 니 다.HmsPushInstanceId 의 execute 함수 에서 기능 에 따라 함수 처리 로 전 환 됩 니 다.

public void execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
    if (!action.equals("init"))
        hmsLogger.startMethodExecutionTimer(action);
 
    switch (action) {
        case "init":
            Log.i("HMSPush", "HMSPush initialized ");
            break;
        case "enableLogger":
            enableLogger(callbackContext);
            break;
        case "disableLogger":
            disableLogger(callbackContext);
            break;
        case "getToken":
            getToken(args.length() > 1 ? args.getString(1) : Core.HCM, callbackContext);
            break;
        case "getAAID":
            getAAID(callbackContext);
            break;
        case "getCreationTime":
            getCreationTime(callbackContext);
            break;
마지막 으로 결 과 를 설정 하 는 방식 으로 결 과 를 JS 층 에 되 돌려 줍 니 다.내용 은 nativeToJSMessage Queue 대기 열 에 기 록 됩 니 다.

callBack.sendPluginResult(new PluginResult(PluginResult.Status.OK,autoInit));
과정 은 HmsPushMessaging 과 매우 비슷 하 다.HmsPushInstanceId 는 HmsInstanceId 와 관련 된 인 터 페 이 스 를 매 핑 하 는 데 사용 되 고,HmsPushMessaging 은 HmsMessaging 과 관련 된 인 터 페 이 스 를 매 핑 하 는 데 사용 된다 는 것 이 주요 차이 점 이다.
(3)  local Notification 메시지 호출
HmsLocalNotification.js 에서 run 인 터 페 이 스 를 통 해 안 드 로 이 드 플랫폼 에 메 시 지 를 전달 하고 비동기 호출 방식 을 통 해 플랫폼 은 결 과 를 Promise 를 통 해 되 돌려 줍 니 다.
메 시 지 는 HmsLocalNotification 클래스 로 전 환 됩 니 다.HmsLocalNotification 의 execute 함수 에서 각 기능 에 따라 서로 다른 함수 로 전 환 됩 니 다.

public void execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
    switch (action) {
        case "localNotification":
            localNotification(args, callbackContext);
            break;
        case "localNotificationSchedule":
            localNotificationSchedule(args.getJSONObject(1), callbackContext);
            break;
        case "cancelAllNotifications":
            cancelAllNotifications(callbackContext);
            break;
        case "cancelNotifications":
            cancelNotifications(callbackContext);
            break;
        case "cancelScheduledNotifications":
            cancelScheduledNotifications(callbackContext);
            break;
        case "cancelNotificationsWithId":
            cancelNotificationsWithId(args.getJSONArray(1), callbackContext);
            break;
또한 sendpluginResult 인 터 페 이 스 를 통 해 처리 결 과 를 되 돌려 줍 니 다.그러나 local Notification 의 메 시 지 는 메시지 발송 과 관련 되 어 발송 이 완료 되면 메 시 지 를 되 돌려 줍 니 다.
(4)  Push 이벤트 리 셋
Push 메시지 에는 함수 호출 외 에 도 일반 메 시 지 를 받 거나 스 포 일 러 메 시 지 를 받 거나 Token 을 받 는 등 사건 감청 이 많 기 때문에 Push 에 서 는 각종 사건 에 대한 감청 도 있 습 니 다.
리 셋 프로 세 스에 대한 소 개 는 안 드 로 이 드 측 에서 시작 합 니 다.
Android 측 에서 Push 리 셋 메시지 의 함 수 는 HmsPushMessage Service.java 에 정 의 됩 니 다.
SDK 의 요구 에 따라 복사 에 필요 한 리 셋 함수:onMessage Received,onDeleted Messages,onNewToken 등.

이벤트 가 실 행 될 때 JS 층 에 이벤트 알림 을 보 냅 니 다.

public static void runJS(final CordovaPlugin plugin, final String jsCode) {
    if (plugin == null)
        return;
    Log.d(TAG, "runJS()");
 
    plugin.cordova.getActivity().runOnUiThread(() -> {
        CordovaWebViewEngine engine = plugin.webView.getEngine();
        if (engine == null) {
            plugin.webView.loadUrl("javascript:" + jsCode);
 
        } else {
            engine.evaluateJavascript(jsCode, (result) -> {
 
            });
        }
    });
}
JS 측 감청 정의:
HmsPushEvent.js 에서 모든 사건 을 정의 하고 등록 하 였 습 니 다.

exports.REMOTE_DATA_MESSAGE_RECEIVED = "REMOTE_DATA_MESSAGE_RECEIVED";
exports.TOKEN_RECEIVED_EVENT = "TOKEN_RECEIVED_EVENT";
exports.ON_TOKEN_ERROR_EVENT = "ON_TOKEN_ERROR_EVENT";
exports.NOTIFICATION_OPENED_EVENT = "NOTIFICATION_OPENED_EVENT";
exports.LOCAL_NOTIFICATION_ACTION_EVENT = "LOCAL_NOTIFICATION_ACTION_EVENT";
exports.ON_PUSH_MESSAGE_SENT = "ON_PUSH_MESSAGE_SENT";
exports.ON_PUSH_MESSAGE_SENT_ERROR = "ON_PUSH_MESSAGE_SENT_ERROR";
exports.ON_PUSH_MESSAGE_SENT_DELIVERED = "ON_PUSH_MESSAGE_SENT_DELIVERED";

function onPushMessageSentDelivered(result) {
  window.registerHMSEvent(exports.ON_PUSH_MESSAGE_SENT_DELIVERED, result);
}
exports.onPushMessageSentDelivered = onPushMessageSentDelivered;
주의해 야 할 것 은 이곳 의 정 의 는 응용 개발 시 주동 적 으로 호출 해 야 하 며 그렇지 않 으 면 효력 이 발생 하지 않 는 다 는 것 이다.데모 의 이벤트 Listeners.js 를 참고 할 수 있 습 니 다.
자바 사 이 드 에서 리 셋 을 실 행 했 지만 받 지 못 한 것 을 발견 하면 코르도바 에서 관련 호출 이벤트 가 정의 되 어 있 는 지 확인 해 야 합 니 다.
이렇게 하면 안 드 로 이 드 측 에서 이 벤트 를 촉발 할 때 JS 측 에서 관련 메 시 지 를 받 고 처리 할 수 있 습 니 다.새로운 이벤트 가 필요 하 다 면 이 절 차 를 참고 할 수도 있다.
작은 매듭
이상 의 방식 을 통 해 Push 플러그 인 은 JS 측-자바 측의 메시지 교환 을 실현 하 였 습 니 다.대부분의 서비스 함수 인터페이스 호출 에서 사용 되 는 유사 한 형식.그러나 일부 서비스,예 를 들 어 광고,지도 등 사진 이나 동 영상 을 표시 해 야 하 는 장면(예 를 들 어 지도,네 이 티 브 광고 등)은 다른 방식 으로 사용 되 고 사용 에 있어 서도 더욱 복잡 하 다.이런 것들 은 다른 문서 에서 상세 하 게 소개 할 것 이다.
>>HMS 코어 홈 페이지 를 방문 하여 관련 내용 을 더 알 아 보기
>>HMS Core Cordova 플러그 인 개발 가이드 문서 가 져 오기
>>화 웨 이 HMS 코어 공식 포럼
>>화 웨 이 HMS 코어 코르도바 플러그 인 오픈 소스 창고 주소:GitHub
이상 은 Cordova 플러그 인 이 자바 스 크 립 트 와 자바 의 통신 을 어떻게 실현 하 는 지 에 대한 상세 한 내용 입 니 다.Cordova 플러그 인 자바 스 크 립 트 와 자바 의 통신 에 관 한 자 료 는 우리 의 다른 관련 글 에 관심 을 가 져 주 십시오!

좋은 웹페이지 즐겨찾기