Google Cloud Messaging for Android (Google)
「Google Cloud Messaging (GCM)」は、サーバーから端末にプッシュ通知を送信するための仕組みで、「Cloud to Device Messaging (C2DM)」と呼ばれていた技術の後継、iOS端末の「Apple Push Notification Service (APNS)」に相当する技術です。C2DMの時は実装に苦労したものですが、GCMではAPIが整理されるとともに、アプリ側・サーバー側ともにJavaのライブラリが用意され、非常に簡単に使用できるようになりました。
ただサーバー側のライブラリ(gcm-server.jar)をそのまま使うと、手元の環境では全く問題なく通知されるのですが、Google App Engine Java (GAE/J) にデプロイして通知を送信しようとすると、通知に含まれるマルチバイト文字がことごとく文字化けします。
Servlet特有の文字コード問題や、GAE/J特有のURLフェッチの癖など色々と疑ったのですが、どうもライブラリ自体に潜在的な問題があったようです。
gcm-server.jarは元となるソースコードも配布されているので、その中のSender.java、postメソッドを修正します。
logger.fine("Sending POST to " + url); logger.finest("POST body: " + body); byte[] bytes = body.getBytes(); HttpURLConnection conn = getConnection(url); conn.setDoOutput(true);
こうなっている箇所を
logger.fine("Sending POST to " + url); logger.finest("POST body: " + body); byte[] bytes = body.getBytes("utf-8"); HttpURLConnection conn = getConnection(url); conn.setDoOutput(true);
このように修正します。String#getBytesメソッドに文字コードが指定されていなかったため、環境によって文字化けしていたということですね。この修正を施したライブラリにさしかえてからは、GAE/J上でもマルチバイト文字列が化けずにプッシュ通知が送信できるようになりました。
C2DMが使いづらかった分だけ、GCMは非常に使いやすく感じます。GAE/Jで使用できるということで、色々なことができそうな予感。