웹마스터 팁
XE 로만든 앱 + 푸쉬기능 구현하기 (안드로이드)
2013.10.16 16:55
앱..이랄건없고 모바일웹을 제작했습니다.
http://ddbang.terainvest.co.kr/?m=1
주소를 공개해도되나 모르겠지만 그냥 살펴보시라고 넣어둡니다.
디자인/개발 단독작업이라 엉성한부분이좀 있습니다. 스크립트작업이나 디자인을 조금더 보완해야하긴합니다만..
무튼 되긴했습니다.
해당 모바일웹을 안드로이드 웹뷰 앱으로 제작했습니다.
말그대로 그냥 껍데기만있는 앱이지요.
껍데기만있고, 앱을실행하면 내부에선 웹브라우저가 동작하는 형태입니다.
굳이 앱을 만든 이유는.. 아무래도 푸쉬때문이겠죠 ^^
푸쉬서버는 parse.com에서 제공하는 월 100만건 무료 api를 이용합니다.
푸쉬내용은 XE알림센터를 이용해 알림센터가 전달하는 모든 내용을 푸쉬로 전달합니다.
이 팁은 저처럼 앱을 제작하시는분이 있을까봐 적어둡니다.
일단 빈 모듈을 하나 생성하시는게 작업에 유리합니다. 저는 app_module 이라는 모듈을 생성했습니다.
app_module.class.php 를 이용해 member 테이블에 obid 라는 필드를 추가하고, 단말기의 정보를 저장해줄 함수를 로그인 트리거로 걸어줍니다.
obid는 단말기의 고유번호이고, 트리거로 추가한 함수 두개중 하나는 고유번호를 세션에 저장해주는것 하나는 로그인할때 저장된세션에 있는 고유번호를 회원정보에 반영해 주는 부분 입니다.
require_once(_XE_PATH_.'modules/member/member.class.php'); class app_module extends member { /** * @brief install the module **/ function moduleInstall() { return new Object(); } /** * @brief chgeck module method **/ function checkUpdate() { $oDB = &DB::getInstance(); $oModuleModel = &getModel('module'); if(!$oDB->isColumnExists("member", "obid")) return true; if(!$oModuleModel->getTrigger('member.doLogin', 'app_module', 'controller', 'triggerAfterLogin', 'after')) return true; if(!$oModuleModel->getTrigger('moduleHandler.proc', 'app_module', 'controller', 'triggerModuleHandlerProc', 'after')) return true; return false; } /** * @brief update module **/ function moduleUpdate() { $oDB = &DB::getInstance(); if(!$oDB->isColumnExists("member", "obid")) $oDB->addColumn("member", "obid", "varchar","128"); $oModuleModel = &getModel('module'); $oModuleController = &getController('module'); if(!$oModuleModel->getTrigger('member.doLogin', 'app_module', 'controller', 'triggerAfterLogin', 'after')) $oModuleController->insertTrigger('member.doLogin', 'app_module', 'controller', 'triggerAfterLogin', 'after'); if(!$oModuleModel->getTrigger('moduleHandler.proc', 'app_module', 'controller', 'triggerModuleHandlerProc', 'after')) $oModuleController->insertTrigger('moduleHandler.proc', 'app_module', 'controller', 'triggerModuleHandlerProc', 'after'); return new Object(0, 'success_updated'); } function moduleUninstall() { return new Object(); } /** * @brief re-generate the cache files **/ function recompileCache() { } }
이제 controller 부분의 두개함수를 작성 해주어야겠죠?
/** * @brief Get ObjectID, Save Session */ function triggerModuleHandlerInit(){ if(Context::get('obid')){ $_SESSION["obid"] = Context::get('obid'); } } /** * @brief A trigger to add Object ID for Member */ function triggerAfterLogin(&$obj) { $member_srl = $obj->member_srl; if(!$member_srl) return new Object(); if(!$_SESSION["obid"]) return new Object(); $query = "update xe_member set `obid` = '".$_SESSION["obid"]."' where `member_srl` = ".$member_srl; $sql = mysql_query($query); if($sql){ unset($_SESSION["obid"]); return new Object(); }else{ return new Object(-1,"단말기 정보를 가져오는데에 실패했습니다."); } }
이제 푸쉬를 실제로 전송할 Model 클래스에 다음함수를 추가해줍니다.
function getPushMessage($v,$obid){ switch($v->type) { case 'D': $type = "글"; break; case 'C': $type = "댓글"; break; // 메시지. 쪽지 case 'E': $type = "쪽지"; break; } switch($v->target_type) { case 'C': $str = sprintf('%s님이 회원님의 %s에 "%s" 댓글을 남겼습니다.', $target_nick_name, $type, $v->target_summary); break; case 'M': $str = sprintf('%s님이 "%s" %s에서 회원님을 언급하였습니다.', $target_nick_name, $v->target_summary, $type); break; // 메시지. 쪽지 case 'E': $str = sprintf($lang->app_ncenter_message_string, $v->target_summary); break; } //푸쉬전송 $url = 'https://api.parse.com/1/push'; $appId = <!-- 수정하세요 parse.com appId -->; $restKey = <!-- 수정하세요 parse.com RESTKEY -->; $target_device = $obid; // using object Id of target Installation. $push_payload = json_encode(array( "where" => array( "objectId" => $target_device, ), "data" => array( "alert" => $str, "url" => getUrl('','act','procNcenterRedirect', 'notify', $v->notify, 'url', $v->target_url) ) )); $rest = curl_init(); curl_setopt($rest,CURLOPT_URL,$url); curl_setopt($rest, CURLOPT_RETURNTRANSFER, 1); curl_setopt($rest, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($rest,CURLOPT_PORT,443); curl_setopt($rest,CURLOPT_POST,1); curl_setopt($rest,CURLOPT_POSTFIELDS,$push_payload); curl_setopt($rest,CURLOPT_HTTPHEADER, array("X-Parse-Application-Id: " . $appId, "X-Parse-REST-API-Key: " . $restKey, "Content-Type: application/json")); curl_exec($rest); }
위함수는 CURL을 이용하여 parse.com에 푸쉬메세지를 전달합니다.
중요한부분 몇가지를 짚고넘어가자면,
curl_setopt($rest, CURLOPT_RETURNTRANSFER, 1);
이부분을 통해 결과값을 페이지에 뿌리지않고 변수에 저장해줍니다. 페이지에 뿌리게되면 트리거부분에서 에러가납니다.
(display handler와의 충돌~)
curl_setopt($rest, CURLOPT_SSL_VERIFYPEER, 0);
이부분은 CURL작업할때 많이들 빠뜨리시는 부분인데, https:// 로 데이터를 전송할땐 반드시 포함되어야합니다.
그리고, 메세지를 생성하는 과정에서 기존 알림센터와 살짝 다른부분이 있습니다.
우선 언어팩을 사용하실분은 global $lang; 을통해 사용하시면되고, 알림센터의 언어팩을 그대로사용할경우 푸쉬메세지에 태그가 그대로 노출되므로 ( <strong> ... ) 새 언어팩을 만드셔서 사용하시면 되겠습니다.
이제, 알림센터의 controller 파일을 조금 수정해줍니다.
else if($logged_info) { // 익명 노티가 아닐 때 로그인 세션의 회원정보 넣기 $args->target_member_srl = $logged_info->member_srl; $args->target_nick_name = $logged_info->nick_name; $args->target_user_id = $logged_info->user_id; $args->target_email_address = $logged_info->email_address; //푸쉬알림 추가 $oMemberModel = &getModel('member'); $push_sender_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); if($push_sender_info->obid){ $oAppModuleModel = &getModel('app_module'); $oAppModuleModel->getPushMessage($args,$push_sender_info->obid); } }
모듈을 업로드하고, 업데이트를하면 준비가 완료된겁니다.
이제 앱에서 첫페이지를 로드할때 get방식으로 obid 변수를 전달합니다.
단말기의 고유 object id를 담아 전달하면됩니다.
저의경우 다음과같은 형태로 전달했습니다.
http://ddbang.terainvest.co.kr/?m=1&obid=OBJECTID
그럼, 최초 페이지가 로딩될때 object ID를 세션에 저장하고 로그인이 될때 회원정보에 반영을 하게되지요.
그리고 회원정보에 obid가 반영되어 있는경우 알림센터에서 app_module 에 있는 model클래스의 함수를통해 푸쉬데이터를 생성하고, 전송합니다.
앱에서 들어온 푸쉬데이터의 data->url 을 통해 해당웹페이지를 로드해주면 되겠습니다. ^^
아래는 인증샷..
사실.. 이걸어떻게해야하나 하며 웹뷰앱 만드신분과 머리를 맞대고 고민을 많이했습니다만
이렇게 공개해보니 별거아니네요...
흠이 좀 있다면,,, model 클래스의 푸쉬전송함수를 푸쉬데이터 생성만하고 controller에서 처리하려했는데
...귀찮... ^^* 이해하시죠?
MVC패턴에 살짝 어긋나긴했지만 무튼 .. 도움되시길바랍니더 ~(__)~
댓글 53
-
socialskyo
2013.10.16 18:11
-
Xiso
2013.10.16 18:33
그냥 해보시면... ^^;
별로안어려울겁니다.
모듈생성이 힘드시면, 알림센터(ncenter)모듈을 조금 수정하셔도 되겠네요 ^^
-
장포크
2013.10.16 18:55
앱쪽 맡은 사람입니다. 위팁은 parse.com을 이용한거 쁀 아니라 gcm에도 유용하게 사용할수있습니다ㅎㅎ 물론 그렇게 할 때에는 appmodulemodel의 코드가 gcm에 맞게 수정되어야 합니다 -
ⓒ블루엔젤™
2013.10.16 20:16
좋은 글이군요 앱쪽소스는 어디서 얻을수 있나요? ^^;
-
푸시아
2013.10.16 21:12
와우~ 짱짱맨!~
-
윈컴이
2013.10.16 23:04
감사합니다!
공부해서 앱 배포해도 될까요?
-
Gunmania
2013.10.17 11:26
음 앱에 parse 붙여서 전체 대상으로 푸시 날리기까진 완료했네요. 개인별 알림 구현하려면 그 object id값을 가져와야될텐데 이 부분 자료를 찾아봐야할듯한..
-
Xiso
2013.10.17 11:46
이 팁이 그것을 위한겁니다만.... -
Gunmania
2013.10.17 13:00
아 앱쪽 얘기였습니다. 앱에서 주소에 obid 파라미터값을 전달하라고 하셨는데 이 Object ID란게 최초 실행시 랜덤으로 생성되는것이고 parse.com 대시보드쪽에서 확인할 수 있는데 이걸 앱 내에서 다시 가져와서 WebView.loadUrl("http://test.com/?m=1&obid=" + ObjectID); 형태로 해야할텐데 'ObjectID' 값을 받아올 방법에 대한..
-
Gunmania
2013.10.17 13:04
ParseInstallation.getCurrentInstallation().getObjectId(); 이렇게 해주면 메인 페이지까진 &obid=(ID)가 들어가는것 같은데 정작 로그인하면 DB에 값이 안들어가네요. 로그인 페이지 URL 찍어보면 &obid=(ID)가 빠져있는데 이것과 관련이 있으려나요. -
Xiso
2013.10.17 13:25
로그인페이지에선 관계가없습니다.
function
triggerModuleHandlerInit(){
if
(Context::get(
'obid'
)){
$_SESSION
[
"obid"
] = Context::get(
'obid'
);
}
}
위 트리거함수에서 obid가 들어오면 세션에 저장해두고, 세션에서 물고있다가 로그인할때 덮어주는 형태라서요~
-
Gunmania
2013.10.17 13:32
음 어디서 꼬였는지 obid 필드에 값이 안들어가네요. 혹시 해서 PC에서 임의로 (주소)/?obid=(임의의숫자) 넣고 로그인해봤지만 동일하고요..;
-
Gunmania
2013.10.17 14:22
일단 수동으로 한 계정에 obid값을 넣어봤습니다. 알림센터 Lite의 Controller에서 알림 관련 부분을 추가했고요. 그런데 이러고 나니까 @(해당 닉네임)이 포함하여 댓글이나 글을 작성하면 등록버튼이 무반응이고 해당 계정(obid값이 들어간)의 글에는 댓글이 안달리네요; XE는 1.7.3.6입니다
-
Xiso
2013.10.17 14:24
같은버전이시네요,
제가뭔가 빼먹고올린게있는지 한번살펴볼게요...
일단 저는 전체푸쉬, 개별적푸쉬(알림센터 메세지가 전부 푸쉬로 전송됨) 모두 성공적으로 동작하고있습니당..
-
장포크
2013.10.18 01:52
앱쪽 소스 공개하겠습니다.
우선 phonegap을 사용해서 웹을 뿌려줍니다.
Parse.initialize(this, "xxxxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxx");
PushService.setDefaultPushCallback(getContext(), xxxxxxxxxxx.class);
ParseInstallation.getCurrentInstallation().saveInBackground();
ParseAnalytics.trackAppOpened(getIntent());
PushService.subscribe(this, "", xxxxxxxxxxx.class);
String objectId = ParseInstallation.getCurrentInstallation().getObjectId();
super.loadUrl("http://ddbang.terainvest.co.kr/?m=1&obid="+objectId);
xxxxxxxxxxx는 개인적인 부분입니다.
-
XE러버
2013.10.18 11:32
앱쪽 소스도 똑같고 웹쪽 소스도 똑같은데 objectid를 못 받아와서 DB에 저장을 못 시킵니다;;
게다가 DB상에 objectid를 삽입하고 테스트를 해봐도 개인알림이 안 되네요
json이나 curl도 설치되있고..
-
KrteamENT
2013.12.21 18:34
저 각부분에 무슨코드가 들어가는지..알수있을까요?
-
장포크
2013.12.23 20:51
parse.com 가입하신후 정보관리에보시면
키가있습니다.
맨위에 두갠대 정확한 이름은 기억이 안나네요..
quick start들어가셔서 안드로이드 들어가시면 설명자세히 나와있습니다.
-
KrteamENT
2013.12.23 20:53
흐음..영어로 되어있어서인지..그리고 제 SDK버전과 맞지 않는거 같네요..
에러가 나오는군요
-
KrteamENT
2013.12.23 21:03
흐음..영어로 되어있어서인지..그리고 제 SDK버전과 맞지 않는거 같네요..
에러가 나오는군요
-
장포크
2013.12.23 21:07
jar는 붙히셧나요?
parse.com쓰시려면 parse-버전명.jar을 lib폴더에 추가시켜주셔야합니다.
-
KrteamENT
2013.12.23 21:10
으으..제겐 좀 어렵군요..
죄송하지만..소스 주실수 있으실까요 ;ㅁ;
-
장포크
2013.12.23 21:15
제소스는 200줄정돈대 괜찮으시겠어요?ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
해당 jar 파일
lib폴더에 넣어주시구요 ㅋ
액티비티 맨위에
import 들 있자나요?
import com.parse.*;
이거써주시고 저 소스쓰시면 오류 잡힐껍니다.
-
KrteamENT
2013.12.23 21:17
만약 주신다면야 저야 매우 감사하죠 ;ㅁ;
어플 수정중이였는데 마침 보고 이것저것 넣어보고 하려고 하거든요 ;ㅁ;
-
장포크
2013.12.23 21:19
그렇게 드릴수는 없죠 ㅋㅋㅋ;
제 앱의 비밀들이 고스란히 담겨있는데요.
parse부분만 문제라면 제 답변으로 충분하실겁니다.
한번해보세요 ㅋ
-
KrteamENT
2013.12.23 21:21
ㅋㅋㅋ 그렇군요
한번 해볼게용
-
장포크
2013.12.24 14:34
-
XE러버
2013.10.18 10:44
저도 마찬가지로 obid를 못 받아오네요
-
장포크
2013.10.18 12:32
objectID를 못받아오는건 이상하네요.
우선 alert빼시거나.. (toast로 빼시거나는 알아서) 저는 귀찮아서 데이타를 끄고 킵니다.
암튼 그러면 에러메시지가 나오는데 확인해보세요.
데이터를 끄시고 해당처럼 나오면 일단 앱에서는 성공하신겁니다.
-
Gunmania
2013.10.20 09:15
phonegap이 아니라 그냥 웹뷰인것과 관계가 있을지는 모르겠습니다만 일단 메인 페이지에서는 정상적으로 &obid=(ID)가 붙는 것이 확인됩니다. 그런데 링크를 타고 다른 페이지로 가면 이 부분이 사라지더군요. 세션에 값이 남아있는지 여부는 확인을 못했고요.
한가지 의심되는 것은 웹뷰를 통해 구현해놨으면 보통 가입 경로 모듈에서 최초 접속 경로를 기준으로 하므로 /?m=1 또는 /?m=1&obid=(ID)가 찍혀야되는데 /index.php?act=dispMemberSignUpForm 가 찍힌다는 점입니다.
딱히 웹뷰에서 건드려준 점이라고는 UserAgent 값 뒷 부분에 앱 여부 식별을 위해 'App'이 더 붙도록 해 준 정도인데도 그렇습니다. 혹시나 해서 UserAgent 변조 부분을 제거해봤는데 /index.php?act=dispMemberSignUpForm 까지는 아니고 중간에 거쳐온 게시물 주소가 찍힌다는 점을 빼면 역시 /?m=1&obid=(ID) 이 찍히지 않습니다.
가입 경로 모듈이 세션을 기반으로 하는 것으로 알고 있는데 여기서 이렇게 뜬다는건 뭔가 이 과정에 문제가 있는게 아닐까 싶은데 답답하네요.
-
XE러버
2013.10.20 09:38
일단 앱쪽은 obid를 잘 받아옵니다. 웹쪽 문제인 것 같습니다;;
-
XE러버
2013.10.20 10:21
아무리 확인해봐도 다른 모듈이나 애드온과의 충돌은 아닌 것 같고 모듈 소스가 잘못된 것 같습니다
-
XE러버
2013.10.20 13:01
실제 사용하고 있는 홈페이지에서의 모듈 폴더를 압축해서 올려주시면 안 될까요?
-
Xiso
2013.10.22 14:37
해당모듈은 해당팁이외에 많은함수가 내장되어있습니다.
앱과의 통신을위한 여러가지함수나 공개할수없는부분들이 많아서.. 좀그렇습니다 ㅠㅠ
-
Gunmania
2013.10.22 19:32
지금 보면 아예 모듈이 동작을 안하는것 같습니다. 임의로 info.xml, module.xml을 만들어 넣어주고 triggerModuleHandlerInit() { 바로 뒤에 return new Object(-1,"단말기 정보를 가져오는데에 실패했습니다."); 와 같이 해봤는데 아무 반응이 없네요.
그리고 app_module.class.php를 보면 트리거 부분이 moduleHandler.proc, triggerModuleHandlerProc 로 나와있는데 컨트롤러에는 function triggerModuleHandlerProc(){이 아닌 function triggerModuleHandlerInit(){가 들어가 있고요.
obid를 수동으로 넣어주고 해당 계정과 관련해서 알림센터가 동작할때 아예 등록이 안되는 경우도 이와 연관이 있지 않나 싶습니다. $oAppModuleModel = &getModel('app_module'); 이 부분이 동작하지 않는...
-
Xiso
2013.10.23 14:08
으어... 원모듈중 필요한부분만 추출해서 수정하여 업로드하다보니 이런문제가생긴것같습니다. ㅠㅠ 죄송합니다.
지금프로젝트가 끝나면 다음프로젝트에 같은시스템을 적용할 예정이니, 깔끔하게 새모듈을 하나짜서 업로드해보겠습니다.
죄송합니다.!
-
XE러버
2013.10.22 20:02
윗분과 마찬가지로 앱 모듈 자체가 작동하지 않습니다..
좋은 팁인데 사용이 불가능합니다
-
Xiso
2013.10.23 14:10
죄송합니다.
obid를 받아오지못하는 가장큰문제는 class에서 선언된 트리거와, 실제 동작해야할 트리거함수명 자체가 다릅니다.
이건 저의 실수입니다. ㅠㅠ 정말죄송합니다.
트리거는 핸들러 init시점에 동일한 함수명으로 수정해서 사용하시면됩니다.
이미 proc트리거가 등록된상태라면, 함수명을 등록된트리거와 일치하도록 수정해보세요.
-
Gunmania
2013.10.23 15:24
app_module.controller.php에는 class app_moduleController extends app_module { 를 추가했고
app_module.class.php에는 class app_moduleModel extends app_module {를 상단에 추가하고 본문에 적어두신 소스를 넣었습니다. (물론 둘 다 <?php는 넣었고요)
함수도 일단 이미 트리거가 생성된 상태라 함수를 Proc으로 변경해주니 obid가 바뀐것은 확인했습니다. 이제 실제 푸시가 오는지 여부를 확인해야겠네요
-
Gunmania
2013.10.23 15:42
음 이제 푸시 알림은 오네요. 다만 'A님이 (글/댓글)에 B 댓글을 남겼습니다' 부분에서 A 부분이 안오고 있는데 한번 원인 파악을 해봐야겠네요.
결정적으로 골때리는건 앱인지 일반 모바일 웹인지 판단하기 위해 앱의 경우 User-Agent 값을 살짝 변조하는 방식을 쓰고 있는데 이 방식을 쓰면 세션 유지가 안되서 obid값이 안들어가는군요 -_-;;
-
Xiso
2013.10.23 16:08
알림이 생성되는구문에 포함된 $target_nick_name 부분을 $v->target_nick_name 으로 수정해보세요.
저도 실제사용하는소스는 저게아니라서,, 수정하는과정에서 문제가생겼네요 ㅠ
-
Gunmania
2013.10.23 16:22
해결되었습니다. 저도 그 부분 문제같아서 수정했는데 동일해서 뭐지 했는데 수정한 model 이 아니라 controller를 업로드 했었네요 -_-;;;
글에서는 알림센터 스킨 수정해야한다고 하셨는데 알림센터 Lite 기본 스킨에선 문제 없이 동작합니다. 이제 앱쪽 문제만 개인적으로 해결하면 될 것 같습니다. 감사합니다.
-
XE러버
2013.10.24 18:54
해결한 웹쪽 소스 좀 올려주실 수 있나요?
-
XE러버
2013.10.25 10:31
이젠 obid는 받아오는데 push가 되지 않네요 ㅠㅠ
누가 좀 알려주세요
-
XE러버
2013.10.25 15:44
<?php /** * @brief Get ObjectID, Save Session */ class app_moduleController extends app_module { function triggerModuleHandlerProc(){ if(Context::get('obid')){ $_SESSION["obid"] = Context::get('obid'); } } /** * @brief A trigger to add Object ID for Member */ function triggerAfterLogin(&$obj) { $member_srl = $obj->member_srl; if(!$member_srl) return new Object(); if(!$_SESSION["obid"]) return new Object(); $query = "update xe_member set `obid` = '".$_SESSION["obid"]."' where `member_srl` = ".$member_srl; $sql = mysql_query($query); if($sql){ unset($_SESSION["obid"]); return new Object(); }else{ return new Object(-1,"단말기 정보를 가져오는데에 실패했습니다."); } } }
-
XE러버
2013.10.25 15:45
<?php class app_moduleModel extends app_module { function getPushMessage($v,$obid){ switch($v->type) { case 'D': $type = "글"; break; case 'C': $type = "댓글"; break; // 메시지. 쪽지 case 'E': $type = "쪽지"; break; } switch($v->target_type) { case 'C': $str = sprintf('%s님이 회원님의 %s에 "%s" 댓글을 남겼습니다.', $v->target_nick_name, $type, $v->target_summary); break; case 'M': $str = sprintf('%s님이 "%s" %s에서 회원님을 언급하였습니다.', $v->target_nick_name, $v->target_summary, $type); break; // 메시지. 쪽지 case 'E': $str = sprintf($lang->app_ncenter_message_string, $v->target_summary); break; } //푸쉬전송 $url = 'https://api.parse.com/1/push'; $appId = 입력; $restKey = 입력; $target_device = $obid; // using object Id of target Installation. $push_payload = json_encode(array( "where" => array( "objectId" => $target_device, ), "data" => array( "alert" => $str, "url" => getUrl('','act','procNcenterRedirect', 'notify', $v->notify, 'url', $v->target_url) ) )); $rest = curl_init(); curl_setopt($rest,CURLOPT_URL,$url); curl_setopt($rest, CURLOPT_RETURNTRANSFER, 1); curl_setopt($rest, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($rest,CURLOPT_PORT,443); curl_setopt($rest,CURLOPT_POST,1); curl_setopt($rest,CURLOPT_POSTFIELDS,$push_payload); curl_setopt($rest,CURLOPT_HTTPHEADER, array("X-Parse-Application-Id: " . $appId, "X-Parse-REST-API-Key: " . $restKey, "Content-Type: application/json")); curl_exec($rest); } }
-
XE러버
2013.10.25 15:46
<?php /** * @brief Get ObjectID, Save Session */ class app_moduleController extends app_module { function triggerModuleHandlerProc(){ if(Context::get('obid')){ $_SESSION["obid"] = Context::get('obid'); } } /** * @brief A trigger to add Object ID for Member */ function triggerAfterLogin(&$obj) { $member_srl = $obj->member_srl; if(!$member_srl) return new Object(); if(!$_SESSION["obid"]) return new Object(); $query = "update xe_member set `obid` = '".$_SESSION["obid"]."' where `member_srl` = ".$member_srl; $sql = mysql_query($query); if($sql){ unset($_SESSION["obid"]); return new Object(); }else{ return new Object(-1,"단말기 정보를 가져오는데에 실패했습니다."); } } }
-
XE러버
2013.10.25 15:46
도대체 어디가 틀렸기에 push 메세지가 안 되는걸까요??
-
Canto
2013.12.23 17:36
날라오는 push 값의 json data 를 activity 에서 쓸려면 어떻게 하죠?
url 값을 loadUrl 로 넘겨주고 싶은데.. parse.com 문서들을 봐도 이해가 안되네요 ㅠ
-
Canto
2013.12.25 02:03
자체 해결 봤습니다.
저 같이 parse.com 홈페이지에서 API문서를 밤새보면서 삽질 하지 마시라고 자답 남겨놉니다.
Intent intent = getIntent(); if(intent.getExtras()!=null){ try { Bundle extra = intent.getExtras(); String data = extra.getString("com.parse.Data"); JSONObject json; json = new JSONObject(data); 변수명 = json.getString("push 변수명"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
너무나 어려운 이야기이지만....엄청 대단해 보입니다....