2014-05-17 3 views
6

gcm을 사용하는 Android 프로젝트에서 작업 중입니다. 우리가 appfrom 장치를 제거하고 장치가 새로운 등록 id를 얻는 대부분의 시간을 다시 설치했다면 알게되었습니다. 그런 다음 응용 프로그램 서버와 업데이트에서 이전 것을 삭제하지 않으면 메시지가 ID와 ID 모두로 전송됩니다. 응답 그것은 정식 ID가 존재하는 표시됩니다. 내 질문은,이 시점에서 메시지가 성공적으로 해당 장치로 보내지 여부 아닌가요?gcm canonical id를 업데이트해야합니다.

답변

5

Google의 응답에 정식 등록 ID를 수신하면 메시지가 GCM 서버에서 수락되어 GCM 서버가이를 기기로 전달하려고 시도합니다. 실제로 기기로 전송되는지 여부는 기기가 사용 가능한지 (즉, 인터넷에 연결되어 있는지) 여부에 따라 다릅니다. 서버가 이전 ID와 새 ID 모두에 GCM 메시지를 보내는 경우 기기에 두 개의 메시지가 표시됩니다.

정식 ID가 서버 측에

는 한 응용 프로그램이 잘 작동하고 같이 모든 것이 정상적으로 작동합니다. 그러나 응용 프로그램의 버그 가 동일한 장치에 대해 여러 등록을 트리거하는 경우 상태를 조정하기가 어려우며 은 중복 메시지으로 끝날 수 있습니다.

GCM은 "정식 등록 ID"라고하는 기능을 제공하여 을 쉽게 복구 할 수 있습니다. 정식 등록 ID는 응용 프로그램에서 요청한 마지막 등록의 ID가되도록 으로 정의됩니다. 장치로 메시지를 보낼 때 서버가 사용해야하는 ID입니다. 나중에에 다른 등록 ID를 사용하여 메시지를 보내려고하면

는 GCM은 평소와 같이 요청을 처리 할 것입니다,하지만 응답의 registration_id 분야에서 정식 등록 ID가 포함됩니다. 서버에 저장된 등록 ID를이 정식 ID로 바꿔야합니다. 결국 사용중인 ID가 으로 작동하지 않게됩니다. 당신은 응용 프로그램의 각 인스턴스에 고유 한 식별자를 할당하여이 문제를 극복 할 수

(Source). 해당 식별자를 기기의 외부 저장소에 저장하면 앱을 제거 할 때 해당 식별자가 삭제되지 않습니다. 그런 다음 앱을 다시 설치하면 복구 할 수 있습니다. 등록 ID와 함께이 식별자를 서버에 보내면 서버에이 식별자에 대한 이전 등록 ID가 있는지 확인하고 삭제할 수 있습니다.

+2

Eran, 당신은 gcm과 관련된 모든 것을 묻는 사람인 것처럼 보입니다. 나는 당신의 솔루션에 대해 약간의 수정을했습니다. 장치의 regid와 함께 서버의 고유 ID (사용자 이름). 내가 틀렸다고 정정 해 주겠지 만, 사용자 당 하나의 레지 드만을 허용하고 있으므로 적절하게 업데이트 할 수 있습니다. 그러나 이것은 여전히 ​​장치가 * 항상 * 가장 최근의 (그리고 유효한) 레지가 있다고 가정합니다. 그것을 추측하는 것이 안전한가요? – user1164937

+0

두 번째 질문 : 내가 알고 있어야하는 다른 * 가장자리 사례 *가 있습니까? 그 중 하나가 제공되면 정규 ID로 사용자의 regid를 업데이트해야합니까? 미리 감사드립니다. – user1164937

+0

나는 Google의 예제 gcm 앱과 동일한 프로세스를 사용하여 regid에 등록하는 것을 잊어 버렸습니다. sharedpreferences에 regid가없는 경우입니다. (나는 스팸에 대해 사과한다) – user1164937

0

@Eri 이전 등록 ID를 제거하거나 키 및 정식 ID 위치를 업데이트하는 두 가지 옵션이 있습니다. 나는 업데이 트하는 것을 선호합니다 ... 당신은 내 대답을 가지고 있습니다. 여기에 대답했습니다. Steps to Update Canonical Ids