2011-07-06 2 views
9

누구나 Google C2DM으로이 문제가 발생했는지 궁금합니다.Android C2DM : 동일한 기기 및 앱에 중복 된 메시지

  1. 사용자가 응용 프로그램을 설치하고 등록 키를 C2DM 서버와 등록 : 이것은 내가 직면하고있는 시나리오입니다.
  2. 사용자가 앱을 제거합니다.
  3. 사용자가 앱을 다시 설치합니다 ( 은 새로운 등록 키용 C2DM 서버에 등록 함).

이제 내 서버에서 사용자의 전화로 메시지를 보내고 중복 메시지가 나타납니다.

아무도 예측할 수없는 행동을 예측할 수 있습니까? 또는 어떻게 해결할 수 있습니까? 감사합니다,

+1

그들은 동일한 메시지를 연속으로 두 번 받았다는 것을 의미합니까? 분명히 예상되는 동작이 아닙니다. 클라우드 키를 제거 할 때 클라우드 키를 더 이상 사용하지 않는 것으로 표시해야합니다. 질문 할 때 어리석은 질문과 사과 -하지만 서버 코드가 클라우드 ID를 속이려고하고 있습니까? 모든 c2dm 서버 요청 및 Google에서 보낸 응답을 보관합니까? –

답변

7

이 가장 좋은 방법이지만, 포스터 하나 개의 기술을 제공하는 android-c2dm 그룹에서 이상 관련 thread이 있는지 확실하지 : 그래서,

내가 메시지에 등록 ID를 보내고을 장치의 저장된 등록 ID와 대조하여 확인할 수 있습니다. 이 같은 아니라면

, 폐기 및 등록 이드 더 이상 사용하지

단점이 등록을 보내고있는 이드 이미 제한 메시지 크기에 약간의 공간을 차지 서비스를 알립니다. 그러나 내 원본 메시지가 오랫동안 몇 문자 이상이기 때문에 완벽하게 작동합니다.

+0

훌륭한 기술! 매우 똑똑해 보인다. – Matroska

0

그래, 나도 같은 문제로 달렸어. 내 견해로는 안드로이드 C2DM 구현에 대한 큰 감독이다. iOS는 앱이 하나의 기기 토큰 (c2dm 등록 ID와 동일)에 대한 알림 만 수신 할 수 있다는 점에서이 점을 훨씬 잘 처리합니다.

내가 사용하는 해결 방법은 등록 ID의 마지막 10자를 일부로 보내는 것입니다

if (!regId.endsWith(bundle.getString("regsuffix"))) return null; 
1

또 다른 해결책이 장치에 대한 고유 식별자로 서버를 제공 할 수 내 onMessage 메소드의 C2DM 페이로드의 후 나는 다음 확인을한다. 이 경우 장치가 다시 설치 한 후 등록하려고하면 해당 UUID에 대한 registrationID 만 업데이트하면됩니다.

+0

+1은 내 응용 프로그램의 아키텍처에서 동일한 구현을 수행하고 있습니다. 또한 C2DM 서비스에서 등록이 유효하지 않다고 반환하면 다시 제거 할 수 있습니다. –

4

이것은 응용 프로그램을 다시 설치 한 후 첫 번째 푸시 알림에 대해서만 발생해야합니다.

Google C2DM 서비스는 제거 된 응용 프로그램을 감지 할 때 수동 모드로 작동합니다.

(C2DM에서 등록 해제하지 않고 응용 프로그램을 제거한 후 첫 번째 푸시 알림 !!!) 응답에서 오류를 반환하지 않습니다. 그러나 두 번째 푸시 알림은 응용 프로그램이 제거되었다는 것을 알 수있는 "잘못된 등록"또는 "등록되지 않은"오류 코드를 반환합니다.

이유는 C2DM 서버가 응답 코드를 즉시 반환하고 클라이언트를 밀어 넣으려고하기 때문입니다. 클라이언트가 응용 프로그램이 제거되었다고 응답하면 C2DM 서버에서 응용 프로그램이 삭제됩니다.다음 푸시 시도는 오류 코드를 즉시 반환합니다.

+0

하지만 사용자가 제거한 직후 앱을 설치하고 Reg_Id에 등록하면 어떻게됩니까? 기기가 제거하기 전에 유효한 reg_id를 사용하여 푸시를 가져 오는 경우 메시지가 장치로 이동하거나 "잘못된 등록"을 반환 할 것입니다. – Erik

+0

등록 ID는 기기, 애플리케이션 및 로그인 한 Google 사용자별로 고유합니다. 내 생각에, 당신이 묘사 한 시나리오에서, 애플리케이션은 이전 설치와 같은 등록 ID를 얻게 될 것이므로, 괜찮을 것입니다. – Zamel

0

@Zamel과 @johan 모두 답이 좋으며 조합해야합니다. 둘 이상의 솔루션을 결합하면 서버의 데이터베이스가 최소화됩니다.

그래서 가장 좋은 방법은하는 것 : 기존 장치 ID를 보낼 때 서버에

  • 업데이트 푸시 토큰을 푸시 토큰을 보낼 때

    1. 보내기 장치 ID

    2. 무효화 밀어 넣기 알림이 서버에 "잘못된 등록"또는 "등록되지 않음"오류 코드를 반환하는 경우 서버의 데이터베이스에서 밀어 넣기 토큰

    푸시 토큰이 "잘못된 등록"또는 "등록되지 않음"으로 인식되면이를 무효화 (null로 표시)하거나 데이터베이스의 행을 삭제하거나 만료 기능을 구현할 수 있습니다. 그것은 당신의 필요에 달려 있습니다