흥미로운 질문입니다.
새 등록 절차로 전환하는 것이 좋습니다.
휴대 기기에서 실행되는 Android 애플리케이션은 GoogleCloudMessaging 메소드 register (senderID ...)를 호출하여 메시지를 수신하도록 등록합니다. 이 메소드는 GCM 용 애플리케이션을 등록하고 등록 ID를 반환합니다. 이 간소화 된 접근 방식은 이전 GCM 등록 프로세스를 대체합니다.
라는 메모 Google may periodically refresh the registration ID
는 이전 등록 프로세스를 보여주는 페이지에만 표시되므로이 메모가 더 이상 관련이 없을 수 있습니다.
안전을 원하면 이전 등록 프로세스를 계속 사용할 수 있습니다. 또는 새로운 프로세스를 사용할 수 있지만 com.google.android.c2dm.intent.REGISTRATION
Google이 등록 ID를 새로 고치기로 결정한 경우 보장되도록 인 텐트 를 처리하는 코드를 추가 할 수 있습니다 .
즉, 이러한 새로 고침을 경험 한 적이 없으며 등록 ID가 변경된 경우 (일반적으로 앱을 제거했다가 다시 설치 한 후 알림을 보낸 결과)에도 이전 등록 ID는 그대로 유지됩니다. (결과적으로 Google의 응답으로 전송 된 정식 등록 ID가 됨) 아무런 문제가 없었습니다.
수정 (2013 년 6 월 6 일) :
Google 은 새 인터페이스를 사용 하도록 데모 앱 을 변경했습니다 . 앱에서 로컬로 유지하는 값에 만료 날짜를 설정하여 등록 ID를 새로 고칩니다. 앱이 시작되면 로컬에 저장된 등록 ID를로드합니다. "만료"된 경우 (데모에서는 7 일 전에 GCM에서 수신했음을 의미 함) gcm.register(senderID)
다시 전화를 겁니다 .
오랫동안 실행되지 않은 앱에 대해 Google에서 등록 ID를 새로 고치는 가상 시나리오는 처리하지 않습니다. 이 경우 앱은 변경 사항을 인식하지 못하며 타사 서버도 인식하지 못합니다.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mDisplay = (TextView) findViewById(R.id.display);
context = getApplicationContext();
regid = getRegistrationId(context);
if (regid.length() == 0) {
registerBackground();
}
gcm = GoogleCloudMessaging.getInstance(this);
}
private String getRegistrationId(Context context) {
final SharedPreferences prefs = getGCMPreferences(context);
String registrationId = prefs.getString(PROPERTY_REG_ID, "");
if (registrationId.length() == 0) {
Log.v(TAG, "Registration not found.");
return "";
}
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion || isRegistrationExpired()) {
Log.v(TAG, "App version changed or registration expired.");
return "";
}
return registrationId;
}
private boolean isRegistrationExpired() {
final SharedPreferences prefs = getGCMPreferences(context);
long expirationTime =
prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1);
return System.currentTimeMillis() > expirationTime;
}
수정 (2013 년 8 월 14 일) :
Google은 데모 앱을 다시 변경했습니다 (2 일 전). 이번에는 등록 ID가 7 일 후에 만료되는 것으로 간주하는 논리를 제거했습니다. 이제는 새 버전의 앱이 설치 될 때만 등록 ID를 새로 고칩니다.
수정 (2014.04.24) :
완전성을 위해 GCM 개발에 참여한 Google 개발자 인 Costin Manolache ( 여기 에서 가져옴)가이 문제에 대해 다음과 같이 말합니다 .
'정기적'새로 고침은 발생하지 않았으며 등록 새로 고침은 새 GCM 라이브러리에 포함되지 않습니다.
등록 ID 변경의 유일한 알려진 원인은 업그레이드하는 동안 메시지를 받으면 앱이 자동으로 등록 취소되는 오래된 버그입니다. 이 버그가 수정 될 때까지 앱은 업그레이드 후에도 register ()를 호출해야하며 지금까지이 경우 등록 ID가 변경 될 수 있습니다. unregister ()를 명시 적으로 호출하면 일반적으로 등록 ID도 변경됩니다.
제안 / 해결 방법은 예를 들어 공유 기본 설정으로 저장된 자신의 임의 식별자를 생성하는 것입니다. 각 앱 업그레이드에서 식별자와 잠재적으로 새로운 등록 ID를 업로드 할 수 있습니다. 이것은 또한 서버 측에서 업그레이드 및 등록 변경을 추적하고 디버깅하는 데 도움이 될 수 있습니다.
이것은 공식 GCM 데모 애플리케이션의 현재 구현을 설명합니다.
등록하기 com.google.android.c2dm.intent.REGISTRATION
위해 GoogleCloudMessaging
클래스를 사용할 때 처리해서는 안됩니다 .