C2DM도 안해봤고 이번에 GCM을 사용하려고 테스트 하던중에 궁금한 점이 생겨 고수님들께 한수 듣고자 여쭙게 되었습니다.
일단은 android 개발자 사이트에 있는 GCM 메뉴얼을 보고 테스트 중인데 찬찬히 따라하니 잘 되더군요.
서버는 PHP를 이용해서 구현했구용.
클라이언트 실행을 하면 아래 소스를 따라
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
} else {
Log.v(TAG, "Already registered");
}
클라이언트 등록을 합니다.
그리고 GCMBaseIntentService를 상속받아 구현한 BroadCast Receiver 클래스의
onRegistered 메소드에서 registrationId 값을 받을 수 있었습니다.
등록 후 한동안(2,3시간 정도?)는 서버에서 registrationId에 해당하는 기기로 메시지 전송이 잘되는데
꽤 많은 시간이 지나면 등록되지 않았다고 NotRegistered 라는 결과가 나오면서 전송이 안되는군요.
다시 등록하게 되면 registrationId는 변경되고 변경된 registrationId로 메시지를 전송하면 다시 잘 되구요.
여기서 궁금한 점은 registrationId가 특정 기기의 등록번호를 나타내는 건데 이 번호가 계속 변경된다면
클라이언트는 일정한 텀마다 서버의 DB에 registrationId 변경한 것을 업데이트해줘야 하는건가요 ?
다른 값(API Key, Project ID)들은 고정값인데 registrationId은 계속 변경되니 어떤 방식으로 registrationId를 관리하는지가 궁금합니다.
제가 알기로는 레지스트레이션 아이디는 있으면 다시 등록을 하시지 않아도 될겁니다.
계속 바뀌는 이유는 잘모르겠군요.. 전 하루이틀 지나도 없어지지 않던데요..
서버 DB에는 유저구분하는고유값에 regId하나씩 물려주고 새로 바뀌면 계속 바꿔줘야합니다.
데모로 테스트할때는 같은 기기로 regId계속 발급해서 보내고 그 regId에 전부 푸시를 보내니까 regId만큼 메시지가 오더군요..
아 윗분 어제 질문은 봤지만 제가 php는 해보질 못해서 답변을 못드리겠더군요..ㅜㅜ 전 jsp로 해서 데모에있는 클래스 그대로 썼습니다.
저도 궁금했던게
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
boolean appInstall = pref.getBoolean("appInstall", false);
if (appInstall == false) {
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("appInstall", true);
editor.commit();
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if(regId.equals("")){
GCMRegistrar.register(this, StringLib.STRING_GCM_KEY);
Toast.makeText(getApplicationContext(), "등록", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "실패???", Toast.LENGTH_SHORT).show();
}
}
final String regId = GCMRegistrar.getRegistrationId(this);
if(regId.equals("")){ ..........
이부분이 실행할때마다 계속 실행이 됩니다.
한번만 실행 되야 하는게 아닌가요?
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
boolean appInstall = pref.getBoolean("appInstall", false);
이걸로 처리를 해놓구 한번말 실행하게 개발은 했는데..... 뭔가 해답을 못찾겠습니다.
체크를 한번 해보세요.
1. onRegistered 메소드르 regId가 한번이라도 들어왔는지
- 여기로 값이 안들어오면 getRegistrationId를 호출해도 null이 나옵니다.
2. unRegister 메소드를 호출하진 않는지
- 이건 설명할 필요없이 regId를 지워버리는 메소드죠..




저도 지금 관련 질문올리려다 이글을 보게 되었네요.
저도 같은 환경으로 개발하고 있구요.
서버단 php
<?
$headers = array(
'Content-Type:application/json',
'Authorization:key=AIzaSyD9G9befw34qoR734DFVRomfY_P8Ag12deg0g'
);
$arr = array();
$arr['data'] = array();
$arr['data']['msg'] = "aaaaaaa";
$arr['registration_ids'] = array();
$arr['registration_ids'][0] = "weqcwef23234324_1JajC3eFMH_CQwdToceTxuviDFXvNvdTCLukTUOtgRX-TS88GLzjh8tnoHsJd54m_BcqHxvokRbhZEnSNHKCD-QgpipdYBWjyZmxAXW5IAAbegZMJ22c3fA";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/send');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($arr));
$response = curl_exec($ch);
echo $response;
curl_close($ch);
?>
결과값
{"multicast_id":8058384952291267024,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1342053790432731%94722f8cf9fd7ecd"}]}
성공적이라는 메세지는 있는데, 푸시메세지는 오지 않습니다.
어떻게 해결해야할지 모르겠네요....
질문에 또 질문을 올려 죄송합니다.