2016-05-30 4 views
0

以前はXamarinアプリケーションにGCMメッセージを正常に送信しましたが、何らかの理由で失敗しました。 POST要求はNotRegisteredを返します。次のように私のコードは次のとおりです。GCMメッセージで「NotRegistered」(Xamarin)が返される

Androidのマニフェスト:

<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> 

インスタンス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

私はかなり醜いハックでこれを解決しました。トークン/インスタンスIDの有効期限が切れていたようですので、私はコメントを追加しました:

var instanceID = InstanceID.GetInstance(this); 

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

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

GCMからの応答がNotRegisteredされたとき、私は唯一のインスタンスIDを更新することで、このソリューションを絞り込むことができます。

関連する問題