「android アプリのガチ開 発者が mobile backend starter を使ってみた」
DESCRIPTION
TRANSCRIPT
「Android アプリのガチ開発者が Mobile Backend Starter を使ってみた」
あんざいゆき(@yanzm)
• blog : Y.A.M の雑記帳• y-anz-m.blogspot.com
• twitter : @yanzm (やんざむ)• Android女子部副部長• uPhyca Inc. (株式会社ウフィカ)
あんざいゆき
Mobile Backend Starter とは
Google Cloud Platform を使った Android 用のバックエンドをサーバー側のコードを書かずに構築できるサービス
Mobile Backend Starter とは
• サーバ側のコードを書かなくていい• Google App Engine を使っているのでスケーラビリティが高い
• 認証機能が組み込まれている• Google Cloud Messaging(GCM)機能が組み込まれている
• 継続クエリ
Mobile Backend Starter とは
• Deploy → App Engine に Mobile Backend がデプロイされる• http://mobile-**********.[Project ID].appspot.com = 設定• https://github.com/GoogleCloudPlatform/solutions-mobile-backend-starter-java
Google Cloud ConsoleDeploy
設定
Android 用のライブラリ兼サンプルアプリ
デモ
MBSの使い道
Android アプリ開発者にとっての MBS
• 簡単なのはわかった• 使い道は?• Google Cloud Messaging• データ永続化(?)• クラッシュログ収集• センサーデータ収集
Google Cloud Messaging とは
• Android デバイスに push 通知を送れる機能• GCMと略す• 小さいデータを送ることができる• サードパーティのサーバーが必要
Google Play サーバー
アプリ
device
Google Play アプリ
サードパーティサーバー
push
GCM の使い道
•同期のトリガー(GCM を受取ったらサーバーに新しいデータを取りに行く)
•チャット・SNS•お知らせ(配信)機能•アプリ状態の同期•位置情報の共有...
データの永続化
• オフライン対応必須 = デバイスの DB にもデータ保存
• BackupAgent というバックアップ機能が Android にすでにある
• 同期処理がめんどい(コンフリクトしたら...)• ゲストブック的なものでオフライン対応を捨てるならあり(?)
クラッシュログの収集
• すでにリリーズ済みのアプリに MBS を組み込む場合に一番ありうる
• Google Play にもクラッシュログ収集の機能があるが、ユーザーが送信ボタンを押さないといけない
• Google Analytics はクラッシュログは収集してくれない
センサーデータの収集
• ライフログ的な使い方• 多くのデバイスからデータを集めるような場合に向いている
• 定期的にスマホで写真とってアップするなど
アプリ内課金の検証に使えるか?
• サーバーに詳しくない個人アプリ開発者はけっこう困ってると思う(セキュリティ対策はコスパだからね)
• アプリの公開鍵をサーバー側に持たせる必要がある = サーバー側のコードをいじらないと無理
• クライアント・サーバー間でセキュアなハンドシェイクが必要
ゲームに使えるか?
• サーバー側のコードを変えられないので不可能• ユーザーデータの保持には Google Play Services のゲーム用機能が利用できる
• ゲーム系は悪意のあるユーザーを考慮しないといけないので難しい
MBS の使い道まとめ
• GCMによる通知•ログ収集•データ収集•ユーザー間のデータ共有(位置データなど)
MBS の Android Client Library
Android アプリ用の SDK やライブラリを作るときに押さえておきたいこと
サンプルアプリは必要?
•ぜひ作りましょう!•でもサンプルアプリとライブラリがバンドルしているのはよくない
サンプルアプリは必要?
• Android に依存しない部分 → jar• Android に依存する部分 → Library Project• http://developer.android.com/tools/projects/projects-eclipse.html
• サンプルアプリは jar や Library Project を利用する
ライブラリ作成時の注意点
• bin/ gen/ はリポジトリや zip に入れない• github が生成してくれる .gitignore には bin/ gen/ が含まれている
• Build path の設定に注意• リソース(Library Project)の扱いに注意• 画面回転に注意(ライブラリでメモリリークとかつらい!)
Build path の設定に注意
• project のインポート時に endpoint-libs が build path として認識されないことがある
• project 直下の src 以外にコードがあるとめんどいかも
[Java Build Path] の [Source] にendpoint-libs/libmobilebackend-v1/mobilebackend/mobilebackend-v1-generated-source を追加
Library Project とは
• 別のプロジェクトをそのままライブラリとして利用できる機能
• Library Project とアプリケーションで同じリソースIDのものがあるとどちらかが無視されるので、ライブラリ側はパッケージ名などで prefix をつける
• Action Bar Sherlock などが Library Project 形式のライブラリとして有名
Library Project とは
アプリ
library Project
jar Activity
Service
Receiverres
MBS の Android Client Library を改造してみた
サンプルアプリ
Library Project
GCMの register がうまく動かない...
GCM の register をしないようにしたら動いた
com.google.android.gcm は deprecated
• GCM は Google I/O 2013 で発表された Google Play Services に含まれるようになった
×
○
public class GCMReceiver extends BroadcastReceiver {
private final static String GCM_KEY_SUBID = "subId"; private final static String GCM_TYPEID_QUERY = "query";
public static String getRegistrationId(Context context) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
String registrationId = null; try { registrationId = gcm.register(Consts.PROJECT_NUMBER); } catch (IOException e) { e.printStackTrace(); } return registrationId; }
@Override public void onReceive(Context context, Intent intent) { // decode subId in the message String subId = intent.getStringExtra(GCM_KEY_SUBID); Log.i(Consts.TAG, "onMessage: subId: " + subId); String[] tokens = subId.split(":"); String typeId = tokens[1];
// dispatch message if (GCM_TYPEID_QUERY.equals(typeId)) { CloudBackendAsync.handleQueryMessage(tokens[2]); } }}
<application android:allowBackup="false" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > ...
<receiver android:name="com.google.cloud.backend.android.GCMReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.example.mbssample.permission.C2D_MESSAGE" /> <category android:name="com.example.mbssample" /> </intent-filter> </receiver> </application>
GCM 動いた (*´ω`*)
まとめ
• サーバー側を書かずに GCM 使えるのは便利• 1分しないくらいで push が来る(10秒とか速い)
• 認証機能が組み込まれているのもありがたい
MBS へのお願い
• 簡単に GAE に移行したい = サーバー側のコードも少しいじりたい
• 画像アップロードのサンプルがほしい• Android 2.x でも使いたいなー(今は API Level 16以上)
• ぜひ Library Project にしてください• Google Play Services の GCM 使ってね
その他
• API とか GAE コンソールとか API Key とかが全部 Google Cloud Console から行けるようにまとまったのはとてもいい
• developers.google.com/cloud/ 以下のコンテンツが Google Cloud Console に対応してないのが残念!Google の人がんばって!
ありがとうございました