2012年8月10日金曜日

GCMの実装でおさえておきたいポイント

前回の記事「Google Cloud Messaging(GCM)とC2DMの主な違いを挙げてみた」を書いていて、覚えておきたいなと思ったポイントがいくつかあったのでメモメモ。


同一メッセージには同一Collapse Keyを指定する

デバイスがオフラインからオンラインへ復帰した時、GCM Serverはストレージされたメッセージをデバイスへ再送する。

たまたま通信状態が悪かったりして、メッセージが届かないと思ったユーザーが、Client Application Serverから同じメッセージを何回もGCM Serverへ送っていたら、同じようなメッセージをいくつもデバイスで受信することになる。

Collapse Keyを同じにしていると、GCM Server側で、全てのメッセージではなく最新のメッセージ1つだけを選んで送る。

Collapse Keyは適当にランダムなどではなく、同一メッセージで統一させた方がいいなあ。


「Device not Registered」エラーが出たら、Client Application ServerからRegistration IDを削除する

デバイス側でGCMを使ったAndroid Applicationが削除された場合、次回メッセージ送信時に「Device not Registered」エラーが出る。

このとき、Client Application Server側で、非有効なRegistration IDをクリーンアップした方がいいなあ。


デバイスのバッテリーを節約するには「delay_while_idle」の指定が効きそう

「delay_while_idle」はC2DM時代からあるパラメータ。デバイスがオンラインでも、unlockされてデバイスの操作が始まらない限りメッセージを送らない、という指定ができる。

メッセージの即時性は無くなるけれど、デバイスが起きているときにだけメッセージが送られるので節電効果があるなあ。

2012年8月9日木曜日

Google Cloud Messaging(GCM)とC2DMの主な違いを挙げてみた

Google I/Oのプレゼン動画から、Google Cloud Messaging(GCM)の特徴やC2DMとの主な違いを挙げてみた。

C2DM時代は・・・
  • 開発者が利用するにはフォームの入力が必要でアクティベーションのメールを受信するという流れ
  • Sender Auth Tokenの取得にClient Loginを使用
  • 一日あたり20万メッセージまでというクオータの制限があった

GCMでは・・・
  • Google APIs Consoleにプロジェクトを追加してGCMを有効にするだけで利用できるようになる
  • 脱Client Login
  • クオータ制限なし

GCMでも変わらないこと
  • 無料のサービス
  • Froyo以上で稼働
  • メッセージ受信にRegistration IDが必要
  • メッセージがデバイスへ届くまでの基本的な流れ(Client Application Server→GCM Server→Android Device)

GCMで変わったこと
  • Project IDが必要
    Sender IDの代わり。Google APIs Consoleでプロジェクトを追加した時に取得。
  • API Keyが必要
    Sender Auth Tokenの代わり。Google APIs Consoleのプロジェクト管理画面で取得。
  • GCM Serverがjson形式のデータにも対応。json形式でリクエストを受け付けたりレスポンスを返したりするようになった。

GCMで追加・改善された機能

1.Message Multicasting
メッセージを複数デバイスへ一斉送信できるようになった。最大1,000台まで。

2.Expiring Messages
メッセージを再送する期間を指定できるようになった。

「time_to_live」パラメータにメッセージが有効な期間を秒単位で設定。0秒から4週間(デフォルト)まで指定可能。0秒の時はGCM Serverにメッセージは保存されずに直ちにデバイスへ送られる。この時デバイスがオフラインだったらメッセージは捨てられる。

指定した値をオーバーした段階でGCM Serverはメッセージをクリーンアップする。

3.Messages with Payload
メッセージにデータを含められるようになった。1メッセージあたり最大4KBまで。主に、チャットなどの簡単なテキスト送信に利用できる。

オフライン時間が長くてメッセージがたくさん溜まってしまっていたら、オンラインへ復帰した時に、GCM Serverは全てのメッセージを削除して「たくさんメッセージが溜まっていますよ」という1メッセージだけをデバイスへ送る。削除されたメッセージ数はGCM Serverからのレスポンスに含まれている。

デバイスがオフライン時にGCM Serverへ保存しておけるのは、最大100メッセージまで。

4.Speed
メッセージ送信がめっちゃ速くなった。GCM Serverへリクエストが届いてからメッセージを送り出すまで4.7ミリ秒。

5.Multiple Senders for Social Updates
1つのAndroid Applicationで複数のプロジェクトのメッセージを受け取れるようになった。自社サービスのメッセージも、Google Plusなどソーシャルサービスなどのメッセージも。ソーシャルサービスのProject IDをどうやって取得するのか、そのフローがよくわからない(´・ω・`)。

最大100個までのProject IDが指定可能。


補足1:GCMの信頼性はいかほど?
Reliable Message Queue(RMQ)の働き

RMQは、GCM Serverとデバイス側のGCM Frameworkとの間で動作するもの。メッセージが確実にデバイスへ届いたのかチェックする。

例えば、GCM Serverがメッセージを送った時、デバイスの接続が切れてしまい、メッセージが届かなかったとしても、接続が復帰してデバイスがGCM Serverへアクセスした際に、メッセージが届いていないことをRMQが探知する。そして、GCM Serverはメッセージを再送する。

ACKを送り合う事で到達の確認をしている。いちいちではなく、ある程度のまとまりでACKを送っている。

このような仕組で信頼性が高いシステムになっているのがGCMの強み。GCMはメッセージを無くさない( ̄^ ̄)


補足2:Android Developer ConsoleでGCM Serverが処理したメッセージの統計が見られるようになった

そのアプリでGCMへ登録された数や、OSバージョンなどの端末情報、メッセージが送られた数やCollapseされた数、GCM Serverからのエラーメッセージなどが見られる。


補足3:ICS以上からGoogle Accountをデバイスへ登録する必要が無くなった

ICS以上から、デバイスへGoogle Accountを事前登録する事無くプッシュサービスが使えるようになったとな。本当かな?こんど検証してみようっと。


おまけ:デバイスからメッセージを送れるようになる?

その機能を含んだAPIはあるけれど開発者向けには公開していない、と。それが出来るようになると、またパラダイムが変わりそう。期待したい。


超おまけ:スピーカーのFrancescoがキュートやわ〜(*^_^*)

Yahoo!の国別メダル獲得ランキングのロジックが気に入らない。Bookmarkletを使ってランキングを変えたった。

Yahoo!のロンドン・オリンピック特集ページにある、国別メダル獲得ランキングのロジックが気に入らない。

まず、
  1. 金メダルでソート
  2. 金メダル数が同じだったら銀メダルでソート
  3. 銀メダル数が同じだったら銅メダル数でソート
というロジック。

つまり、銀メダルや銅メダルを何枚とっても、金メダルが取れなかったら、遥かに低いランクに甘んじなければならない。

確かに、オリンピックで金メダルをとることには世界No.1の重みがある。でも、惜しくも銀メダルや銅メダルだったとしても、ランクにほとんど影響がない程度の価値なのか?

不服だヽ(`Д´)ノ


と思っていたら、同じようなことを考えた方がいたらしく、しかも、Yahoo!のページをソートし直すBookmarkletまで作ってくれていた。

国別メダル数ランキングを俺基準でランク付けし直すJS/Boookmarklet作ったった - UTAGEWORKS

国別メダル獲得ランキングを開き、Bookmarkletとして登録したJSのスクリプトをクリックすれば、自分好みのランキングへ変更できる。


個人的に、もっとシンプルなロジックにしたかったので、金3ポイント、銀2ポイント、銅1ポイントへ変更させてもらった。

Before: 現状のランキング(金ソート→銀ソート→銅ソート)

After1: ランキング変更(金3pt、銀2pt、銅1pt)


メダルがとれただけで素晴らしいじゃないか、みな等しく1ポイントだ、とするとこうなる。

After2: ランキング変更(金1pt、銀1pt、銅1pt)


これで溜飲が下がったよ(^o^)/

2012年8月3日金曜日

Googleアカウントへ接続を許可したアプリを調べる

Googleアカウントへ接続を許可したアプリを調べる方法が、意外に面倒くさいので忘備録としてメモ。

1. 「アカウント設定」をクリック
GoogleのトップページなどGoogle内のサイトへ移動して、画面上のアカウントアイコンをクリックする。続いて、その中の「アカウント設定」をクリックする。


2.「セキュリティ」をクリック
画面左の「セキュリティ」をクリックする。


3.「編集」をクリック
「アプリケーションとサイトを認証する」の右側「編集」をクリックする。


これでようやく、Googleアカウントに許可されたアクセスの一覧が表示される。


アプリ名 ー アクセスが許可されたGoogleのサービス アクセスを取り消すボタン」という順で出力される。

ただし、Androidのアカウントマネージャーでアカウントが管理されている場合は、アプリ名の部分が「Android」とまとめられて、どのアプリで許可したアクセスかがわかりづらくなる・・・。


Twitterでは、連携アプリの一覧の表示の中に、サムネイルや許可した日時、アプリの紹介文などが入っていて視覚的に分かりやすい。


Googleもこのような表示にしてくれればいいのに。