Titanium 에서 webview를 사용하여 앱을 만들고 있는데 javascript에서 호출이 안됩니다.

안녕하세요

작년 12월에 앱 개발하다가 다른일때문에 잠시 중단하였던 프로젝트를
다시 하게 되었는데

막히는 부분이 있어서 질문을 드립니다.

정말 간단할꺼라고 생각했는데 이것때문에 지금 3일째 진도를 못나가고 있네요

titanium 에서 웹뷰를 생성하고

Ti.App.addEventListener(‘fromWebView’, function(e) {
alert(" click from web ");
});

웹뷰에서 호출되는 웹에서 …
function fromWebview(e){
alert(“Before Ti.App.fireEvent”);
Ti.App.fireEvent(“fromWebview”,{});
alert(“After Ti.App.fireEvent”);
}

이렇게 했습니다.

그런데 Ti 가 정의 되지 않았다는 오류가 나서

var Ti = window.parent.Ti;

인터넷에 이것을 정의 해주는 내용이 있어 정의 했더니…

이번엔 App 가 정의 되지 않았다는 오류가 나네요

작업은 맥에서 작업하고 대상 디바이스는 안드로이드 갤럭스 3 입니다.

가능한 혼자힘으로 해결해보려고 인터넷을 찾아봤는데 원인을 알수가 없네요

부탁드리겠습니다.

혹시 html은 remote에 있는건가요? titanium은 기본적으로 local(앱 내부)에 있는 html에 대해서만 titanium 객체를 추가하는 스크립트를 넣어줍니다.
http://docs.appcelerator.com/titanium/latest/#!/guide/Communication_Between_WebViews_and_Titanium-section-29004919_CommunicationBetweenWebViewsandTitanium-Remotewebcontent

그렇다고 remote에서 웹뷰와 주고 받고가 안되는건 아닙니다. webview to ti 는 url에 데이터를 담아 이동하고(eg. toapp://mydata?json={}) beforeloadd에서 해당 주소 파싱하여 실행하고 ti 에서 webview로는 evaljs를 이용하는 방법입니다. 네이티브도 보통 이런식으로 만듭니다. 근데 이런거 다 일일이 해주기 귀찮으니 아래와 같은 모듈이 있습니다.

이 모듈은 좋은데 아직 ios 버전이 64bit적용이 안되었습니다. 64bit로 바꾸는건 간단합니다. 아래를 참고하세요.

변경후 해당 github 저장소에 pull request 날려보세요.^^

2개의 좋아요

앗 감사합니다.

local 만 될꺼라곤 생각도 못했네요…

말씀하신 방법으로 해보겠습니다.

정말 다시 한번 더 감사드립니다. 원인을 찾지 못해 너무 고생을 했네요ㅠ.ㅠ

한가지 더 질문을 드리겠습니다.

말씀하신 모듈을 설치하고 설정을 했는데

Ti.App.fireEvent(“fromWebview”,{});

마찬가지로 App 이 정의되지 않았다고 나옵니다.

웹에서는 타이타늄의 함수를 호출하려면 어떻게 해야 하나요?

한번더 도움 부탁드립니다.

감사합니다.

var Ti = {_event_listeners:[],createEventListener:function(listener ){ var newListener={ listener:listener ,systemId:-1 ,index:this._event_listeners.length };this._event_listeners.push(newListener);return newListener;},getEventListenerByKey:function(key,arg){for(var i=0;i<this._event_listeners.length;i++){if(this._event_listeners[i][key]==arg){return this._event_listeners[i];}} return null;},API:TiAPI,App:{addEventListener:function(eventName,listener) {var newListener=Ti.createEventListener(listener);newListener.systemId=TiApp.addEventListener(eventName,newListener.index);return newListener.systemId;},removeEventListener:function(eventName,listener) {if(typeof listener==‘number’){TiApp.removeEventListener(eventName,listener);var l=Ti.getEventListenerByKey(‘systemId’,listener);if(l!==null){Ti._event_listeners.splice(l.index,1);}}else{l=Ti.getEventListenerByKey(‘listener’,listener);if(l!==null){TiApp.removeEventListener(eventName,l.systemId);Ti._event_listeners.splice(l.index,1);}}},fireEvent:function(eventName,data) {TiApp.fireEvent(eventName,JSON.stringify(data));}},executeListener:function(id,data) {var listener=this.getEventListenerByKey(‘index’,id);if(listener!==null){listener.listener.call(listener.listener,data);}}};

이걸 javascript 내에 정의 해 보셔요…

감사합니다. ㅠㅠ

정말 간단할꺼라고 생각했던걸 3일동안 잡고 있으니 답답했는데

해결하게 되어서 정말 기쁘네요~

즐거운 저녁되세요~

혹시 이건 안드로이드만 되는건가요?

안드로이드 에서는 정상적으로 되는데

IOS 애뮬에서는 정상적으로 호출이 안되네요

function fromWebview(e)
{
alert(“Before Ti.App.fireEvent”);
Ti.App.fireEvent(“fromWebview”,{});
alert(“After Ti.App.fireEvent”);
}

ios 에서는 위에서 첫번째 메시지만 호출됩니다.