Блог Сергея Байдачного

Мой блог о технологиях

Posts Tagged ‘Windows Phone

Конкурс для Windows Phone разработчиков в Украине

2 комментария

Вспомнил, что не писал о таком замечательном конкурсе: http://wp8.promorc.com, который мы сейчас проводим для всех разработчиков и студентов в Украине.

На конкурсе 4 номинации:

· Лучшее приложение (тут все, что угодно – бизнес, социалка и др.)

· Лучшая игра

· Лучшее студенческое приложение (чтобы дать возможность студентам получить приз с хорошим приложением, если их вытеснят разработчики из первых двух номинаций.)

· Лучшее приложение для Windows Phone 8 (тут речь идет о приложениях, которые утилизируют новые возможности платформы. Чем лучше и полезней эта утилизация, тем лучше для конкурса)

Ограничения: только жители Украины, приложение должно быть опубликовано с украинского аккаунта (смысл делать метрики другой стране?) и приложение должно быть опубликовано в ходе конкурса (нас интересует что-то новенькое).

До конца конкурса осталось еще 54 дня. Поэтому время еще есть.

Реклама

Written by Sergiy Baydachnyy

20.12.2012 at 12:54

Опубликовано в Windows Phone

Tagged with ,

Бесплатная публикация приложений под Windows Phone для студентов

2 комментария

Компания SoftKey, являющаяся официальным паблишером приложений под Windows Phone для украинских разработчиков, поделилась замечательной новостью: все студенты, желающие опубликовать свои приложения в Windows Phone Marketplace, смогут сделать это совершенно бесплатно. При этом речь идет как о платных (такая возможность уже была), так и о бесплатных приложениях. Для осуществления публикации необходимо зарегистрироваться на сайте http://winphone.softkey.ru/ и выслать копию студенческого. Обращаю Ваше внимание на то, что заполнять контракты на десятки листов и отправлять их в Москву почтой, больше не нужно!

Благодаря упрощенной процедуре (лишь регистрация и копия студенческого), Ваше приложение может быть отправлено на сертификацию в течении 1-2 дней после регистрации на сайте SoftKey.

Данное предложение действует лишь для украинских разработчиков и на сайте еще не отражено, но публиковать можно уже сегодня. Просто следуйте моим инструкциям. Хотя официальное подтверждение уже есть тут: http://www.softkey.ua/news_detail.php?ID=12964.

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

Written by Sergiy Baydachnyy

18.01.2012 at 09:37

Опубликовано в Windows Phone

Tagged with

Публикуем приложения через APPA Mundi: публикация

21 комментарий

 

Итак, зарегистрировавшись в APPA Mundi, начинаем публикацию своего приложения. Это можно делать, как только статус перешел в состояние Active, а на балансе появилось 36 фунтов.

Итак, нажимаем большую кнопку сверху Submit Application и переходим к первой странице мастера:

 

clip_image002

 

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

Теперь выбираем язык нашего приложения и загружаем XAP файл (последний откомпилируйте в Release версию).

 

clip_image004

Внимание! Если Ваше приложение поддерживает несколько языков (русский и английский), то Вам понадобиться подготовить отдельные скриншоты и описания для каждого из языков. На этом этапе загружайте только скриншоты для выбранного языка. Остальные сможете загрузить потом.

Внимание! Очень часто приложение не проходит сертификацию, так как имеет иконки, установленные по умолчанию. Проверьте, что приложение имеет уникальную иконку как в общем меню, так и при размещении на основной странице (иконка хаба) телефона.

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

 

clip_image006

 

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

 

clip_image008

 

На последнем этапе Вы выбираете стоимость приложения. Подозреваю, что на первом этапе это Ваши приложения будут распространятся бесплатно.

 

clip_image010

 

Просмотрите всю загруженную информацию и установите галочку, разрешающую опубликовать Ваше приложение в Marketplace сразу же после прохождения сертификации. Если не поставить эту галочку, то придётся вернуться и выполнить публикацию вручную.

 

clip_image012

 

В последнем окне Вас предупреждают о том, что с Вашего счета снимают 30 фунтов. Но поскольку эти деньги достались Вам даром, то смело жмем Next.

Внимание! Если с первого раза Ваше приложение не проходит сертификацию, Вы можете повторить процедуру любое количество раз – бесплатно. За оставшиеся 6 фунтов можно отправить апдейт для Вашего приложения.

 

clip_image014

 

Вернувшись в свою панель управления, Вы можете смотреть на статус Вашего приложения. Тут же Вы можете опубликовать скрины и описания на других языках, нажав Submit another language.

 

clip_image016

 

Вот и все. Остается только ждать результат. 3-5 дней и Ваше приложение станет доступно пользователям (если его не вернут на доработку).

Удачи Вам с публикацией!

Written by Sergiy Baydachnyy

09.11.2011 at 17:32

Опубликовано в Windows Phone

Tagged with

Публикуем приложения через APPA Mundi: регистрация

64 комментария

Многие уже слышали, что с 1-го ноября Майкрософт Украина предоставляет студентам любых учебных заведений возможность опубликовать бесплатно свои приложения на Windows Phone Marketplace. Публикация осуществляется через специальную компанию APPA Mundi и не требует существенных временных затрат. Сейчас я покажу, как это сделать.

Итак,

Шаг 0.

Чтобы пройти процедуру регистрации, Вы должны иметь Live ID. Он необходим при активации Вашего аккаунта в программе DreamSpark. Если у Вас еще нет LiveID, то рекомендую пойти на http://mail.live.com, где и создать оный, включая чистый почтовый ящик для коммуникации по вопросам Marketplace.

Шаг 1.

Пишем мне письмо с просьбой выслать специальный промо-код для публикации своего приложения. Для этого нужно переслать любое подтверждение того, что Вы студент и иметь готовое к публикации приложение. Запрос прошу отправлять на адрес Sergiy.Baydachnyy@microsoft.com.

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

Шаг 2.

Получив се коды, регистрируемся на APPA Mundi портале, по адресу http://www.appamarket.com.

Для этого достаточно нажать Register for APPA Market account.

 

clip_image002

 

Нажав ссылку, Вы тут же попадете на форму, где обязательно необходимо выбрать, что Вы Студент и из Украины.

 

clip_image004

 

Тут же можно проверить Ваш LiveID (создайте какой-нибудь) на принадлежность студенту. Рекомендую с этого и начать. Вот тут и понадобиться второй код (конечно, если у Вас есть ISIC карточка, то можно обойтись и без кода).

 

clip_image006

 

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

Далее переходим к заполнению детальной информации о себе и в самое последнее поле вводим промо-код. Именно он позволит активировать на Вашем балансе некоторую начальную сумму, достаточную для публикации приложения.

 

clip_image008

 

Подтверждаете все свои данные на последнем этапе регистрации.

 

clip_image010

 

Наконец, Вы оказались на странице, с которой можно произвести публикацию. Но не стоит торопиться. Так как коды проверяются в «ручном» режиме, то необходимо подождать до 24-х часов, пока на Ваш счет будут зачислены деньги. В моем случае это заняло 1 час.

Лишь после того, как Ваш аккаунт перейдет в состояние Active (из Not Activated), то можете приступать к публикации.

 

clip_image012

 

О том, как произвести публикацию под созданным аккаунтом, я расскажу в следующем посте.

Written by Sergiy Baydachnyy

09.11.2011 at 15:01

Опубликовано в Windows Phone

Tagged with

Windows Phone 7: Разрабатываем приложение с использованием Push Notification (часть 1, веб-роль)

4 комментария

Этим постом я начинаю серию из 4-х статей, посвященных разработке решения для Windows Phone 7 с использованием Push Notification. Описанное тут решение мы разрабатывали для Украинского Медиа Холдинга. Между тем оно является типовым, хотя информацию по некоторым шагам найти достаточно сложно.

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

Поскольку Windows Phone 7 обладает такой замечательной вещью, как Push Notification, то было принято решение, реализовать аналогичный функционал для устройств WP 7 на бесплатной основе. Ведь для использования Push Notification мобильный оператор не используется, а уведомления доставляются с помощью специальной Push Notification службы, которой управляет Microsoft.

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

Таким образом, при разработке этого решения, нам необходимо следующие три компонента:

· Служба, которая позволяет получить новое сообщение от оператора и поставить его в очередь;

· Модуль (служба), который обрабатывает сообщения в очереди;

· Клиент для Windows Phone 7, позволяющий пользователю подписаться на службу и настроить параметры уведомлений;

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

Учитывая проблемы выше и список основных компонентов, было принято решение использовать технологию Windows Azure для создания подобного решения. В случае использования Windows Azure, первый компонент можно было бы реализовать в виде обычных WCF служб, для реализации очереди использовать соответствующий тип хранилища в Storage службе, а для компонента обработки элементов очереди можно использовать Рабочую роль. Последняя предназначена для работы в фоне и может регулярно опрашивать очередь на наличие новых элементов. Кроме того, Рабочая роль очень хорошо масштабируется.

Таким образом, 3 из 4 статей будут иметь достаточно опосредованное отношение к Windows Phone, а скорее относятся к Windows AzureJ

Начнем работу. На первом шаге создадим проект в Visual Studio на базе шаблона Windows Azure

image

В создаваемое решение добавим две роли, это WCF Service Web Role и Worker Role. Тут Вашим ролям можно дать более осмысленные названия (я не буду).

image

Про Рабочую роль сейчас забудем и сосредоточимся на реализации WCF службы.

Опишем интерфейс нашей службы следующим образом:

   1:      [ServiceContract]
   2:      public interface INotification
   3:      {
   4:          [OperationContract]
   5:          void SubscribePhoneToService(Guid guid, string pushServiceUri);
   6:   
   7:          [OperationContract]
   8:          SMSMessage[] RefreshData();
   9:   
  10:          [OperationContract]
  11:          void NewSMSMessage(string sms, string login, string password);
  12:      }
  13:   
  14:   
  15:      [DataContract]
  16:      public class SMSMessage
  17:      {
  18:          string date;
  19:          string message;
  20:   
  21:          [DataMember]
  22:          public string DateTimeValue
  23:          {
  24:              get { return date; }
  25:              set { date = value; }
  26:          }
  27:   
  28:          [DataMember]
  29:          public string MessageValue
  30:          {
  31:              get { return message; }
  32:              set { message = value; }
  33:          }
  34:      }

 

Тут описан класс SMSMessage, с помощью которого мы будем передавать данные между службой и телефонами, а также интерфейс INotification, описывающий три метода интерфейса службы. Тут определены следующие методы:

· SubscribePhoneToService – этот метод позволяет подписать телефон на сообщения, принимая уникальный ID телефона и адрес службы уведомлений для отправки сообщений данному устройству. Обратите внимание, что сообщения высылаются каждому подписанному телефону отдельно. Это дает возможность кастомизировать текст сообщения и фильтры, в зависимости от настроек. В данном случае какой-то специальной настройки для конкретного телефона мы не поддерживаем, поэтому метод принимает всего два параметра;

· RefreshData – этот метод необходим, если пользователь запустил приложение и хочет посмотреть последние сообщения;

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

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

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

Первым делом создадим хранилище сообщений и подписок. Я решил использовать SQL Azure, так как меня больше устраивало реляционное хранилище. Данных тут не много, зато можно делать сложные выборки.

Для этого воспользуемся панелью управления Windows Azure и создадим новую базу

image

Тут же, в панели, можно увидеть строку подключения к базе, которую мы будем использовать из приложения. Вот пример такой строки:

Server=tcp:imc39784zf.database.windows.net,1433;Database=UkraineTest;User ID=sbaidachni@imc39784zf;Password=myPassword;Trusted_Connection=False;Encrypt=True;

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

image

image

Помните, чтобы тестировать подключения к базам в SQL Azure, вы должны через панель управления выполнить настройки firewall, которые позволят подключаться с Вашей девелоперской машины к базе.

Поскольку нам нужен также и Storage Service, то создадим и его. Для этого также воспользуемся панелью управления.

image

Подготовительная работа завершена.

Теперь вернемся в Visual Studio и приступим к написанию кода. Первым делом внесем изменения в конфигурацию решения.

Обратите внимание, что параметры приложения (строка соединения, логин, доступ к Storage аккаунту) нужно прописывать в csdef и cscfg файлах. Если Вы внесете настройки в Web.Config (как Вы привыкли делать в обычных веб-приложениях), то менять их, в процессе работы, у Вас не выйдет.

Поэтому перейдите к настройкам нашей веб-роли и введите необходимые параметры именно там.

image

Тут мы ввели Логин, Пароль, строку соединения к базе, а также строку соединения к Storage Account. Последняя может быть описана с помощью специальной панели:

image

Тут Вы указываете имя созданного Storage аккаунта и ключ, который можно взять в панели управления Windows Azure. Не забудьте поменять HTTPS на HTTP. Наши сообщения не представляют особого интереса, поэтому лишняя безопасность тут не требуется.

Последний параметры NRecords определяет, сколько сообщений мы хотим возвращать на телефон. Мы могли бы отдать эту настройку и пользователю, но я все равно хочу ограничить их количество сверху.

А теперь приступаем к реализации кода.

Первый метод, позволяющий подписаться на сообщения, будет выглядеть следующим образом:

   1:  public void SubscribePhoneToService(Guid guid, string pushServiceUri)
   2:  {
   3:      SqlConnection conn = new SqlConnection(RoleEnvironment.GetConfigurationSettingValue("DatabaseConnection"));
   4:      SqlCommand comm = new SqlCommand("select count(*) from PhoneTable where PhoneID=@par1", conn);
   5:   
   6:      comm.Parameters.Add(new SqlParameter("par1", guid.ToString()));
   7:   
   8:      conn.Open();
   9:   
  10:      int res = (int)comm.ExecuteScalar();
  11:   
  12:      if (res > 0)
  13:      {
  14:          SqlCommand comm1 = new SqlCommand("update phonetable set PhoneUrl=@par2 where PhoneID=@par1", conn);
  15:          comm1.Parameters.Add(new SqlParameter("par1", guid.ToString()));
  16:          comm1.Parameters.Add(new SqlParameter("par2", pushServiceUri));
  17:          comm1.ExecuteNonQuery();
  18:      }
  19:      else
  20:      {
  21:          SqlCommand comm1 = new SqlCommand("insert phonetable (PhoneID, PhoneUrl) values (@par1, @par2)", conn);
  22:          comm1.Parameters.Add(new SqlParameter("par1", guid.ToString()));
  23:          comm1.Parameters.Add(new SqlParameter("par2", pushServiceUri));
  24:          comm1.ExecuteNonQuery();
  25:      }
  26:   
  27:      conn.Close();
  28:      conn.Dispose();
  29:  }

 

Фактически, мы связываемся с базой, чтобы проверить наличие устройства. Если устройства нет, то мы вносим его URL в базу, если оно есть, то обновляем URL (он может измениться). Интерес представляет класс RoleEnvironment, позволяющий получить доступ к настройкам роли.

Второй метод, RefreshData, возвращает последние N сообщений из базы. Тут лучше использовать LINQ, чтобы уменьшить количество строк кода, но я сейчас не буду усложнять код технологиями.

   1:  SqlConnection conn = new SqlConnection(RoleEnvironment.GetConfigurationSettingValue("DatabaseConnection"));
   2:  string n = RoleEnvironment.GetConfigurationSettingValue("NRecords");
   3:   
   4:  SqlCommand comm = new SqlCommand("select TOP (" + n + ") * from messagetable order by messagedate desc", conn);
   5:   
   6:  conn.Open();
   7:   
   8:  SqlDataReader res = comm.ExecuteReader();
   9:   
  10:  List<SMSMessage> SMSMessages = new List<SMSMessage>();
  11:   
  12:  while (res.Read())
  13:  {
  14:      SMSMessages.Add(new SMSMessage() { MessageValue = res["MessageText"].ToString(), DateTimeValue = res["MessageDate"].ToString() });
  15:  }
  16:   
  17:  conn.Close();
  18:  conn.Dispose();
  19:   
  20:  return SMSMessages.ToArray();

 

А вот последний метод представляет наибольший интерес, так как именно тут идет работа с очередью.

   1:  if ((login.Equals(RoleEnvironment.GetConfigurationSettingValue("Login"))) && (password.Equals(RoleEnvironment.GetConfigurationSettingValue("Password"))))
   2:  {
   3:   
   4:      SqlConnection conn = new SqlConnection(RoleEnvironment.GetConfigurationSettingValue("DatabaseConnection"));
   5:      SqlCommand comm = new SqlCommand("insert messagetable (MessageText, MessageDate) values (@par1, @par2)", conn);
   6:      comm.Parameters.Add(new SqlParameter("par2", DateTime.Now.ToUniversalTime().ToString()));
   7:      comm.Parameters.Add(new SqlParameter("par1", sms));
   8:   
   9:      conn.Open();
  10:   
  11:      comm.ExecuteNonQuery();
  12:   
  13:      conn.Close();
  14:      conn.Dispose();
  15:   
  16:      CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
  17:      {
  18:          configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
  19:   
  20:          RoleEnvironment.Changed += (sender, arg) =>
  21:          {
  22:              if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>()
  23:                  .Any((change) => (change.ConfigurationSettingName == configName)))
  24:              {
  25:                  if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)))
  26:                  {
  27:                      RoleEnvironment.RequestRecycle();
  28:                  }
  29:              }
  30:          };
  31:      });
  32:   
  33:      CloudStorageAccount acc = CloudStorageAccount.FromConfigurationSetting("StorageConnection");
  34:      CloudQueueClient queueClient = acc.CreateCloudQueueClient();
  35:   
  36:      CloudQueue queue = queueClient.GetQueueReference("smsqueue");
  37:      queue.CreateIfNotExist();
  38:   
  39:      queue.AddMessage(new CloudQueueMessage(sms));
  40:  }

 

Тут мы вставляем новое сообщение в нашу таблицу, а также размещаем его в очереди. Для работы очереди мы использовали управляемую библиотеку Microsoft.WindowsAzure.StorageClient.dll, которая облегчает нам работу с REST API. Итак, тут мы создаем объект типа CloudStorageAccount, который будет ассоциироваться с нашим Storage аккаунтом в Azure. После чего создаем объект типа CloudQueue, который будет ассоциироваться с нашей очередью. И с помощью метода CreateIfNotExist создает новую очередь или получаем ссылку на существующую. После этого можно добавлять элементы.

Теперь необходимо реализовать рабочую роль, добавить поддержку https и написать клиента. Но об этом в следующей статье.

Written by Sergiy Baydachnyy

13.04.2011 at 12:12

Опубликовано в Windows Azure, Windows Phone

Tagged with , , ,

Windows Phone 7: Application Bar

3 комментария

Глупая привычка, пришедшая с опытом создания Windows и Web приложений – создание всех интерфейсных элементов в окне приложения. Я сам на это купился, создавая свое первое приложение для Windows Phone 7 – Пятнашки. В основном окне этого приложения есть две кнопки: Refresh и About. Выглядят они странно (особенно About) и явно лишними. И все хорошо, пока в Вашем приложении нет полей редактирования, инициирующих вызов клавиатуры, закрывающей часть необходимых кнопок. Представьте приложение, имеющее поле редактирования на весь экран, а внизу экрана кнопку Send, позволяющую отправить сообщение. При вводе текста, кнопка Send будет перекрыта клавиатурой, а начинающий пользователь будет ломать голову, что с этим делать и как добраться до кнопки. Именно поэтому, Windows Phone 7 приложения имеют возможность использовать специальную панель для элементов управления Application Bar.

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

Application Bar не может быть перекрыт клавиатурой или другими элементами, а при вызове «сдвигает» весь интерфейс. Правда это происходит в том случае, если прозрачность установлена в 1. Если прозрачность установлена в значение меньшее 1, то Application Bar начинает перекрывать экран, используя эффект прозрачности.

Итак, попробуем создать простой Application Bar. Первое, что необходимо сделать, это определиться с иконками. Некоторые иконки доступны в папке C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.0\Icons\dark, а остальные нужно нарисовать самостоятельно. При создании иконки есть несколько рекомендаций: 1). Иконку рисуют белым цветом на прозрачном фоне. При изменении темы, такая практика позволяет сделать иконку видимой для пользователя; 2). Размер иконки должен быть 48 на 48 пикселей, но все, что Вы нарисовали, нужно уместить в прямоугольник 26 на 26 пикселей и расположить изображение по центру. Все от того, что любое изображение будет заключено в окружность радиусом 14. Если Ваше изображение будет больше, то возникнут пересечения.

Итак, чтобы добавить кнопку Refresh и About в Application Bar приложения, достаточно в MainPage.xaml добавить следующий код:

   1:      <phone:PhoneApplicationPage.ApplicationBar>
   2:          <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
   3:              <shell:ApplicationBarIconButton 
       IconUri="/Images/appbar.refresh.rest.png"  
       Text="Refresh" Click="ClickRefresh"/>
   4:              <shell:ApplicationBarIconButton 
       IconUri="/Images/appbar.questionmark.rest.png" 
       Text="About" Click="ClickAbout"/>
   5:          </shell:ApplicationBar>
   6:      </phone:PhoneApplicationPage.ApplicationBar>
 

Иконки я выбрал из SDK, установив Build Action в Content и Copy to Output Directory в Copy Always.

Вот такая панель у нас получилась:

clip_image001[1]

Естественно, чтобы панель работала, необходимо реализовать обработчики событий ClickAbout и ClickRefresh.

Добавим к этой панели возможность выбора языка интерфейса. Для этого расширим Application Bar двумя пунктами меню:

   1:      <phone:PhoneApplicationPage.ApplicationBar>
   2:          <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
   3:              <shell:ApplicationBarIconButton 
        IconUri="/Images/appbar.refresh.rest.png"  Text="Refresh" Click="ClickRefresh"/>
   4:              <shell:ApplicationBarIconButton 
        IconUri="/Images/appbar.questionmark.rest.png" Text="About" Click="ClickAbout"/>
   5:              <shell:ApplicationBar.MenuItems>
   6:                  <shell:ApplicationBarMenuItem Text="Russian" 
        Click="SetLanguageClick"></shell:ApplicationBarMenuItem>
   7:                  <shell:ApplicationBarMenuItem Text="English" 
        Click="SetLanguageClick"></shell:ApplicationBarMenuItem>
   8:              </shell:ApplicationBar.MenuItems>
   9:          </shell:ApplicationBar>
  10:      </phone:PhoneApplicationPage.ApplicationBar>

 

В результате мы увидим следующую панель:

clip_image002[1]

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

Проблема в Application Bar состоит в том, что это элемент управления Windows Phone 7, и он не поддерживает возможности Silverlight-элементов управления, например, связывание с данными. Несмотря на это, элемент управления поддерживает возможность динамического заполнения из языка программирования C#.

Так, класс ApplicationBar находится в пространстве имен Microsoft.Phone.Shell. Доступ к ApplicationBar осуществляется через соответствующее свойство класса PhoneApplicationPage.

В общем штука хорошая, поэтому пользуйтесь.

Written by Sergiy Baydachnyy

07.03.2011 at 20:41

Опубликовано в Windows Phone

Tagged with ,

Windows Phone 7: Публикация приложений

2 комментария

Поскольку украинские разработчики могут пробовать публиковать свои приложения (распространяемые бесплатно) прямо сейчас, то мне бы хотелось остановиться на вопросе публикации приложений, разобрав процесс и остановившись на основных ошибках.

Итак, первое, что необходимо сделать при публикации в Marketplace, это убедиться, что приложение обладает иконкой, отличной от той, которая используется по умолчанию. Таких иконок две: 62 на 62, используемая при отображении приложения в общем списке; 173 на 173, используемая при привязке приложения к основному окну.

Таким образом, если при тестировании Вы увидели иконку, аналогичную иконке ниже, то Ваше приложение не примут. Не совершайте этой ошибки.

clip_image001

Чтобы изменить иконку, в проекте Visual Studio достаточно заменить файлы ApplicationIcon.png и Background.png.

Если Вы добавили файлы со своими именами, то они должны находиться в корневой директории и иметь свойство Build Action установленным в Content. Далее можно отредактировать манифест приложения, используя дизайнер Visual Studio, перейдя в окно свойств проекта:

clip_image002

Имея готовый пакет для публикации, переходим к публикации приложения. Для этого нам нужны следующие компоненты:

· Сам пакет xap, содержащий приложение

· Иконки в формате png 173 на 173, 200 на 200, 99 на 99

· Минимум один скрин приложения 480 на 800

· Короткое описание приложения

Это тот минимум, который необходим для публикации приложений.

Вторая ошибка, которая возникает при публикации – неправильные скрины вашего приложения. Поскольку Вы будете снимать скрины используя эмулятор, ни в коем случае нельзя захватывать фрейм эмулятора. Нужно захватывать только окно приложения. Если Вы захватили фрейм, то приложение не примут.

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

clip_image004

Если Вы сделали это, то приложение примут.

Последняя, четвертая ошибка – приложение должно иметь окно типа About, содержащее информацию об авторе приложения, контактах для поддержки. Данное окно должно быть легко доступно. Если этого окна (даже примитивного MessageBox) нет, то приложение не примут.

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

Written by Sergiy Baydachnyy

07.03.2011 at 10:51

Опубликовано в Windows Phone

Tagged with ,