안녕하세요
작년 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를 이용하는 방법입니다. 네이티브도 보통 이런식으로 만듭니다. 근데 이런거 다 일일이 해주기 귀찮으니 아래와 같은 모듈이 있습니다.
Napp Jockey module
이 모듈은 좋은데 아직 ios 버전이 64bit적용이 안되었습니다. 64bit로 바꾸는건 간단합니다. 아래를 참고하세요.
변경후 해당 github 저장소에 pull request 날려보세요.^^
2개의 좋아요
앗 감사합니다.
local 만 될꺼라곤 생각도 못했네요…
말씀하신 방법으로 해보겠습니다.
정말 다시 한번 더 감사드립니다. 원인을 찾지 못해 너무 고생을 했네요ㅠ.ㅠ
한가지 더 질문을 드리겠습니다.
말씀하신 모듈을 설치하고 설정을 했는데
Ti.App.fireEvent(“fromWebview”,{});
마찬가지로 App 이 정의되지 않았다고 나옵니다.
웹에서는 타이타늄의 함수를 호출하려면 어떻게 해야 하나요?
한번더 도움 부탁드립니다.
감사합니다.
coolsik
(맛나식당)
2월 9, 2015, 9:41오전
5
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);}}};
coolsik
(맛나식당)
2월 9, 2015, 9:42오전
6
이걸 javascript 내에 정의 해 보셔요…
감사합니다. ㅠㅠ
정말 간단할꺼라고 생각했던걸 3일동안 잡고 있으니 답답했는데
해결하게 되어서 정말 기쁘네요~
즐거운 저녁되세요~
혹시 이건 안드로이드만 되는건가요?
안드로이드 에서는 정상적으로 되는데
IOS 애뮬에서는 정상적으로 호출이 안되네요
function fromWebview(e)
{
alert(“Before Ti.App.fireEvent”);
Ti.App.fireEvent(“fromWebview”,{});
alert(“After Ti.App.fireEvent”);
}
ios 에서는 위에서 첫번째 메시지만 호출됩니다.