読者です 読者をやめる 読者になる 読者になる

Pebbleアプリ開発メモ

Pebbleアプリ、Watchface開発のメモを残していきます。

【Pebble】ストア登録用のアニメーションgif画像を簡単に作成する

f:id:shotsep:20150929110345g:plain

ストアでアプリを販売開始する時スクリーンショットを最大5枚まで登録できるのですが、Pebbleではアニメーションgif画像も登録できます。

実際のアプリが動作するフローを見せることができますので、静止画と比べて何倍も訴求効果が期待できます。

これまではFireworksで作っていたのですが、便利なMacアプリがありましたのでご紹介します。

GifGrabber

GifGrabber

  • Fast Hatch Apps
  • ビデオ
  • 無料

これを落としたらキャプチャのサイズを144*168に設定し、ドラッグでPebbleエミュレーターの画面に合わせて「start capture」ボタンをクリックするだけです。

終わったら「stop capture」をクリックし、saveボタンから保存できます。

意外とやってないアプリが多いのですが、得はしても損することはないので是非。

【Pebble】Cloud PebbleでPebble Time Round用アプリの開発/デバッグ

f:id:shotsep:20150929173150p:plain

Cloud Pebbleの現在のバージョンではターゲットにChalk(Pebble Time Round用)が含まれていません。

beta版のCloudPebbleにアクセスすることで開発が可能になります。

https://beta.cloudpebble.net/ide/

ドキュメントやサンプルは以下から。

developer.getpebble.com

【Pebble】Currency Converterをリリースしました。

f:id:shotsep:20150928211413p:plain

http://apps.getpebble.com/en_US/application/560914f0364a06a88100004d

良さ気なUIのが無かったので作ってみました。

NumberWindowを使うとパパっと出来そうだったのですが、一つのWindowに複数使っているサンプルがなかったのでTextLayerを使って自作しました。

このあたりはまた別の記事で。

API側をJavascriptで書けるのは本当に楽ですね。デザインも出来ること限られてるのが逆にいいんだけど、AppleWatchみたいなキツすぎる制限も無いし、本当作ってて楽しいです。

【Pebble】郵便番号検索をリリースしました。

f:id:shotsep:20150926113500p:plain
http://apps.getpebble.com/en_US/application/5604ff2e2c4b3ca81100002c

まだストアになかったのでパパっと作って出しました。

アプリを起動すると現在地から近い町名いくつかと郵便番号を表示します。

こういうど忘れしがちなものを時計で表示できるのはいいですね。

PebbleKit JSからCに値渡す時Dictionaryや配列を渡せないのでコンマ区切りにしてsplitしようと思ったのですが、どうしてもstrtokが落ちるので一個ずつkey書きました。

あまりにもエレガントじゃないので直してまた記事書きます。

【Pebble】バッテリーの情報を取得する(常時/1度だけ)

バッテリーの情報を取得するサンプルです。

常時モニターしたい時
static void handle_battery(BatteryChargeState charge_state) {

  if (charge_state.is_charging) {
    // charging
  } else {
    // not charging
  }

  APP_LOG(APP_LOG_LEVEL_DEBUG, "%d%% remains", charge_state.charge_percent);
}

static void window_load(Window *window) {
    battery_state_service_subscribe(handle_battery);
}
任意のタイミングで一度だけ取得したい時
    // check battery
    static char s_battery_buffer[16];

    BatteryChargeState charge_state = battery_state_service_peek();
    if (charge_state.is_charging) {

    } else {

    }
    APP_LOG(APP_LOG_LEVEL_DEBUG,  "%d%% remains", charge_state.charge_percent);

AppMessageにパラメーターを付与して実行

AppMessageにパラメーターを付与して実行したかったのですがちょっとハマったのでメモ。

呼び出し
    // Begin dictionary
    DictionaryIterator *iter;
    app_message_outbox_begin(&iter);

    // Add a key-value pair
    dict_write_uint8(iter, 10, 100); // key:10, value:100

    // Send the message!
    app_message_outbox_send();
受け取り
Pebble.addEventListener('appmessage',
                        function(e) {
                          console.log("value : " + e.payload[10]); // ok
                          console.log("value : " + e.payload["10"]); //ok
                        }                     
                       );

但し、SettingのPebbleKit JS Message Key欄に該当のキーを
指定済みの場合は上のように書いてもundefinedが返ります。

Pebble.addEventListener('appmessage',
                        function(e) {
                          console.log("value : " + e.payload["KEY_SOMEKEY_SET_IN_SETTING"]);
                        }                     
                       );

このようにして取り出します。

【Pebble】ジェスチャー(振られたこと)を感知する

f:id:shotsep:20150923140338g:plain

http://apps.getpebble.com/en_US/application/55f22f9c5521a8c25e000038

現在リリースしているWatchface「Most Visible Analog」は一定時間ごとに現在の時間/直近12時間程度のサマリーを切り替えて表示しています。

また、サマリーに関しては文字数が多いためHTMLでいうところのマーキーのような表示方法を採用しています。

そのせいか電池の持ちが悪い為、切り替えを一定時間毎ではなく時計が振られた時に行うような実装にしてみました。

※電池持ちを確認してからストアにリリースします。

実行結果

f:id:shotsep:20150923214738p:plain

予想はしていましたが、やっぱりセンサーアクティブにしてたら電池が鬼のように減りますね。

違う方法で電池持ち改善できないか考えてみます。


static void handle_accel(AccelData *accel_data, uint32_t num_samples) {
  // do nothing
}

static void timer_callback() {

  AccelData accel = {false, 0, 0, 0, 0};
  accel_service_peek(&accel);
  layer_mark_dirty(window_get_root_layer(window));
  
  //APP_LOG(APP_LOG_LEVEL_DEBUG, "x:%d y:%d z:%d", accel.x, accel.y, accel.z);
  if(abs(accel.x) + abs(accel.y) + abs(accel.z) > 3100) {
    APP_LOG(APP_LOG_LEVEL_DEBUG, "shaken");
  } 
}

static void someMethod() {
    accel_data_service_subscribe(0, handle_accel);
    app_timer_register(timer_frequency, timer_callback, NULL);
}

3100のところを変えると感度の設定が出来ます。