Статьи

Мой эксперимент на выходных: PebbleJS

По всей видимости, все ожидают анонс iWatch через несколько недель, и носители будут «вещью» в течение следующих нескольких лет. Но я уже некоторое время качал Pebble, и я действительно копаю его. Это не так сексуально, как у некоторых новых умных часов, и кто знает, как они будут сравниваться с тем, что делает Apple, но это доступно (достаточно доступно) и просто. Если вы планируете приобрести умные часы, обязательно проверьте их.

С момента его выпуска был выпущен SDK для устройства, позволяющий разработчикам создавать циферблаты и приложения с помощью C. Вы можете узнать больше об этом на их сайте руководства разработчика . Недавно был выпущен альтернативный способ разработки для Pebble — PebbleJS . Как вы можете себе представить, это позволяет использовать JavaScript для создания приложений Pebble. Я думал, что возьму это на спин в эти выходные.

По большей части, это работает довольно легко, особенно если вы используете их сервис CloudPebble . (Почему, ну почему все должно быть чем-то «облачным» …) Я не большой поклонник IDE на основе браузера, но их редактор работал достаточно прилично. В редактор встроен JSHint, поэтому вы получаете в реальном времени синтаксис и предупреждения о лучших практиках.

Отправка приложения на часы также довольно проста. Не забудьте включить подключение разработчика через мобильное приложение. Одна вещь, которая сбила меня с толку, это то, что CloudPebble узнал мое устройство. Он знал о моем исходном соединении через приложение для iPhone, но не знал, что я переключился на использование Android в качестве основного телефона. Если вы перейдете на страницу компиляции CloudPebble, вы можете ввести IP-адрес телефона:

Но я не был уверен, как получить мой IP. Я собирался попасть на одну из тех веб-страниц «какой у меня IP», когда снова проверил мобильное приложение. На панели разработчика был мой IP:

Другая проблема, с которой я столкнулся, была случайная ошибка передачи. Казалось, что это ухудшалось, когда я работал над своим проектом, и это могло быть связано с тем, что мое приложение было выбрано в приложении Pebble на моем устройстве. Переключение на другое приложение, затем запуск моей компиляции, казалось, помогло, но я так и не смог понять, что именно привело к сбою процесса. Это просто немного замедлило меня.

Один интересный аспект заключается в том, что вы можете просматривать сообщения console.log непосредственно с веб-сайта. Это становилось все более и более полезным, когда я прошел мимо начального приложения и действительно начал что-то кодировать.

Для своего проекта я думал, что создам версию Часов смерти. Я полагал, что это все равно имеет смысл на часах. Именно здесь я столкнулся с самой большой проблемой с PebbleJS — setTimeout и setInterval не приветствуются. Теперь — может быть, я сумасшедший — но я не могу представить, что вы могли бы построить на Pebble, что было бы полезно без какой-либо обработки на основе интервалов. Я полагаю, вы могли бы создать приложение, но любой тип циферблата или игры просто не имеет смысла. Для этого есть веская причина. Из руководства по JavaScript :


Код JavaScript является частью приложения Pebble и входит в ваш файл pbw. Телефон извлекает и устанавливает этот код при установке приложения в Pebble.

Ваш JavaScript выполняется в песочнице внутри мобильного приложения Pebble.

Ваш JavaScript запускается по запросу из приложения Pebble. Он будет убит, когда пользователь выйдет из вашего приложения.

Мобильное приложение Pebble будет пытаться поддерживать ваше приложение работающим, пока ваше приложение Pebble работает. Однако при определенных обстоятельствах телефон может убить приложение Pebble и ваше приложение. В этом случае мобильное приложение Pebble будет автоматически перезапущено.

Так что, да, он запускается из мобильного приложения, а не с устройства. Это также имеет еще одну огромную проблему. Поскольку приложение запускается из мобильного приложения, любой пользователь, использующий iOS для Pebble, не сможет загрузить ваше приложение, пока компания не отправит свое приложение в Apple. Думаю, это не их вина, но, честно говоря, мне достаточно не рекомендовать использовать эту библиотеку. Чтобы было ясно, я думаю, что разработка для Pebble, вероятно, стоит вашего времени, но я не думаю, что могу предложить использовать их решение JS. Возможно для прототипирования, но не более того.

Несмотря на то, что setInterval был обескуражен, я решил, почему бы не пойти дальше и все равно его собрать:

Вы можете скачать его прямо сейчас, если вы работаете на Android, а также на iOS до десяти дней. К сожалению, нет общедоступного веб-интерфейса для библиотеки приложений Pebble. Это ошибка Надеюсь, это будет исправлено в будущем. Другие люди создали свои собственные библиотеки — в основном собирая те же данные, которые использует мобильное приложение. Я использовал это — http://pas.cpfx.ca/ .

И да — это выглядит отстойно, но это моя вина, а не Пеббл. Я набрал маркетинговые активы примерно за 2 минуты. Если вам интересно, вот как выглядит код. И снова, я написал это довольно быстро, и это не демонстрирует все различные аспекты того, что вы можете сделать.

/**
 * Welcome to Pebble.js!
 *
 * This is where you write your app.
 */

var UI = require('ui');
var Vector2 = require('vector2');
var Settings = require('settings');

var timeLeft = 2022491029;
var hb;

var wind = new UI.Window();
var textfield = new UI.Text({
    position: new Vector2(0, 50),
    size: new Vector2(144, 30),
    font: 'gothic-24-bold',
    text: 'Time to Live:\n'+String(timeLeft),
    textAlign: 'center'
  });
  wind.add(textfield);

var splash = new UI.Card({
  title: 'Death Clock',
  body: ""
});
splash.show();

function decrCounter() {
  timeLeft--;
  if(timeLeft > 0) {
    textfield.text('Time to Live:\n'+String(timeLeft));
  } else {
    textfield.text("Time is up!");
    clearInterval(hb);
  }
}

setTimeout(function() {
  
  splash.hide();
  wind.show();
  var birthDayStr = localStorage["birthday"];
  if(birthDayStr) {
    console.log("got from local storage");
    var bdParts = birthDayStr.split("/"); 
    var bDate = new Date(bdParts[0], bdParts[1], bdParts[2]);
    console.log('using bdate of '+bDate);
    timeLeft = calculateTimeToDie(bDate);
  }
  hb = setInterval(decrCounter, 1000);
  
}, 2000);

Pebble.addEventListener("showConfiguration", function() {
  console.log("showing configuration");
  Pebble.openURL('http://static.raymondcamden.com/deathclockform.html');
});

Pebble.addEventListener("webviewclosed", function(e) {
  console.log("configuration closed");
  //http://forums.getpebble.com/discussion/15172/pebblejs-cloudpebble-unexpected-token-c-at-object-parse-json-error
  if(e.response !="CANCELLED") {
      var options = JSON.parse(decodeURIComponent(e.response));
      console.log(options.day);
      console.log("Options = " + JSON.stringify(options));
      var dayToSave = options.year + "/" + options.month + "/" + options.day;
      localStorage["birthday"] = dayToSave;
      var bDate = new Date(options.year, options.month, options.day);
      console.log('going to test for '+bDate);
      timeLeft = calculateTimeToDie(bDate);
  }
});

//Given a date, return # of seconds left to live
function calculateTimeToDie(born) {
  var now = new Date();
  var timeAlive = Math.floor((now.getTime() - born.getTime())/1000);
  console.log('time alive is '+timeAlive);
  // 75 years
  var avgTime = 2365200000;
  var timeLeft = avgTime - timeAlive;
  return timeLeft;
}        

Опять же — я не уверен, что могу порекомендовать людям использовать PebbleJS для своих «производственных» приложений, но это был интересный эксперимент и довольно круто увидеть, что что-то появляется на моих часах так быстро.

Еще одно быстрое замечание — могу сказать, что меня впечатлили форумы разработчиков в Pebble. Даже в субботу я получил довольно быстрые ответы на свои вопросы.

Редактировать 25 августа: Что касается моей заметки о том, как PebbleJS потребовал от вас ждать повторной отправки в App Store, похоже, я ошибся. Несколько часов назад Джонатан Старк поделился этим со мной:

Итак … если подумать — может быть, мое резюме «Круто, но не рекомендуется» нужно изменить на «Круто и … возможно!» Это немного странно, но я более открыт для возможности сделать больше с этим сейчас.