ここ数日、ずっと頭を悩ませていた問題が、前に進みました。
現在、C2DMに関する調査を行っていて、とりあえずC2DM経由でHelloくらい出そうぜ!と思って色々とやっていたのですが、出ないと…。何故?と…。
C2DMというのは、Cloud to Device Messageの略で、Android2.2から加わった新しい機能の1つ。クラウド上からDevice(携帯とか)に対してpush型で情報を配信できるのです。アプリによっては、クラウドからのpushを引き金にして、アプリを起動したり、通知したりできるので、色んな可能性のある機能ですね。サンプルアプリとして有名なのは、ChromeのextensionであるChrome2Phoneです。2.2端末持ってる人は試してみてもいいかもですね。
まぁ利用するには色々と制約があるのですが(Android Market必須とか、Googleが承認済みの端末に限られるなど)。
C2DMの説明はまぁこれくらいにして、詳しい実装方法はドキュメントみてくださいと。そういうのも投げなりなので、日本語ドキュメントへのリンクだけ貼っときます(←投げやり)。
http://www.techdoctranslator.com/code-google-com/android-c2dm
簡単な流れとしては、
- C2DMアプリを端末にインストール
- アプリと端末をC2DMサーバに登録する(RegistrationIDの取得)
- RegistrationIDをサードパーティのサーバに保存する(要は自分で準備するサーバ)
- サードバーティのサーバからRegistrationIDと認証トークンとその他の情報を付けてC2DMサーバにPOST
- C2DMサーバがRegistrationIDから端末を見つけてその他の情報をpush
- 端末のレシーバがIntentを受け取って、それを元にやりたい処理する
という感じ。
前半は適当にやりつつもなんとかなったのですが、4番目のサードパーティのサーバ(今回はGAEを採用)からC2DMサーバへのPOSTがうまくいっていませんでした。ちゃんとClientLogin APIを使ってAuthTokenを取得してPOSTしているのにも関わらず、401 Unauthorized を受け取り続けて、原因が全く不明でネットで調べまくっても出てこないし、英語のサイトを読んでいてもなかなか出てこない…。(探し方がヘタなのかもしれないけど)
コードのほうに原因があると思っていたので、そっちばかりを検索していたのですが、原因は違いました。
なんと、C2DMアプリは登録制でした。
C2DMアプリであることを登録しておかないと、サードパーティのサーバからのPOSTをC2DMサーバは受け取ってくれません。コードが原因じゃなかったのかよっ!確かに、Chrome2Phoneのソースを元に、ほぼ同じようなことを書いているにも関わらず、なぜかうまくいかなかったので、「なんかミスしてるんだろう…。俺ってJavaもAndroidも才能がないんだろうな、トホホ…(ToT)」と完全に思ってました。
ちなみに登録制であることを発見したのはここの中盤辺りでした。
Google Group の android-c2dm の No, not 401 again!
C2DMのサインアップはここ→ C2DM SignUp
これってみんな知っていることなんだろうか?
全然知らなかったんだけど…。
登録後は、ソースを全くいじらないでC2DMできるかテストしたら、すんなりと成功しました!!できた時の感激ったらないですね!!(そら10時間以上悩んでいたからな…)
C2DMサーバから401喰らいまくって心折れそうになっている人を助けることができたら幸いです。