GCM」タグアーカイブ

【年末年始の自由研究】「札幌地下鉄Push」アプリをAndroid 5.0対応させてみる


Android 5.0開発やAndroid Studio 1.0に慣れる意味で、札幌地下鉄の運休情報をお知らせする「札幌地下鉄Push」アプリをAndroid 5.0対応してみました。

ssp_android5_1ssp_android5_2

Material Design(のお手軽な部分)を実現するべく、画面上部のアクションバーやステータスバー、画面下部のナビゲーションバーに色がつくようにしてみました。色は札幌地下鉄の南北線・東西線・東豊線にちなんだ3色がランダムで変化するようにしてあります(どうでもいいところばかりに力が入っています)

1日足らずの作業ですが、今回のAndroid 5.0対応で引っかかったことをメモしておきます。

・「札幌地下鉄Pushウィジェット」と連携するためにServiceにImplicit Intentを投げているところで異常終了しました。Android 5.0からはServiceに投げるIntentはExplicitでなければいけないようです。このあたりを参考にしてImplicit IntentをExplicitに変換して対応しました。

・通知のアイコン(smallIcon)にフルカラーアイコンを設定していたら、Android 5.0ではステータスバーの通知表示が真っ白になってしまいました。どうやらアルファつき白色アイコンが強制されたようです。アイコンを入れ替えて対応しました。

・Android 5.0の話題ではないのですが、Google Play Servicesを6.5に入れ替えました。Material Designに対応させるためのサポートライブラリを含めて、build.gradleの設定はこんな感じに。Google Play Servicesは分割での導入に対応したため、今回はbaseとadsのみを設定しています。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:21.0.+'
    compile 'com.android.support:appcompat-v7:21.0.+'
    compile 'com.google.android.gms:play-services-base:6.5.+'
    compile 'com.google.android.gms:play-services-ads:6.5.+'
}

2014年最後の話題は開発で締めくくることができました。みなさまよいお年をお迎えください!

Amazonのプッシュ通知サービス「Amazon SNS」をちょっとだけ使ってみた


AWS、iOS・Android・Kindle Fireユーザー向けプッシュ通知機能「Mobile Push」を発表 (ITmedia)
Amazon Simple Notification Service (Amazon)

iOSやAndroidで提供されているいわゆるプッシュ通知サービス。AppleやGoogleのサーバーと通信する機能を直接作りこむ手間を軽減して使いやすくするためのサービスが世の中に複数存在しますが、クラウドサービス「Amazon Web Services」(AWS)を提供しているAmazonもこのジャンルに参戦してきました。「Amazon Simple Notification Service」(Amazon SNS)は、もともとはメールやSMSなどを用いて通知を行うサービスしたが、通知手段の1つとしてiOSやAppleのプッシュ通知が追加された格好です。

今回はAndroidで試してみます。まずAndroidのプッシュ通知であるGCMを実装したサンプルアプリをちゃちゃっと作ります。詳細はこちらで。

Google Cloud Messaging for Android (Google)

プッシュ通知においては、送信先を識別する符号(GCMの場合「Registration ID」)をアプリが取得してサーバー側に引き渡す処理が必要になりますが、今回は試すだけなのでサクッとログに出力させてコピペします。

次にAmazon SNSにアプリの情報を登録していきます。まずアプリを登録します。API Keyは「Google APIs Console」であらかじめ取得しておきます(アプリを作った段階で取得済みのはず)。

image

次に「Endpoint」を登録します。超ざっくり言ってしまえば、1つのRegistration IDが1つのEndpointに対応します。「User Data」は今回は特に何も入れなくても問題ありません。

image

ここまで登録が終われば送信準備完了。登録したEndpointを選択して「Publish」を選択し、文言を入力します。MessageにはプレーンテキストまたはGCMの仕様にのっとったJSON形式の入力を選択できます。プレーンテキストを選択した場合、メッセージ文言はIntentのExtra内に「default」というキーで格納され端末に送信されます。

image

このように端末にプッシュ通知が送信されます。

amazon_sns

細かいところでいうと、端末からアプリを削除した段階でプッシュ通知を送信すると該当Endpointが無効状態になります。Googleサーバーからの返り値をきちんと見ているようです。ただし無効になったEndpointは自動で削除されず、削除するとすると実装側で対応する必要があります。

実用的に使うためにはRegistration IDをいかにしてAmazon SNSに反映させるかがポイントになりそうです。とりあえず直近では開発時のテスト用に便利に使えそう。

より詳細な解説はこちらをどうぞ。

[AWS] Amazon SNS の新機能「Mobile Push」を Android で使ってみた (Developers.IO)

【S-MAX・記事掲載報告】スマートフォンプッシュ通知サービス「PushMaker」


エスパステクノロジーがアプリ提供者には強い味方となる「PushMaker」を「SoftBank World 2012」でデモ【レポート】 (S-MAX)

PushMaker

今回は自分で執筆した記事ではないのですが、自分のところの会社の商品が掲載されたということで紹介させていただきます。iPhoneやAndroidスマートフォンには、アプリがインストールされた端末にサーバーから通知を送り込む「プッシュ通知」という仕組みがあります。先日個人で作ってリリースした「札幌地下鉄Push」もこのプッシュ通知の仕組みを利用していますが、プッシュ通知を実現するためにはアプリだけではなく通知を送り込むサーバー側の作りこみが必要になり、それなりにハードルの高い分野です。

そこでサーバー側の機能をまるっと受け持ちますよというのがこの「PushMaker」というサービス。アプリや通知を管理するためのWeb画面が提供され、文言を入力してボタンを押すだけでプッシュ通知が配信されるようにできます。

この「PushMaker」をソフトバンクグループの展示会「SoftBank World 2012」に展示させていただきました。今後様々な目的で利用されることが期待されます。

【S-MAX・記事掲載報告】アプリ作った「札幌地下鉄Push」


札幌地下鉄の運休情報をあなたのAndroid端末にお知らせ「札幌地下鉄Push」【Androidアプリ】 (S-MAX)
札幌地下鉄Push (Google Play)

久々にプライベートでAndroidアプリを作りました。TwitterFacebookブログで札幌地下鉄の運休情報を配信している延長線上で、運休情報をAndroid端末にプッシュ通知で配信する「札幌地下鉄Push」です。

ssp_001ssp_003

運休情報はTwitterやFacebbok同様「地下鉄運休情報メール配信サービス」のものを用いています。運休が発生すると端末の通知領域に以下のように表示されます。

ssp_notification

GoogleがAndroid向けに従来提供していた「C2DM」と呼ばれるプッシュ通知では、端末1台に対して1回リクエストしなければならず、このような一斉配信的な使い方は苦手だったのですが、新しく提供された「GCM」では、最大1,000台の端末に対して1回のリクエストで同時に配信が可能になり、またサーバー・アプリ向けのライブラリも提供され構築がぐっと楽になりました。

というわけでGCMを使ってなにか作ってみたかったというのがこのアプリを作った動機です。運休が発生した時にしか通知されないので、せいぜい年に数回通知されるかどうかというところですが(そもそも運休は発生しないことが望ましいですよね)、邪魔にはならないのでよろしければお試しください。

【Tips】Google Cloud Messagingのサーバー側JavaライブラリをGoogle App Engine for Javaで使うと日本語が文字化けする事象への対応


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で使用できるということで、色々なことができそうな予感。