GCMでプッシュ通知サーバーを実装しています。 Google API Consoleから取得した送信者ID(アプリケーションキー)とGCMサービスから取得した登録IDを使用して、投稿リクエストを送信します。
投稿されたJSONには1つの登録IDが含まれます。私は常に同じ応答を受け取ります:
{
"multicast_id":8546528660791862014,
"success":0,
"failure":1,
"canonical_ids":0,
"results":[
{
"error":"MismatchSenderId"
}
]
}
何が問題なのでしょうか?私は何を間違えていますか?
Stack Overflowの投稿をご覧くださいGCMサーバー側から「MismatchSenderId」を取得する理由は?。
上記のURLから:
sender IDとAPI_KEYを再確認してください。一致する必要があります。一致しない場合、MismatchSenderIdエラーが発生します。 Google APIコンソールで、プロジェクトのURLを確認します。
https://code.google.com/apis/console/#project:xxxxxxxxxxx
xxxxxxxxxはプロジェクトIDであり、送信者IDです。
一部の人々は、「サーバーアプリのキー」タイプのキーを使用して問題を報告していますが、代わりにブラウザキータイプを使用して成功しています。個人的には、サーバーキーの種類は機能しますが、YMMVの両方を試してください。
デバイスからAndroidアプリをアンインストールし、アプリを再実行してください。
これで、新しい登録IDが取得されます。特定のケースでMismatchSenderIdの問題を解決できる場合があります( [〜#〜] api [〜#〜] キーを変更/更新した場合でも、古いキーを使用していると、登録キー)。私の場合、最初にデバイスの登録IDを取得し、次に(Google GCMサーバーで)APIキーを変更してから、MismatchSenderIdエラーを取得しました。最後に、デバイスからAndroidアプリをアンインストールし、問題が解決しました。
Google Cloud Console にログインします
添付の写真の例を参照してください。
「プロジェクトID」ではなく、送信者IDに「プロジェクト番号」(つまり数値ID)を使用する必要があります
tutorial からコードをコピーしていましたが、ソースコードのプロジェクト番号を変更するのを忘れていました。私のチュートリアルではなく、チュートリアル作成者のプロジェクトのIDを生成していたので、Androidアプリでソースコードを変更することを確認してください!
デバイスの登録時に間違ったSenderIDを指定したため、このエラーは確かです。
登録要求のサンプル(フィドラー)
POST https://Android.clients.google.com/c2dm/register HTTP/1.1 Host:Android.clients.google.com Connection:keep-alive Content-Length:83 Authorization:AidLogin 51734556544354357: 9087138434543543508 Content-Type:application/x-www-form-urlencoded User-Agent:Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.36(KHTML、Geckoなど)Chrome/39.0.2171.99 Safari/537.36 Accept-Encoding:gzip 、Accept-Languageの収縮:en-US、en; q = 0.8、ar; q = 0.6、fr; q = 0.4
app = gpYOURAppHereloin&device = 5112132132137117&sender =YourApplicationIDHere
以下の手順でSenderIDを見つけることができます
詳細:
登録IDのソースを確認する必要があります。GCMメッセージポスト内でC2DM登録IDを使用することはできません。 Googleのドキュメントから:
C2DMとGCMは相互運用できません。たとえば、GCMからC2DM登録IDに通知を投稿したり、C2DM登録IDをGCM登録IDとして使用したりすることはできません。サーバー側アプリケーションから、登録IDがC2DMまたはGCMのどちらであるかを追跡し、適切なエンドポイントを使用する必要があります。
C2DMからGCMに移行する場合、サーバーは、指定された登録IDに古いC2DM送信者が含まれているか、新しいGCMプロジェクト番号が含まれているかを認識する必要があります。これが推奨されるアプローチです。新しいアプリバージョン(GCMを使用するバージョン)から登録IDを少し送信します。このビットは、この登録IDがGCM用であることをサーバーに伝えます。余分なビットを取得できない場合は、登録IDをC2DMとしてマークします。有効な登録IDがC2DMとしてマークされなくなると、移行を完了できます。
注意する必要があるもう1つのことは、SENDER_IDです。SENDER_IDの形式は、InstanceIDを使用してRegistrationIDを取得する場合の数値形式です。
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
SENDER_IDはプロジェクト名を使用できませんでした。 https://developers.google.com/mobile/add を使用して、「サーバーAPIキー」と「送信者ID」を取得してください。
APIコンソールからAPIキーを生成します。バックエンドでブラウザアプリキーを使用し、クライアントコードで送信者IDとしてプロジェクトIDを使用します。
私は同じ問題を抱えていましたが、愚かなことをしました:Googleコンソールに複数のプロジェクトがあり、プロジェクトに属するプロジェクト番号の登録IDを生成し、別のApiキーに通知を送信しようとしましたプロジェクト。このエラーの最初のステップは、作業中のプロジェクトを確認することです。
ここにあるGoogleサンプルコードをテストしていたときに、同様の問題があります https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/GcmEndpoints XYZの発言は、この問題の解決に本当に役立ちました。
メッセージは、google app engine API Explorerから、messaging.messagingEndpoint.sendMessageメソッドで携帯電話に送信できましたが、google app engineコンソールログでは、常にMismatchSenderIdと表示されていました。明らかにエラーが想定されていなかったときに、エラーがログに記録されました。
私は本当に混乱していたので、これをどうやって解決したかを以下に示します。
メッセージの送信を再試行してください。今回は、Google App Engineコンソールのログにエラーが記録されることなく動作するはずです。
Sender IDが変更された場合、Google Play Servicesのcom.google.Android.gms.gcm.GoogleCloudMessaging.register()
メソッドは、新しいSender IDに関係なく元の登録IDを返し続けます。以前の古いキャッシュ値を更新して消去するには、Google Play Servicesに対して同じクラスのunregister()メソッドを呼び出す必要があります。
こちらのAPI情報をご覧ください: com.google.Android.gms.gcm.GoogleCloudMessaging.register()
別の方法として、前の回答で述べたように、アプリのデータをいつでも削除するか、アンインストールと再インストールを行うことができますが、これは運用環境では受け入れられないものです。
GCM設定と送信者IDを変更した場合、アプリはGCMへの登録解除と新規登録が必要であることを知っている必要があります。これを実現する簡単な方法の1つは、新しいバージョンをPlayストアにプッシュし、ユーザーに更新をダウンロードさせ、何らかの理由で更新されないアプリをカウントしなくても、最初の実行でこのバージョンを動作させることです。
さらに、プリファレンスまたはデータベースに登録IDを保存している場合、アプリが更新されたときに値を更新することを忘れないでください。更新はIDの再生成を意味し、GCMではなくコードが以前のIDを誤ってキャッシュしているもの。ここで一般的なガイドラインに従ってください: 一般的なクライアント側の実装ガイドライン