프로그램/Android

Webview를 이용한 APP간 통신[Scheme, Androidbridge]

잡식성초보 2017. 9. 14. 09:00

안드로이드 WebView 사용시 앱과 웹간에 특정한 값을 주고 받아서 값을 해결해야 경우가 엄청나게 많이 있습니다.


네이티브영역으로 되어있는 Activity 이동을 해야한다던지, 카메라기능을 연다던지 경우 웹페이지에서 앱의 모든 기능을 사용할수 없기때문이죠.


위와 같은 기능을 해야할 경우가 ! 웹앱간 특정값을 주고 받는 일이 일어나서 그값에 따라서 동작을 해야하는 경우지요. 웹과 사이에 데이터를 주고 받는 패턴이 2가지가 있습니다


하나는 스킴(SCHEME)값을 이용한 방법과 두번째는 안드로이드 브릿지를 이용한 호출 되겠는데요


제가 최초 하이브리드 개발시에는 안드로이드 브릿지를 이용한 호출 방법을 이용했습니다. 개발자 분도 저에게 어떻게 값을 줘야하는지 몰라서 제가 구글링을 하다가 처음으로 찾아서 작업해본게  방법이었죠


지금 유지보수, 개발중인 앱은 이방법을 이용하지는 않습니다. 그리고 이전에 어디서 검색하다가 본거같은데  브릿지를 이용하는 방법이


보안에 별로 않좋다는 글을 본거같은데...  정확하지는 않네요. 여튼 방법에 대하여 설명드리도록 하겠습니다. 



  1. 안드로이드 브릿지를 이용한 데이터 받기



먼저 앱쪽에서 해줘야할 방법입니다. addJavascriptInterface 함수에 브릿지를 이용한 클래스와 웹개발자와 상의하여 정한 Alias 적어줍니다그리고 클래스를 생성후 아래 소스와 같이 @JavascriptInterface 붙여서 함수를 하나 만들어 주면 되겠습니다.



mWebview.addJavascriptInterface(new AndroidBrige(), test);

private class AndroidBrige {

    
    @JavascriptInterface    
    public void whatthe() {

        
        mHandler.post(new Runnable() {            
            @Override            
            public void run() {
                Log.e(TAG, "테스트중입니다.");        
            }        
        });    
    }
}



이제 웹쪽에서 저 whatthe라는 함수를 호출하기 위한 방법은 Window.test.whathe(); 가 되겠습니다.



2. 스킴값을 이용한 데이터 받기


안드로이드 웹뷰의 shouldOverrideUrlLoading 함수를 사용합니다. 오버라이드된 함수의 url 이용하여 처리한다고 보면 되겠습니다.

아래 앱에서 처리해 줘야하는 코드입니다.



@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    Log.e(TAG, "shouldOverrideUrlLoading : " + url);
    listener.shouldOverrideUrlLoading(url);

    //전화 걸기
    if (url.startsWith("tel:")) {
        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
        mContext.startActivity(intent);
        reload();
        return true;
    }
}



웹쪽에서의 처리 방식은 A 태그를 사용하여 값을 넘겨주면 되겠습니다. 



반응형