2016-05-30 5 views
0

Я успешно отправил сообщения GCM в мое приложение Xamarin раньше, но по какой-то причине они терпят неудачу сейчас. Запрос POST возвращает NotRegistered. Мой код выглядит следующим образом:Сообщение GCM возвращает «NotRegistered» (Xamarin)

Android Manifest:

<application android:label="MyProject"> 
    <receiver android:name="com.google.android.gms.gcm.GcmReceiver" 
     android:exported="true" 
     android:permission="com.google.android.c2dm.permission.SEND"> 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
     <category android:name="com.example.MyProject" /> 
    </intent-filter> 
    </receiver> 
</application> 

Instance ID службы Слушатель:

[Service(Exported = false), IntentFilter(new[] { "com.google.android.gms.iid.InstanceID" })] 
class InstanceIdListenerService : InstanceIDListenerService 
{ 
    public override void OnTokenRefresh() 
    { 
     var intent = new Intent(this, typeof(RegistrationIntentService)); 
     StartService(intent); 
    } 
} 

Регистрация Намерение услуг (это создается в основной деятельности):

static object locker = new object(); 

protected override void OnHandleIntent(Intent intent) 
{ 
    lock (locker) 
    { 
     var instanceID = InstanceID.GetInstance(this); 
     var token = instanceID.GetToken(
      "123456789123", 
      GoogleCloudMessaging.InstanceIdScope, 
      null); 
     SendRegistrationToAppServer(token); // just a HTTP request 
    } 
} 

GCM слушатель службы:

[Service(Exported = false), IntentFilter(new[] { "com.google.android.c2dm.intent.RECEIVE" })] 
class GcmLstnrService : GcmListenerService 
{ 
    public override void OnMessageReceived(string from, Bundle data) 
    { 
     string msg = data.GetString("message"); 
     Log.Info("GcmLstnrService", "From: " + from); 
     Log.Info("GcmLstnrService", "Msg: " + msg); 
    } 
} 

Ответ POST:

{"multicast_id":8322296108700959972, 
"success":0, 
"failure":1, 
"canonical_ids":0, 
"results":[{"error":"NotRegistered"}]} 

Что случилось? Я был бы очень признателен за любую помощь.

+0

У вас есть вызов GcmClient.Register() в любом месте вашего кода? –

+0

Нет, я не хочу, по-видимому, должен? Где я должен добавить это? Разве GcmClient не какой-то плагин? – mkkekkonen

+0

Я дважды проверял и, похоже, зовут Register() - это старый, устаревший способ зарегистрироваться для GCM. Я еще не работал с новым подходом: https://developers.google.com/cloud-messaging/android/legacy-regid –

ответ

3

Я решил это с довольно уродливым взломом. Кажется, что маркер/идентификатор экземпляра истек, поэтому я добавил:

var instanceID = InstanceID.GetInstance(this); 

// update the instance ID 
instanceID.DeleteInstanceID(); 
instanceID = InstanceID.GetInstance(this); 

var token = instanceID.GetToken(
    "123456789123", 
    GoogleCloudMessaging.InstanceIdScope, 
    null); 

Я мог бы уточнить это решение, только обновляя идентификатор экземпляра, когда ответ от ГОГО является NotRegistered.

Смежные вопросы