Введение

Наконец-то у меня появилось свободное время чтобы написать что-то хорошее-доброе-вечное.

В этот раз продолжим разговор о том, как обычному неамериканскому человеку пробраться на рынок мобильных приложений, а в частности, я расскажу о том, как мне удалось зарегистрироватьсяи получитьь возможность размещать платные приложения для Palm WebOS в Palm App Catalog.

Начало

А началось все давно, а точнее в начале прошлого года, когда Palm анонсировали выход устройств с Palm WebOS на борту, а также программу, по которой разработчики могли получить доступ к ранним версиям Palm Mojo SDK, с помощью которого и ведется разработка приложений для этой мобильной платформой.
Выглядело это все довольно красиво и радужно, особенно в свете того, что т.к. эта платформа новая, то возможностей быть первым и написать приложение, которое в будущем станет популярным, были почти безграничными.

После анонса Palm Mojo SDK Early Access Program я сразу же подал заявку на участие, но при регистрации товарищи из Palm открыто заявляли что да, регистрация доступна для всех, но фактически доступ получат только те, кого Palm посчитает достойным. Какими там критериями они руководствовались, непонятно, но официальный доступ к SDK мне удалось получить только через 4 месяца. Все эти 4 месяца (а на самом деле еще меньше, т.к. SDK долгое время было недоступно для свободной загрузки) приходилось довольствоваться пиратскими/неофициальными версиями, которые иногда, с задержкой, появлялись на торрентах.

На самом деле сейчас подобная история происходит с Samsung Bada. Доступ на сайт разработчикам открыт, но скачать SDK нельзя, для этого надо чтобы ваша компания стала партнером Samsung, а для этого они просят слишком много лишней информации, что несказанно бесит.

И вот нконец-то чудо произошло и Palm прислали мне инвайт, как раз где-то в это же время вышли первые главы книги (здесь и здесь) о разработке для WebOS и уже можно было как-то понять, что же с этим чудом делать.

Оно даже работает

Да, именно так, “оно даже работает” – это как раз та мысль, которая пришла мне в голову после того, как я впервые установил себе WebOS SDK. Да, на Vista были проблемы с тем, что ранние версии что-то пытались писать в Program Files, а этого делать нельзя, но при наличии прямых рук, растущих из нужного места, все эти проблемы решались довольно просто. И таки-да, SDK заработало почти с первого раза.

Язык разработки – JavaScript. Я его никогда не знал, да и желания учить как-то до этого не было (всю жизнь писал под десктоп на C++ и под всякое тоже на C++, до интерпретируемых языков все руки не доходили). Но ведь новые горизонты, возможность хорошо заработать, слава, мировое господство…. Эх… Чего только не сделаешь ради мирового господства… И я сделал. Я сел учить JavaScript.

Всегда придерживался такого правила что если хочешь чему-то научиться, научи этому других. Таким вот образом начали появляться туториалы по разработке для Palm WebOS. Первые две недели я задался целью выпускать по одному туториалу в день. Садился, разбирался с проблемой, делал пример, потом описывал впечатления. Из этой затеи получилось это, это, это и еще несколько здесь.

После седьмого дня подготовки туториалов, почувствовал в себе силы делать что-то полезное. Нашел человека, который хотел мобильное приложение для WebOS и написал первое коммерческое приложение – клиент для обмена файлами посредством SMS для сервиса SMSMyFile. На разработку первой версии первого приложения для WebOS  у меня ушло 15 часов. Сейчас это приложение доступно в Palm App Catalog, распространяется бесплатно, хотя разработка стоила денег.

Я ненавижу тебя, Palm… и люблю

Дальше были попытки запостить приложение в Palm App Catalog. Для площадки по продаже мобильных приложений у Palm была такая же политика, как и с SDK. Вы пишете им письмо, в письме посылаете скомпилированный пакет с приложением, они рассматривают возможность публикации и затем публикуют. Называлось это все eCommerce Beta Program. Сейчас страница с описанием этой программы на официальном сайте выдает 404ю ошибку, поэтому ссылку не даю.

На вид все просто и я очень рассчитывал, что это будет еще и быстро. Palm ведь маленькая компания, где-то слышал, что в в ней работали на то время всего 300 человек (может это и не соответствует действительности, но все равно, компания явно меньше чем MS), к тому же доля на рынке мобильных устройств у них не такая большая, поэтому мне казалось что за каждого довольного клиента или разработчика они должны (могут, должны, как-то так…) держаться обеими руками.

И вот, я пишу письмо, прикладываю к нему описание приложения и дистрибутив и… ничего. Тишина. Ради спортивного интереса отослал письмо с уведомлении о прочтении. Через две недели получил уведомление что таки-да, мое письмо прочитали. И снова тишина. Уже думал что все, потеряли мое приложение или забыли, и через !(внимание) полтора месяца получаю еще одно уведомление что… письмо у кого-то из Palm было удалено без прочтения. После этого я обиделся. К слову сказать, я не один такой был, который обиделся. Многие люди тоже ненавидят Palm из-за их политики общения с разработчиками. Затем было долгое затишье, когда, разработав свое приолжение, я не могу хотя бы как-то отдать его пользователям. Пытаться распространять приложение для Palm WebOS собственными силами – относительно глупая затея. Ну, разве что, если у вас есть сервис, который уже приносит миллионные прибыли и какую-то часть из этих денег вы можете потратить на раскрутку своей программы (но тогда напрашивается вопрос, а почему вы еще не в App Catalog’e :)).

За это время я успел почитать всякой полезной документации, например UI Design Guidelines, Application Submission Checklist, знание которых потом неоднократно помогло мне в будущем.

А потом… Регистрация в Palm App Catalog стала публичной. Это не могло не радовать, но вместе с радостью пришли и другие проблемы.

Основной проблемой, как ни странно, стали… деньги. Много денег. Почему-то Palm помимо неповоротливости оказались еще и жадными. Участие в Palm Developer Program стало возможным в трех вариантах:

  • Вы регистрируетесь как open-source разработчик и постите все приложения как бесплатные и с открытими исходниками. За это не платите ничего
  • Вы регистрируетесь, платите $99  в год, а затем !(внимание), получаете ссылку на загрузку своего приложения и распространяете его сами как хотите. Palm всего лишь упоминает ваше приложение в RSS фидах и, собственно, хостит ваш бинарник у себя. Остальное все за вами.
  • Вы регистрируетесь, платите $99 за регистрацию и $50 за каждое приложение, которое попадает в Palm App Catalog. Итого, $150 вы отдаете сразу и неизвестно, будут ли ваше приложение вобще скачивать. В общем, на вид очень опасно, так мне показалось тогда и так же кажется сейчас.

А еще Palm отбирает у вас 30%  с каждой продажи 😉

На самом деле, зарегистрироваться на сайте и скачать SDK (скачать можно официально только после регистрации), можно и бесплатно, но если вы решили распространять свои приложения, то надо проапгрейдить свой аккаунт до статуса разработчика и, все же, выбрать один из трех вариантов. Я решился в конце декабря. К тому времени у меня уже была готова Android-версия SMSMyFile, которая начала продаваться в Android Market и первую прибыль с продаж я решил потратить на регистрацию в Palm App Catalog.

Дело близилось к новому году и когда я решил зарегистрироваться, то с меня взяли не $99 а всего $5 за первый год участия в программе и с последующим продлением за $99. Не знаю, доступна ли эта скидка до сих пор, пробовать второй раз не буду 🙂

Отдать деньги – дело нехитрое, но после регистрации, для того чтобы иметь возможность запостить приложение, необходимо было ввести уйму личных данных, включая адрес и PayPal аккаунт.

С PayPal аккаунтом у меня как-то сразу не сложилось. Украины в списке стран в настройках аккаунта не было. Пришлось писать в службу поддержки, от которой ждал ответа две недели. Посоветовали вписать американский адрес и поиспользовать американский PayPal (вобще забавно, представители солидной компании советуют такие не совсем честные махинации). Ну, опыт у меня с этим есть. Вбиваем в качестве адреса адрес банка, выдавшего карту Payoneer, затем указываем американский PayPal.

А дальше? PROFIT? Да щаз! Это только начало…. до профита еще очень и очень долго.

Но тем не менее, этого было достаточно чтобы запостить бесплатное приложение.

Для того чтобы постить платные приложения, надо обязательно указывать американский код налогоплательщика (адрес-то в учетке американский) – ITIN (Individual Taxpayer Identification Number) или EIN (Employer Identification Number), которого у меня, по понятным причинам, отродясь не было.

Но, в Internet есть все. И я нашел компанию, которая предлагала зарегистрировать ITIN/EIN за 100 зеленых американских президентов. Денег заплатил, циферку выслали через 4 дня. Циферка вроде рабочая, указал ее в Google Checkout, Palm App Catalog, Intel AppUp. Документы, подтверждающие действительность этой циферки, обещали прислать в течении 4 недель с момента получения. На данный момент прошло больше 4х недель, а документов еще нет, поэтому ссылку на сайт, предлагающий эту услугу давать не буду до выяснения обстоятельств.

Пока регистрировали EIN, нашел на Хабре информацию о системе AdMob, которая позволяет размещать рекламу в мобильных приложениях. Решил вставить AdMob в SMSMyFile. Для этих целей есть нормальное рабочее SDK для WebOS, заводится с пол-пинка. Подробнее о процессе интегрирования, думаю, расскажу отдельным постом.

Но, судя по статистике за месяц, денег там нет, по крайней мере на WebOS. На данный момент у SMSMyFile около 10000 загрузок, а приносит пользы это несколько десятков центов в день. В приложениях для iPhone от AdMob намного больше толку, но об этом как-то потом расскажу.

Процесс сабмита приложения в Palm App Catalog довольно муторный, требуют кучу разной информации. Если вы указали, что хотите распространять приложение, например, в Германии, то будьте добры, укажите все тексты на немецком, всю локализацию сделайте на немецком. Английский вариант не прокатывает. После того, как вы указали всю информацию, будет еще ревью в Palm перед публикацией.

Но есть несколько моментов, которые я бы назвал положительными:

  • У вас есть уверенность в результате. Если вы постите приложение, то вы можете быть уверены что ревью все-таки будет, а также есть вероятность, стремящаяся к единице, того, что ревью будет выполнено в заявленный срок
  • Если в процессе ревью будут обнаружены несоответствия с UI Guidelines, то вы получите список несоответствий (говорят что в Windows Marketplace for Mobile каждая попытка сабмита стоит $100 и говорят только одну причину отказа, даже если их было несколько. На самом деле, статья со сравнением маркетов меня очень тронула. От Marketplace for Mobile я просто в шоке и уже боюсь туда постить).

Вдоволь наигравшись с бесплатной версией, решил попробовать, как это работает с платными приложениями.

В качестве платного приложения решил сделать программку, которая сохраняет Web-странички в виде PDF файлов. Работы на это ушло 14 часов. Программка дергает один довольно популярный сервис, который отдает PDF  по GET-запросу, так что, по сути, работа сводилась только к UI.

На этом месте, думаю, стоит заметить вот какую штуку:

  • У меня платный аккаунт в Palm App Catalog
  • У меня в Palm App Catalog уже есть бесплатное приложение
  • Если я пробую запостить еще одно бесплатное приложение, то с меня требуют $50 как за платное. Ну и спрашивается, где здесь PROFIT?
  • Есть возможность запостить бесплатную beta-версию платного приложения. Такой сабмит проходит без ревью и является бесплатным.
  • Кажется, что для бесплатных приложений лучше заводить отдельный аккаунт с Community Membership.

Изначально на сайте Palm Developer Program я регистрировался с e-mail’ом, к которому у меня прикручен украинский PayPal. При попытке оплатить сабмит с американского PayPal’а мне сказали что это какой-то чужой аккаунт, не совпадает с e-mail’ом на сайте и надо его привязать к учетке. Привязать PayPal  стоит $10. В этом месте я отчаянно борюсь с жабой, которая меня уже почти задушила, когда я решил вспомнить, сколько денег я угробил, в общей сложности, на все это 🙂

Дальше был сабмит beta-версии. За 3 дня, пока пользователи тешились бесплатной бетой, я получил около 2000 загрузок и 4 письма в службу поддержки с предложениями новых фич. За эти 3 дня приложение получило рейтинг 5 из 5ти, что очень классно.

Затем был сабмит платной версии, в которой были учтены пожелания пользователей, отписавших на e-mail с предложениями новых фич. Выглядело это все как-то так:

После сабмита за 8 дней приложение скачали (надеюсь что купили) около 400 пользователей. За эти 8 дней рейтинг скатился с 5 до 4.1. То ли при покупке платных приложений пользователи становятся более злыми, то ли “кругом одни враги” 😉

Почему я пишу “надеюсь что купили”? У Palm  какая-то глупая система учета статистики:

  • Вы не можете видеть отдельно количество загрузок каждой версии приложения
  • Вы не можете видеть статистику загрузок за текущий день/неделю/месяц
  • Доступен только общий отчет за прошлый месяц и за все предыдущие, тоесть мониторить статистику в реальном времени нельзя.
  • Статистика загрузок обновляется не сразу, а несколько раз в день. Кажется, раз в 2-4 часа.

Еще более странная у Palm система оплаты. Свои деньги за проданное ПО вы получите “в течении 60ти дней после окончания текущего месяца” дабы не быть голословным, вот ссылка по теме (см. раздел Payment).

Ну вот как-то так. Система работает, будем ждать оплаты.

Немного статистики

  • Потрачено времени – 1 год
  • Потрачено денег – $100 + $5 + $10 + $50
  • Получено прибыли – $9 за AdMob + (unknown) за продажи
  • Всего загрузок бесплатного приложения – 10000 (за 1.5 месяца) + 2200 (за 3 дня)
  • Всего загрузок платного приложения – ~500
  • Левелап получен – да, как всегда

Надеюсь, мои многобукаф кому-то принесут пользу.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

This post has 5 Comments

5
  1. И вновь огромное спасибо за полезнейший пост! Вы просто первопроходец App.Market-ов в укр. сообществе моб. разработчиков 🙂

  2. И я нашел компанию, которая предлагала зарегистрировать

    ITIN/EIN за 100 зеленых американских президентов. Денег заплатил, циферку выслали через 4 дня. На данный момент прошло больше 4х недель, а документов еще нет, поэтому ссылку на сайт, предлагающий эту услугу давать не буду до выяснения обстоятельств.

    Прошло уже некоторое время. Что автор скажет по этому поводу?

  3. Пришли документы. Подробнее по этому поводу расскажу чуть позже. Вполне возможно что скоро на mobile-develoepr.ru можно будет заказать регистрацию ITIN/EIN с оплатой по WebMoney.

  4. Очень жду рассказа по поводу регистрации ETIN/EIN

Leave a Reply

Your email address will not be published. Required fields are marked *

И.

Использование HTML5 Depot для хранения данных в Palm WebOS

Для начала давайте разберемся, что такое Depot и зачем он может понадобиться в приложениях для Palm WebOS.

Если ваше приложение должно хранить данные, то в таком случае есть три варианта:

  • Использование Cookies
  • Использование базы данных SQLite
  • Использование Depot

Но в каких же случаях есть смысл использовать каждый из перечисленных вариантов? Если необходимо сохранить небольшой объем данных, например настройки приложения, то лучше использовать Cookies. Если же объем данных относительно большой, то выбор должен быть сделан в пользу одного из оставшихся способов. Какой из них лучше?

Что лучше использовать – зависит от объема данных, которые нужно хранить, а также от того, где вы будете хранить эти данные. Если вы используете хранилище по умолчанию (кстати Depot переводится как “хранилище” или “склад”), то у вас объем данных будет ограничен одним мегабайтом.

Если вам необходимо хранить данные в структурированном виде, то лучше сделать выбор в пользу базы данных SQLite.

Кстати, ограничение на 1 МБ данных можно обойти, разместив хранилище на разделе с медиа. В этом случае размер хранилища будет ограничен только объемом свободной памяти на это мразделе.

В чем же отличие Depot от базы данных SQLite? Depot может хранить только объекты. Например сделать так чтобы хранилась только булевая переменная не получится, нужно обязательно сделать объект и эту булевую переменную указать в виде свойства.

{ "value" : true }

Тоесть, что получается: Depot – это неструктурированное хранилище объектов. На самом деле это просто еще один уровень абстракции над API по работе с базами данных SQLite, но он позволяет избавиться от необходимости писать SQL в коде, что довольно удобно.

Перед тем, как рассматривать пример использования Depot, давайте создадим каркас приложения и потом в него уже будем добавлять необходимый функционал:

app/views/main/main-scene.html

<div id="main" class="palm-hasheader">
  <div class="palm-header">Depot Test</div>
  <div id="AddSceneButton" x-mojo-element="Button"></div>
  <div id="info" x-mojo-element="x-body-text"></div>
</div>

app/assistants/main-assistant.js

function MainAssistant() {
}

MainAssistant.prototype.setup = function() {
  this.controller.setupWidget("AddSceneButton", {}, {label:"Add"});
  Mojo.Event.listen(this.controller.get("AddSceneButton"),
    Mojo.Event.tap,
    this.handleAddSceneButton.bind(this));
}

MainAssistant.prototype.handleAddSceneButton = function(event) {
  this.controller.stageController.pushScene("add");
}

app/views/add/add-scene.html

<div id="main" class="palm-hasheader">
  <div class="palm-header left" id="list-header">
    Add / replace data
  </div>
</div>
<div class="palm-group">
  <div class="palm-group-title"><span x-mojo-loc="">Database Info.</span></div>
    <div class="palm-list">
      <div class='palm-row first'>
        <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
          <div class="title">
            <div class="label">Key</div>
            <div id="keyField" name="keyField" x-mojo-element="TextField" ></div>
          </div>
        </div>
      </div>
      <div class='palm-row last'>
        <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
          <div class="title">
            <div class="label">Text</div>
            <div id="textField" name="textField" x-mojo-element="TextField" ></div>
          </div>
        </div>
      </div>
    </div>
</div>
</div>
<div id="depotResult" class="info-text"></div>
<div x-mojo-element="Button" id="add_button"></div>
<div x-mojo-element="Button" id="back_button"></div>

app/assistants/add-assistant.js

function AddAssistant() {
}

AddAssistant.prototype.setup = function() {
  this.controller.setupWidget('keyField',
    {
      hintText:       'Enter key here',
      modelProperty:  'originalValue',
      textCase:       Mojo.Widget.steModeLowerCase,
      focus:          true,
      maxLength:      30
    },
    {
      originalValue : ''
    });
  this.controller.setupWidget('textField',
    {
      hintText:       'and some text here',
      modelProperty:  'originalValue',
      textCase:       Mojo.Widget.steModeLowerCase,
      multiline:      false,
      focus:          false,
      maxLength:      30
    },
    {
      originalValue : ''
    });
  this.controller.setupWidget("add_button", {}, {label:"Add entry"});
  this.controller.setupWidget("back_button", {}, {label:"Back to main view"});

  Mojo.Event.listen(this.controller.get("add_button"),
    Mojo.Event.tap, this.handleAddButton.bind(this));
  Mojo.Event.listen(this.controller.get("back_button"),
    Mojo.Event.tap, this.handleBackButton.bind(this));
}

AddAssistant.prototype.cleanup = function() {
  this.controller.stopListening(
    this.controller.get('add_button'), Mojo.Event.tap,
    this.handleAddButton);
  this.controller.stopListening(
    this.controller.get('back_button'), Mojo.Event.tap,
    this.handleBackButton);
}

AddAssistant.prototype.deactivate = function(event) {
}

AddAssistant.prototype.handleAddButton = function(event) {
}

AddAssistant.prototype.handleBackButton = function(event) {
  this.controller.stageController.popScene();
}

На главной форме у нас находится кнопка Add, которая вызывает сцену, в которой можно добавить новые записи в Depot.
Форма добавления новых записей содержит заголовок, группу из двух текстовых полей и две кнопки – кнопку добавления новой записи и кнопку закрытия сцены.
WebOS Depot Test

Ну вот, GUI готово, теперь можем начинать работу с Depot.

function MainAssistant() {
  var options = {
    name: "depot_tutorial", //Название хранилища (обязательный параметр)
    version: 1, //Версия базы данных. (опционально, по умолчанию 1)
    replace: false // открывать существующее хранилище
  };
  this.depot = new Mojo.Depot(options,
    this.dbConnectionSuccess.bind(this),
    this.dbConnectionFailure.bind(this));
}

MainAssistant.prototype.dbConnectionSuccess = function() {
    this.controller.get("info").update('OK');
}

MainAssistant.prototype.dbConnectionFailure = function() {
    this.controller.get("info").update('Error');
}

При создании объекта Depot можно указать методы, которые будут отрабатывать при успешном подключении к хранилищу или же при ошибке подключения.

Если надо создать хранилище на разделе с медиа, то название хранилища будет выглядеть так:

name: "ext:depot_tutorial"

У нас есть сцена, в которой должно происходить добавление объектов в Depot. Нам надо передать в нее объект Depot в качестве параметра. Сделать это можно вот как:
app/assistants/main-assistant.js

MainAssistant.prototype.handleAddSceneButton = function(event)
{
    this.controller.stageController.pushScene("add", this.depot);
}

app/assistants/add-assistant.js

function AddAssistant(arg) {
    this.depot = arg;
}

Мы передаем объект Depot в качестве параметра pushScene() и этот объект будет получен сценой как параметр конструктора.
Теперь нам необходимо написать обработчик кнопки add_button, в котором значение из текстового поля TEXT будет добавляться в хранилище с ключем KEY.

AddAssistant.prototype.handleAddButton = function(event) {
    this.data = { "value" :this.textModel.originalValue };
    this.depot.simpleAdd(this.keyModel.originalValue,
        this.data, this.dbAddSuccess, this.dbAddFailure);
}

AddAssistant.prototype.dbAddSuccess = function(event) {
    this.depotResult.innerHTML = ("Add success!");
}

AddAssistant.prototype.dbAddFailure = function(event) {
    this.depotResult.innerHTML = ("Add failure!");
}

В обработчике кнопки Add мы создаем объект, в нем в свойстве value запоминаем введенный текст и затем записываем в Depot. Запись происходит путем вызова метода simpleAdd(), в котором мы указываем ключ, сохраняемый объект, а также два callback-метода, которые будут вызваны при удачном или неудачном завершении операции записи.

И вот, мы научились добавлять объекты в Depot. Теперь попробуем научиться их оттуда доставать.

Создадим новую сцену с названием get.

app/views/get/get-scene.html

<div id="main" class="palm-hasheader">
  <div class="palm-header left" id="list-header">
    Retrieve data
  </div>
</div>
<div class="info-text">Which data entry you want to get?</div>

<div class="palm-group">
<div class="palm-group-title">Enter key string</div>
  <div class="palm-list">
    <div class="palm-row single">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div id="entryNum" x-mojo-element="TextField" ></div>
        </div>
      </div>
    </div>
  </div>
</div>
<div id="response" class="info-text"></div>
<div x-mojo-element="Button" id="get_button"></div>
<div x-mojo-element="Button" id="back_button"></div>

app/assistants/get-assistant.js

function GetAssistant(arg) {
    this.depot = arg;
}

GetAssistant.prototype.setup = function() {
    this.controller.setupWidget("get_button", {}, {label:"Get value"});
    this.controller.setupWidget("back_button", {}, {label:"Back to main view"});
    this.controller.setupWidget('entryNum',
        {
            hintText:       'Enter key here',
            modelProperty:  'originalValue',
            textCase:       Mojo.Widget.steModeLowerCase,
            multiline:      false,
            focus:          true,
            maxLength: 30
        },
        this.keyModel =
        {
            originalValue : ''
        });

    Mojo.Event.listen(this.controller.get('get_button'),
        Mojo.Event.tap, this.handleGetButton.bind(this));
    Mojo.Event.listen(this.controller.get("back_button"),
        Mojo.Event.tap, this.handleBackButton.bind(this));
}

GetAssistant.prototype.cleanup = function(event) {
    this.controller.stopListening(
        this.controller.get('get_button'), Mojo.Event.tap,
        this.handleGetButton);
    this.controller.stopListening(
        this.controller.get('back_button'), Mojo.Event.tap,
        this.handleBackButton);
}

GetAssistant.prototype.handleGetButton = function(event) {
    this.depot.get(this.keyModel.originalValue,
        this.dbGetSuccess.bind(this),
        this.dbGetFailure.bind(this));
}

GetAssistant.prototype.dbGetSuccess = function(response) {
    var recordSize = Object.values(response).size();
    if(recordSize == 0) {
        this.controller.get("response").innerHTML = "No such record in the database";
    } else {
        this.controller.get("response").innerHTML = "Data entry is: " + response.value;
    }
}

GetAssistant.prototype.dbGetFailure = function(transaction, result) {
    this.controller.get("response").innerHTML = "Error: " + result.message;
}

GetAssistant.prototype.handleBackButton = function(event) {
    this.controller.stageController.popScene();
}

На созданной сцене у нас есть текстовое поле, в которое можно ввести ключ для поиска в хранилище, поле для отображения результатов поиска и две кнопки – кнопка поиска и кнопка закрытия сцены.

WebOS Depot Search GUI

Для получения объекта из хранилища мы используем метод get() объекта Depot. В этом методе указывается ключ и callback-методы, которые отработают при удачном или неудачном завершении транзакции.

На этом все. В этой статье мыузнали:

  • Чем отличается Depot от базы данных SQLite.
  • Как создать объект Depot в хранилище по умолчанию или на разделе с медиа
  • Как создать соединение с Depot
  • Как записать данные в Depot
  • Как получить данные из Depot
  • Как обрабатывать результаты транзакций в callback-методах.

Скачать исходный код примера.

К.

Кому в App Store жить хорошо. Магазинчик программ «У Стиви» глазами разработчика

Сегодня у нас статья хабрапользователя xzDeveloper об App Store.

В этой статье постараюсь кратко рассказать про свой полуторалетний опыт разработки под iPhone. И о том, кому же полезен App Store.

Часть 1. Действующие лица

Независимый разработчик

Моя позиция такова, и, надеюсь, многие согласятся, что успешный человек — это тот, кто занимается любимым делом, которое приносит доход, на который можно не только жить, но и отдыхать от работы. То есть, его трудовой вклад должен окупаться настолько, чтобы он полностью себя обеспечивал. Кроме дохода еще требуется саморазвитие, чтобы не отставать от темпов роста отрасли, быть всегда во всеоружии, насколько это возможно, чтобы не растерять главное: опыт, навыки, знания.

Много ли таких среди инди-разработчиков? Мне кажется, что нет. Напротив, даже очень и очень мало. Особенно в нашей стране. Попробуем разобраться, почему.

Многие слышали success story о том, как молодой человек загорается желанием и за неделю «в гараже» выдает на-гора супер-проект, о котором пишут новостные ленты, пестрит твиттер, который попадает в топы категорий, подкатегорий.

Обычно, за очень редким исключением, кроме минуты/дня/недели славы из этого ничего не получается. Что на первых порах молодой команде даже вредно.
О реальных цифрах знают далеко не все. Потому что далеко не все были в этом самом «топе». Иногда это даже проблема, этот «топ».

Если продукт попал в какой-либо топ, то пользователи будут считать, что разработчик «гребет бабло», и будут требовать соответствующей поддержки и отношения. Это может быть требование немедленно изменить функционал, как они желают, изменить дизайн, выпустить срочно обновление. По опыту скажу, что под «срочно» ими обычно подразумевается 2-3 дня, и если требование не будет выполнено, неминуемо последует «наказание» в виде негативного отзыва (зачастую очень агрессивного), плохой оценки, гневного письма. Про отзывы, рейтинги и пользователей подробнее расскажу ниже.

С другой стороны, положение в рейтинговой таблице влияет на продажи: приложения первой сотни покупают чаще. Просто потому что они на виду. Однако, точно оценить коэффициент, который привносится в продажи с помощью топа, сложно.

Итак, в глазах пользователей разработчик — миллионер. А на самом деле…

«Скока денег?»

Расскажу про русский топ на примере одного нашего приложения, т.к. «плавали, знаем». От штатовского наш топ отстает всего на порядок, как я полагаю, так что с большой натяжкой можно сказать, что сравнимо. А если учесть, что у тамошних разработчиков и потребности выше на порядок, то мы с ними в одной шкуре. Если я прав, выходит, что: «разработчик — он и в Африке разработчик».
Итак, каков объем нашего, русского отдела магазинчика? Максимум, что мы видели — это 750 закачек в сутки однодолларового приложения на первом месте. При этом в Top Grossing до первого места мы не добрались. Выходит, что потолок первого места русского топа скорее всего не ограничен одной тысячей закачек. НО это не каждый день.

Среднее количество закачек на первом месте — от 150 до 300. Конечно, зависит от приложения, от «соседей», сезона и т.п. Наблюдения велись в течение месяца (столько времени наше приложение продержалось в первой десятке, половину этого времени на первом месте).

Итого у нас вышло: потрачено на разработку 500 часов нетто (без перекуров и отвлечений), доход за 4 месяца продаж, за вычетом сбора Apple составил примерно 5 тысяч долларов. На рекламу не потрачено ни копейки, поддержка пользователей около 100 часов. Выходит, доходность меньше 10 долларов в час при условии постоянного нахождения в топе. Это приложение просто оказалось нужным и востребованным, его не понадобилось пиарить. А если добавить сюда расходы на рекламу, оплату электричества, трафика, хостинга, профит получится еще меньше.

В отличие от коллег, которые недавно рассказывали о своем опыте как о неудачном, мы считаем, что это пусть маленький, но успех.

Про «гаражные стартапы» все знают или слышали. Но где эти стартапы через год-два, если не находят инвестора? Так и здесь, в разработке под iPhone: часто это молодые люди еще без соответствующего образования, опыта (как программистского, так и организационного). Запала хватает обычно на одно-два приложения. Пусть очень хороших и востребованных публикой. А что дальше? Хорошо, если отобьются вложенные средства… А дальше глухой стеной встает предел компетентности/армия/апатия/необходимость или желание зарабатывать реальные деньги и спать ночью.

Фанаты

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

Билет на WWDC-2010 можно было купить за 1600$ в течение всего лишь 8 дней. Разобрали, как пирожки. Сколько было инди-разработчиков там? Немного. А российских разработчиков? Единицы. А кто же все те люди? Это были журналисты, люди из первого абзаца, а также те, кто смог убедить руководство своей компании оплатить такую командировку (+ билеты + недельное проживание).

Это я к тому, что есть целый пласт людей, которые занимаются разработкой (иногда даже это у них получается), просто потому что им хочется это делать, потому что они фанаты Apple или хотят доказать всем, что «они смогут». И они не расстраиваются из-за неудач (потому что на счетах есть на что жить и без игры в разработку).

Ребята из рекламных роликов Apple

Некоторые разработчики получают поддержку Apple напрямую. Есть несколько специально созданных Apple рекламных роликов, где разработчики-одиночки(!) аж светятся и рассказывают, как просто было им начать путь и как быстро он их привел к успеху. Ради интереса, может, кто-то знает судьбу тех самых ребят?

Apple заинтересованы в магазине приложений не как в средстве своего дополнительного дохода, а как в механизме привлечения покупателей для своих устройств. Поэтому им выгодно, чтобы было много разных приложений, чтобы сказать, что у них уже 250 тысяч программ в магазине и столько-то миллиардов закачек.

Может, все и задумывалось для людей: много хороших, нужных, качественных программ… А получилось, как всегда: отдел маркетинга требует большие цифры, горе-разработчики ноют, что цензоры не пропускают их мусор, шумят в блогах. Где уж тут качество будет. В итоге все стали заложниками ситуации, когда всем одновременно мил не будешь.

Такова мощь и бесполезность сегодняшнего App Store: разработчики не могут заявить о себе, утопая в тысячах поделок и клонов, пользователи дальше 100 первых приложений не видят ничего, да если и захотеть, то найти что-либо подходящее и стоящее не всегда под силу.

Издатели (publishers)

Эти товарищи зарабатывают на процентах с продаж чужих приложений. Это почти все известные бренды App Store. Они отбирают самое лучшее, что есть. Иногда сами делают заказы. Не скупятся на промокампании. В итоге разработчик, обратившийся к паблишеру получает ту же зарплату, что и в офисе. Сама компания-издатель обычно не маленькая, и огромные доходы расходятся на зарплаты и рекламу.

Вывод

По нашим наблюдениям и рассуждениям выходит, что нет счастливчиков, которые особо не напрягаются и прилично зарабатывают в App Store.

Хуже всех ситуация у независимых разработчиков (небольших команд и стартапов), т.к. на одном-двух приложениях далеко не уедешь, спрос падает, рынок быстро насыщается, спасение лишь в постоянных заказах, а держать постоянных клиентов начинающей команде очень сложно. Еще сложнее одиночкам (надеюсь, не надо объяснять почему).

Не хочу отговаривать никого от желания заработать в App Store, просто не думайте, что это так просто. Легких денег не бывает, каждый грош зарабатывается потом и кровью.

Что делать независимым разработчикам?

Учиться, учиться и учиться.
Не расстраиваться из-за неудач.
Помнить, что всех денег не заработать, поэтому уделять внимание здоровью и время отдыху.
Не играть в большую компанию, когда вас еще очень мало.
Собрав приличное портфолио, начинать искать заказчиков.

Далее о том, что ждет тех, кто решился примерить на себя роль Apple Developer.

Часть2. Путь Разработчика

Что такое разработка для App Store? Есть несколько несложных «квестов», выполнения которых (как на каждом углу написано) вроде бы достаточно для того, «чтобы зашибать неплохие деньги»:

  • Наличие программно-технических средств. Нужен Mac, iPhone SDK, устройство для тестирования.
  • Регистрация участника Apple Developer Program. 99$ в год.
  • Идея программы. Обычно проблем ни у кого не возникает. Все гении.
  • Реализация. Требуется умение программировать, понимать технические тексты на английском.
  • Публикация. Угодить цензорам, знать в общих чертах, о чем сказано в iPhone Developer Program License Agreement
  • Реклама
  • Поддержка пользователей
  • Получение прибыли. Да, заработанные кровные еще надо получить.

Подробнее на некоторых пунктах остановлюсь ниже.

Разработка

Вроде бы об этом очень много уже информации есть. И для инженера при его желании, даже если он не умеет программировать (хотя, вроде сейчас всех инженеров учат этому), этот вопрос не играет большой роли.

Скажу лишь, что какова бы ни была дружественна к пользователю среда разработки, сколько бы библиотек с готовыми алгоритмами и функциями ни было уже написано, без базовых знаний по предмету лучше не пытаться «городить огород». По tutorial’ам конкретную нужную программу не написать. По документации к SDK не понять, что деление на 0 не очень хорошо.

Самое сложное, на мой взгляд, в разработке под iPhone — это управление памятью (retain, release). Надо следить за всей выделенной динамической памятью. Ну нет там «сборщика мусора»!

Веселая карусель прошивок

Все разработчики «любят» Apple за их любовь к деньгам пользователей: выход новых прошивок побуждает людей покупать новые устройства, т.к. на старых моделях новая прошивка уже не поддерживается. В чем же проблема у разработчика?

В прошлом году с выходом iPhone OS 3.0 особых проблем не было: старая прошивка (2.x) поддерживалась SDK. С выходом прошивки 4.0 и соответствующего SDK случилось страшное: для поддержки работы своего приложения на всех поддерживаемых устройствах разработчику для тестирования необходимо иметь 2(!) iPhone: один с прошивкой 3.1 и один с прошивкой 4.х Потому что ни один SDK не предусматривает полноценную поддержку обеих этих прошивок одновременно: нельзя выставить, например, Base SDK 3.1 и ниже в новом Xcode. Убрав поддержку iPhone OS 2.x явно, ребята из Купертино не явно очень сильно надавили на разработчиков и на пользователей по поводу iPhone OS 3.1.

Не вдаваясь в детали: поддерживать в программе полноценную работу сразу двух прошивок очень сложно.

С выходом iPad и iPhone 4 теперь, если есть желание делать универсальное приложение, придется позаботиться обо всех возможных расширениях экранов и куче наборов иконок для рабочего стола.

Работа приложений на устройствах. Jailbreak

Еще один «подарок» от Apple для разработчиков. Иногда операционная система iPhone не справляется со своими задачами. В результате, если в этот момент была запущена программа и она «упала», в глазах пользователя виноват будет создатель программы, не Apple, не Foxconn.

Если пользователь сделал Jailbreak, потому что «так делают все хакеры/друзья сказали», а не потому, что это ему действительно нужно, и накидает в аппарат кучу софта, описаний которого даже не читал, потому что «халява» и одна из этих программ «упала» во время использования, виноват кто? Конечно, не Jailbreak или дефицит системной памяти в алюминиевом iPhone. Ну, вы поняли.

Публикация

Цензоры. Те времена, когда давали абсурдные отказы в публикации, вроде бы прошли. На все про все обычно* уходит неделя.

Хотя, был один случай месяца три назад. Захотели мы реализовать функцию, для работы которой требовалось использование некоторых незапрещенных функций ядра. Повесили кнопку, на которой написали название функции. Ответ цензора: «Такой функционал в SDK не предусмотрен», хотя очень похожая программа от другого разработчика продавалась как ни в чем не бывало. Показывать пальцем не стали, пришлось убрать кнопку (функцию-то мы оставили, сделав автоматической). И как же обидно стало, когда по прошествии двух месяцев программ с такой функцией, описанием и даже названием стало прибывать!

* Сроки рассмотрения всегда плавающие. Даже нечего сказать пользователям, которые спрашивают о дате выхода обновления. От недели до месяца. От сложности приложения не зависит. Обновление это или новое приложение — роли не играет.

Радует только, что интерфейс iTunes Connect (веб-портал, при помощи которого разработчики отправляют приложения на публикацию) сделали более дружелюбным и выпустили достаточно удобное приложение под iPhone для слежения за количеством продаж.

Реклама

Без рекламы никуда. Редко-редко ваше супер-пупер-замечательное приложение заметят просто так.

Есть множество способов раскрутки, один из них — это публикация обзора программы в профильных СМИ.
Как вы думаете, каким образом в популярных новостных лентах и порталах оказываются обзоры программ из App Store? Причин не так уж и много, вот те, что я пронаблюдал:

  • Разработчик заплатил за обзор денег (не знаю сколько, за деньги не публиковались).
  • Портал малопосещаем, ньюсмейкеров не хватает, опыта нет и обзор публикуется по принципу «хоть что-то».
  • По знакомству.
  • Приложение находится в штатовском «топе».

Еще можно пиариться в форумах и темах на пиратских трекерах. Но, думаю, это крайне неэффективно. Разве что ради обратной связи.

Поддержка пользователей. Отзывы и оценки

Если приложение имеет больше одной кнопки и вы не гуру юзабилити — придется заниматься поддержкой. Для игр, может, и не так актуально. Про работу службы поддержки будет отдельная статья.

Обратная связь

Самая веселая часть. Когда грустно, можно читать отзывы в App Store, и на душе станет теплее. Там и страсть фанатов (даже у приложений есть фанаты), и злость обманутых пользователей, и радость обретших, и грусть потерявших (например, некоторые приложения цензоры удаляют уже после того, как опубликовали), а также глупость недалеких пользователей.

Есть такой класс приложений — розыгрыши. Одно из таких — «Поиск местонахождения сотового телефона по номеру». Суть в том, что «ведущий» запускает приложение, просит жертву розыгрыша сказать свой номер телефона, вводит в программу — и iPhone определяет место по GPS. Т.к. жертва розыгрыша находится там же, где и ведущий, программа определяет всего лишь свое собственное местоположение. Честное описание в этих приложениях всегда присутствует. Вот типичный отзыв для таких приложений: «РАЗВОД! НЕ ПОКУПАЙТЕ! Какие дебилы вывели в топ это дерьмо?» Оценки все единицы. Приложение обычно несколько дней в топе. Разработчик заработал свои «грязные» деньги. А пользователи раскрывают свою суть. Кто вывел в топ? Да тот человек и ему подобные и вывели.

Что удручает — так это мат и оскорбления в отзывах в адрес как разработчика, так и других товарищей, оставивших отзыв и позволивших себе не согласиться с предыдущим. Таковы вы, пользователи продукции Apple? Культурные и грамотные? Матерятся иногда даже с ошибками.

Что интересно, отзывы люди не читают, описание — тоже. Смотрят только на иконку и название. Отзывы — это как будто такое место с режимом write-only.

Оценки

Если приложение простенькое, делает тихо свою работу, то ни отзывов, ни оценок у него не будет. Это также может означать, что оно вовсе не продается.

Если приложение достаточно сложное, но дешевое — ждите кучи единиц: чтобы им пользоваться, зачастую нужно прочитать хотя бы аннотацию. Поставить единицу, не разобравшись, проще, чем что-либо читать. У таких приложений обычно поровну положительных и отрицательных оценок.

Исключительно отличные оценки есть только у простых красивых несложных игрушек.

Может, выводы, которые можно из этого сделать о публике, и грустные, но такова реальность. Если кого-то успокоит, то в Штатах с этим намного хуже. Хотя это выборка только по магазинчику.

Гонорар. «Сундук Кащея»

Говорим про Россию. Деньги от Apple приходят не сразу, а только после их отчетного периода, обычно не раньше, чем через 45 дней, и если набралось не меньше пары сотен долларов. Не во всех российских банках эти деньги без проблем зачислят на счет физического лица. Особенно, если денег много (наверное, должно быть столько, чтобы финмониторинг включился).
Т.к. сообщений о таких случаях не поступало, это значит, что либо у кого-то такое случилось и он об этом никому не рассказал, либо такого не случалось, либо счет у человека не в России.

Издержки работы юр. лица (особенно когда разработчику еще нет 18-ти) должны быть всем понятны. Возможно ли вообще честно получить хорошие деньги из-за границы? Что косвенно подтверждает мое предположение о том, что нет успешных независимых разработчиков (по крайней мере в России).

Заключение

Разработчикам: не стесняйтесь обмениваться опытом. Есть несколько русскоязычных сайтов по iPhone-тематике для разработчиков. В мечтах, конечно, русский stackoverflow.com. Если кто знает что-то подобное для русскоговорящих, советуйте всем своим знакомым разработчикам.

Начинающим разработчикам и тем, кто спамит в App Store: не плюйте в колодец…

Пользователям: читайте хотя бы аннотацию к приложению перед покупкой. И не думайте, что мы на вас наживаемся. Бывает мы ночами не спим, отвечая на ваши письма за куда меньшие деньги, чем можно заработать в уютном офисе.

Источник.