달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'onCreateWindow'에 해당되는 글 1건

  1. 2017.09.19 WebView 새창 띄울 때 Issue 사항...

안드로이드 개발 하다가 빡치는 상황 발생..

webview에서 처리하는 것중에, 새창 띄우는 것을 처리해줘야 하는데, 이게, 새창으로 띄우는게 여간 귀찮은게 아니다. 새창만 띄우는 것이면, 좀 덜 귀찮은데, 이게, 새로 뜨는 webview의 user-agent를 기존 부모뻘이 되는 webview와 동일하게 변경하니까, 서버에서 이걸 못 받는건지... php5 버전대 버그인지,,, 안드로이드 버그인지............

간략하게 정리하면 

<a target="_blank"> 또는 javascript:window.open(); 를 처리하려면, WebChromeClient를 설정해서, onCreateWindow를 재정의를 해줘야 한다.

근데, onCreateWindow를 통해서 만들어지는 새창 WebView의 user-agent를 서버에서 인식을 못한다!

구글링구글링을 통해서 찾은 소스 하나(https://stackoverflow.com/questions/9654529/handle-url-from-oncreatewindow-web-view)

        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            Message href = view.getHandler().obtainMessage();
            view.requestFocusNodeHref(href);

            String url = href.getData().getString("url");
            handleUrl(url); // handle the url here

            return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
        }


이얏호! 찾았따, 히히,

근데 스크립트로 새창을 열때는 안된다. <a href=""> 만 가능하다.

아오........................

그래서 결국 꼼수로


        @Override
        public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) {
            WebView temp = new WebView(context);
            temp.setWebViewClient(new WebViewClient(){
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    //여기서 새로운 커스텀된 webview 생성후, 처리를 해주면 된다.useragent를 처리해주면 된다.
                    // webview 생성후 부모레이아웃에 addView로 생성된 뷰를 추가해주자,
                    // 생성하면서 기본 설정도 여기서 다 처리해주면 된다.
                    //super.onPageStarted(view, url, favicon); 이건 주석처리 해놓고,
                }
            });
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(temp);
            resultMsg.sendToTarget();

            return true;
        }


얏호, 완료.

파라미터로 넘어오는 resultMsg에 분명 링크되는 정보들이 들어가 있는거는 분명한데,, 이걸 빼먹질 못하게 되어 있다. 빼먹을려면 WebViewProvider부터 해서 새로 작업을 해야하는 것 같다.. 제조사마다 WebViewProvider를 재정의해서 컴파일하는 듯 하다. 안드로이드 레퍼런스에 참고할만한 소스가 하나도 없다. 크롬소스를 토대로 만들라고했는데, 너무 배보다 큰 배꼽이래서 포기...

resultMsg의 오브젝트로 포함되는 WebViewTransport에 웹뷰를 설정해주고, resultMsg를 이미 정의되어져있는, 그러나 우리는 알지 못하는, 타겟으로 보낸다. 그럼 자동으로 WebViewTransPort에 설정된 웹뷰에 이런저런 짓거리를 해서 페이지 전환이된다. 이런저런 짓거리를 우리는 알지 못한다!! 아마 webviewProvider에 있을 것같은 느낌이 든다. 

이런저런 짓거리 중에 user-agent를 기본 시스템 user-agent로 되돌리는 것도 아닌 것 같은데, 왜 그런지 모르겠다. 로그를 찍으면 설정한 user-agent값이 제대로 찍히긴 하는데, 서버측에서는 제대로 인식을 못하는건지 아오 생각 할 수록 짜증....

처음에는 WebChromeClient의 onProgressChange(WebView view, int newProgress) 를 통해서 프로그레스가 30이상 되었을때, reload하면서 useragent를 다시 설정해주는 방식으로 하다가, 이건 좀 아닌 거 같잖아? 페이지가 살짝 뜨다가 지 혼자서 페이지를 새로고침을 하다니. 이건 좀 아니잖아.....  깔끔하지 못해! 

그래서 위의 방식대로, 사용자는 모르게 처리하게끔 처리 했다. 맘에 들진 않는데, 현실과 타협해버렸다.

Posted by
|