Я написал приложение, которое использует C2DM. Я могу регистрировать устройства и отправлять сообщения в порядке, однако я получаю устройства, которые неожиданно незарегистрированы, и поэтому перестают получать сообщения. Я думал, что смогу справиться с этим кодом ниже, но похоже, что «незарегистрированные» намерения не получены (это не подтверждено, но устройство не перерегистрировано).c2dm устройство незарегистрировано автоматически
Мои вопросы: это нормально, если устройства незарегистрированы из-под синего? Если это сообщение «отменить», отправленное на устройство? Как вы можете справиться с этим, не прерывая обслуживание? Другие испытывают это также? Я мог бы справиться с этим, когда пользователь нажал кнопку в приложении для повторной регистрации, но я не хочу этого делать, если только не придется. Также рассмотрели вопрос о сохранении статуса устройств (зарегистрированных, незарегистрированных) на сервере, а затем периодически проверяйте приложение, чтобы узнать, все еще зарегистрировано устройство.
Любая помощь будет оценена!
public class MyC2dmReceiver extends BroadcastReceiver {
private static String KEY = "c2dmPref";
private static String REGISTRATION_KEY = "registrationKey";
SharedPreferences prefs;
private Context context;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
if (intent.getAction().equals(
"com.google.android.c2dm.intent.REGISTRATION")) {
handleRegistration(context, intent);
} else if (intent.getAction().equals(
"com.google.android.c2dm.intent.RECEIVE")) {
handleMessage(context, intent);
}
}
private void handleRegistration(Context context, Intent intent) {
final SharedPreferences sharedPrefs = Util.getSharedPreferences(this.context);
String email = sharedPrefs.getString(Util.ACCOUNT_NAME, "");//
prefs = context.getSharedPreferences(KEY, Context.MODE_PRIVATE);
//String email = prefs.getString("email_for_c2dm", "");//
String registration = intent.getStringExtra("registration_id");
if (intent.getStringExtra("error") != null) {
// Registration failed, should try again later.
Log.d("c2dm", "registration failed");
String error = intent.getStringExtra("error");
if (error == "SERVICE_NOT_AVAILABLE") {
Log.d("c2dm", "SERVICE_NOT_AVAILABLE");
} else if (error == "ACCOUNT_MISSING") {
Log.d("c2dm", "ACCOUNT_MISSING");
} else if (error == "AUTHENTICATION_FAILED") {
Log.d("c2dm", "AUTHENTICATION_FAILED");
} else if (error == "TOO_MANY_REGISTRATIONS") {
Log.d("c2dm", "TOO_MANY_REGISTRATIONS");
} else if (error == "INVALID_SENDER") {
Log.d("c2dm", "INVALID_SENDER");
} else if (error == "PHONE_REGISTRATION_ERROR") {
Log.d("c2dm", "PHONE_REGISTRATION_ERROR");
}
} else if (intent.getStringExtra("unregistered") != null) {
// unregistration done, new messages from the authorized sender will
// be rejected
Log.d("c2dm", "unregistered");
SharedPreferences c2dmPrefs=context.getSharedPreferences(KEY, Context.MODE_PRIVATE);
c2dmPrefs.edit().putString("registrationKey", "");
c2dmPrefs.edit().commit();
//RegisterDevice launches the registration intent to get a new regKey
RegisterDevice register=new RegisterDevice(FirefighterLog.getInstance());
} else if (registration != null) {
Log.d("c2dm", registration);
updateServerRegId(registration)) //sends regID to server and stores
Editor editor = context.getSharedPreferences(KEY,
Context.MODE_PRIVATE).edit();
editor.putString(REGISTRATION_KEY, registration);
editor.commit();
Toast.makeText(context, "Device registered successfully",
Toast.LENGTH_LONG);
}
ПРИМЕЧАНИЕ: updateServerRegId() посылает новый RegID к серверу и переписывает, если он уже существует. Я использую RequestFactory и отправляю его как объект для приложения.
Android Manifest:
<uses-permission android:name="com.xxx.someapp.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.xxx.someapp.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<receiver android:name=".C2DM.MyC2dmReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<!-- Receive the actual message -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.xxx.someapp" />
</intent-filter>
<!-- Receive the registration id -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.xxx.someapp" />
</intent-filter>
</receiver>
Как скоро после первоначальной регистрации происходят эти «нерегистрации»? Часы, дни, недели? – Squonk
Можете ли вы опубликовать свой манифест Android, где определен приемник C2DM? –
@MisterSquonk Время, похоже, меняется, но обычно недели. У меня не было достаточно тестирования, чтобы точно знать. – Patrick