暑くなって耐えかねたのでPebbleアプリ開発3日目で外出先からの操作に対応した。前回までのバージョンからはIRKitのDevice HTTP APIからInternet HTTP APIに切り替えただけ。
http://getirkit.com/ にある説明の通りに clientkey
と deviceid
を取得した。スマホのネイティブアプリ内で動いているからCross-Originの制約にも引っかからないし、エスケープする必要なさそうなデータなので単純にXHRでPOSTするだけでうまくいった。ほとんどタイムラグもなくIRKitに届いているようだ。
var irkit = {
internetHttpApi: 'https://api.getirkit.com',
clientKey: '',
deviceId: ''
};
var xhr = new XMLHttpRequest();
xhr.open('POST', irkit.internetHttpApi + '/1/messages', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('clientkey=' + irkit.clientKey + '&deviceid=' + irkit.deviceId + '&message=' + message);
一つ問題があって ++_JS_LIFECYCLE_++:KILLED
みたいなログがでてJS側のプロセスが死んでしまうことがある。作ったアプリにバグがあるのか、プロセス管理で殺されることがあるのか、Javascript側のライフタイムについてちゃんと調べていないので調査と対応が必要かも。
JS側が死んでる場合はPebbleでボタンを押しても何も起きないので、JS側でXHRのPOSTが成功したらそこからPebbleにメッセージを飛ばしてPebbleをブルっとさせるようにした。これで送ったつもりが送れていないという問題を回避する。とりあえずJS側が死んでるときはPebble側のアプリを起動しなおせば良さげ。
まぁ普段はPebbleでは時計を表示して、使う時だけwatchappを起動するような形になるから今のデバッグ中にwatchappを起動しっぱなしにしている方がイレギュラーなのかも。
これで今日は帰宅前にPebbleからエアコンを付けて帰ってちゃんと付いてた。Pebbleたっのしぃ(・∀・)
自分用にはこれで満足しているけど、clientkey
と deviceid
や赤外線コマンドはJS側にハードコーディングしているのでちゃんとアプリにするには設定画面に逃さないといけない。htmlで作った設定画面をJavascrypt Frameworkで表示して値をPebbleに送ったりとかできるらしいので次回はそれを調べる予定。しかし俺はもう今のバージョンで満足してしまっている。