안드로이드 웹뷰에서 window.open시 문제

안녕하세요. 잘들 지내시나요? ^^
요즘 안드로이드 웹뷰 때문에 골머리를 앓고 있네요.
웹뷰에 들어가는 소스중에 window.open으로 팝업창을 호출하는 부분이 있는데요.
안드로이드 웹뷰에서 자동으로 새창을 열어주더군요.
그런데 이 녀석을 닫으려고 하니까 뒤로가기 버튼 외에는 방법을 못 찾겠어요.
웹쪽을 수정할 수 있는 상황이 아니라 타이타늄에서 하려고 하는데요.
혹시 자동으로 열린 윈도우를 제어 가능 할까요?

window.open으로 열지 마시고,
앱쪽에 이벤트 리스너 하나 열어서 이벤트를 호출하세요.

먼저 띄우신 웹뷰쪽에서 앞서 만든 이벤트 호출해서 띄우시면 됩니다.

웹쪽 소스를 수정할수 없는 상황이라서요. ㅠㅠ

webview.evalJS()를 이용해서 할 수 있지 않을까요?

소스를 바꿔서 ti event를 날리는게 가장 좋은데 소스를 바꿀수 없는 remote 서버의 경우

android의 경우 문서화 되지 않은 함수가 하나 있네요.
onCreateWindow의 경우 webview에서 새로운 윈도우를 열려고 할때 호출되는 함수이고 webview를 return하면 열려고 했던 url을 return해준 webview에서 열어 줍니다. e를 통해 사용자 동작에의한 것인지 아닌지도 알수 있네요.
(onCreateWindow 참고 jira issue)

$.webView.onCreateWindow = function(e){
	if (!e.isUserGesture) {
        return null;
    }
  
    var webWin = Ti.UI.createWindow({
        fullscreen: false
    });
    var newWebView = Ti.UI.createWebView();
    webWin.add(newWebView);
    webWin.open();
  
    return newWebView;
};

ios의 경우에는 evalJS를 통해 window.open 을 재정의 하고 url을 바꿔치기 한다음 webview의 beforeload에서 해당 url인지 검사하여 다른일을 하게 하면 됩니다.

$.webView.addEventListener('load', function(e) {
	$.webView.evalJS('var orgOpen = window.open; window.open=function(url){location.href="http://toapp.ti/?url="+url};'); // titanium webview의 beforeload에서 컨트롤 하도록
});

$.webView.addEventListener('beforeload', function(e) {
	Ti.API.info(e.url); //e.navigationType 
	if(e.url.indexOf('http://toapp.ti/?')>-1){
		var targetUrl = e.url.replace('http://toapp.ti/?url=','');
		alert('open this url on other Ti contoller :\n'+targetUrl);
		$.webView.stopLoading();
	}
});

어쨋든 소스를 수정할 수 없는 상황이라는게 삽질을 만들겠죠.^^

아직 적용해 보지 않았지만 될것 같은 느낌이 오네요 ㅎㅎ
감사합니다. 적용후 답글 달겠습니다 ^^

1개의 좋아요