続:C2DMで訳の分からないエラーで苦戦した
C2DMで訳の分からないエラーで苦戦した - ミッションたぶんPossible
一週間程前に上記のようなことを書きましたが、その直後にまたC2DMが使えなくなってしまう、という事象に出くわし、ここしばらくの頭痛のタネでした。
C2DMは以下のような順序でPush通知を実現します。
- http://code.google.com/intl/ja/android/c2dm/signup.htmlでアプリケーション名とサーバサイドから送信用のGoogleアカウント(GMail)を登録する。
- Android端末はアプリ起動時にC2DMサービスに登録ID(registrationId - クライアント認証トークンみたいなもの)を取得しにいく
- Android端末は取得した登録IDを自アプリのサーバサイドに送信する。
- サーバサイドはC2DMにアクセスし、サーバサイド認証トークンを取得する。
- サーバサイドはPush通知を行う際、送信先Android端末認証トークンとサーバサイド認証トークン、メッセージ等をC2DMサーバに送信する
- C2DMサービスはPush通知対象の端末に対し、受け取ったメッセージ等を送信する
今回のケースでは、2 の段階で登録IDが取得できず、しかもなんのエラーも吐かれなかったため、なぜ突然登録IDがとれなくなってしまったのか分からずにいました。
ところが今日になってもう一回http://code.google.com/intl/ja/android/c2dm/signup.htmlでC2DM登録をやり直すとあっさりPush通知を成功させることが出来ました。なんじゃそりゃーーー!!!!
…で、一応原因を考えてみたんですけれど、以下の2つの可能性があるかと思っています。あくまで仮説なので、早とちりしないように。
- C2DMサービスはβ公開中のサービスのため、1回あたりの登録期間に2週間程度の期限がある。今回は期限切れになっただけ。
- 名称が同じ、複数のアプリで同一C2DMアカウントを使用した場合、Googleから不正と見なされC2DMアカウントを失効してしまう
1 については規約を読む限り、該当するような記述が見つけられなかったので、おそらくは特に期限とかは設けてないのではないかと思われます。
となると有力なのは 2 です。実はオレがC2DMが動かなくなったタイミングというのが、スクラッチで組んだPush通知用サンプルアプリから本チャンのとあるFWを併用したアプリに再実装した際でした。FWを使ったことで実装が複雑化し、原因が特定できず、ああでもないこうでもない、と悩んでいました。が、ちょっと横着をして、アプリケーション名が同じなのをいいことにそのままC2DMアカウントを流用していたのです。
おそらくはeclipseプロジェクト単位でC2DMアカウントはユニークである必要があり、それに違反した場合、アカウントを失効させる様に出来ているのでしょう。
なお、こちらもやっぱり規約にそれっぽい記述は見当たらないのですが、そもそもアプリ名を別にすること自体常識中の常識なので、わざわざ書かなかったのかもしれません。
という訳で本日の教訓。
AndroidでPush通知を行う時は、たとえ同じアプリ名でも新しくプロジェクトからアプリを作り直す場合にはC2DMアカウントを再登録しよう!
(できればアプリ名は毎回変えよう!)
ちなみにこの問題が片付かずに納品が遅れました。お客様からも自社からも針のむしろだった訳ですが、結末がこんなんだとショッパイ限りっすねぇ………。
5/11追記
昨日Push通知のデモをやったらまた正常に動かないという事態が。こちらもC2DMの再登録で直りました。今回はプログラム全然いぢってないのに…。もしかしたらC2DMアカウントって1週間くらいしか期限がないのかもしれません。全然そんなこと規約には書いてないのになぁ…。