1

Android 開発サイトの GCM サンプルのクライアント側コードはgcm.register(SENDER_ID);、次の関数を使用して登録の有効期限が切れているかどうかを確認することにより、7 日ごとに呼び出すようにデフォルト設定されています。

public static final long REGISTRATION_EXPIRY_TIME_MS = 1000 * 3600 * 24 * 7;

/**
 * Checks if the registration has expired.
 *
 * To avoid the scenario where the device sends the registration to the
 * server but the server loses it, the app developer may choose to re-register
 * after REGISTRATION_EXPIRY_TIME_MS.
 *
 * @return true if the registration has expired.
 */
private boolean isRegistrationExpired() {
    final SharedPreferences prefs = getGCMPreferences(context);
    // checks if the information is not stale
    long expirationTime =
            prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1);
    return System.currentTimeMillis() > expirationTime;
}

関数の上のコメントは、これが「デバイスがサーバーに登録を送信するが、サーバーがそれを失うというシナリオを回避するために使用される」ことを暗示しています。これは (GCM サーバーではなく) サーバーが登録 ID を失う可能性があることを示唆していますか?これは、GCM 側で登録 ID が無効になる可能性があるためですか? GCM Advanced Topics Pageの次の段落に従って、これが可能であると思われます。

同様に、アプリケーションのバックアップ時に登録 ID を保存しないでください。これは、アプリケーションが復元されるまでに登録 ID が無効になる可能性があり、アプリケーションが無効な状態になる可能性があるためです (つまり、アプリケーションは登録されていると認識しますが、サーバーと CM はその登録 ID を保存しません—したがって、アプリケーションはそれ以上メッセージを受け取りません)。

前もって感謝します!

4

2 に答える 2

3

「バックアップ/復元」のケースを明確にするために: 登録 ID は特定のデバイスに関連付けられています。アプリが別のデバイスに復元された場合、以前の登録 ID がまだ古いデバイスを指している場合、復元されたデバイスでメッセージを取得する唯一の方法は、新しい登録 ID を取得することです。

于 2013-07-27T16:28:39.943 に答える