В предыдущей статье мы говорили о том, как сделать пробную (trial) версию Windows Phone 7 приложения. Эта версия, по сути, предназначена для того, чтобы приложение лучше продавалось. Сегодня мы узнаем, как можно заработать, даже создавая бесплатные приложения. А если говорить более конкретно, рассмотри, как можно добавить в приложения рекламу с помощью Microsoft Advertising SDK for Windows Phone 7.
Примите во внимание, что вывод денег, полученных от рекламы в Россию недоступен. Требуется искать обходные пути. Здесь ситуация почти как с PayPal.
С чего начать?
В первую очередь стоит посетить Microsoft Advertising pubCenter. На данном сайте описана последовательность шагов, необходимых для показа рекламы в Ваших приложениях: получение SDK, регистрация приложения, добавление рекламных элементов управления на страницы.
Так как данная серия ориентирована на разработчиков, здесь мы также рассмотрим работу с элементом управления «AdControl», служащим для показа рекламы.
Работа с элементом управления «AdControl».
Для начала Advertising SDK, в состав которого входит нужный нам элемент управления, требуется скачать и установить. Если Вы не читали предыдущий параграф и поэтому не посещали Microsoft Advertising pubCenter, то можете скачать SDK напрямую:
Нам требуется задать два обязательных свойства: AdUnitId и ApplicationId. Значения обоих свойств можно получить, зарегистрировав приложение в Microsoft Advertising pubCenter, создав там новый Ad Unit (рекламную единицу) и задав все необходимые настройки.
Использование тестовых значений при работе с «AdControl».
При разработке и тестировании приложений, содержащих рекламу, не стоит использовать настоящие значения AdUnitId и ApplicationId. Поскольку это будет выглядеть как нелегальное накручивания себе количества кликов и показов. Кроме того, «AdControl» может распознать, когда работает в эмуляторе, и не будет показывать настоящую рекламу в этом случае.
Далее я приведу тестовые значения, которые стоит использовать при отладке:
Ad Type
Ad Model
Size (WxH)
Test ApplicationId
Test AdUnitId
Text Ad
Contextual
480 x 80
test_client
TextAd
XXL Image Banner
Contextual
480 x 80
test_client
Image480_80
XL Image Banner
Contextual
300 x 50
test_client
Image300_50
В примере выше я использовал «Image480_80» баннер, который, как нетрудно догадаться из названия, будет занимать на экране область размером 480 на 80 пикселей.
Что такое «Ad Unit»?
Рекламные единицы (ad units) задают основные настройки рекламы. В том числе ту категорию рекламных объявлений, которая будет показываться. Допустим, мы создаём приложение «Таймер чистки зубов». Данное приложение поможет детям определить, сколько времени чистить каждую область рта. Поскольку родители тоже, скорее всего, захотят посмотреть, сколько их ребёнок чистит зубы, реклама в данном приложении будет в самый раз. Но не показывать же в этот момент рекламу, связанную с программированием на C++??? Требуется что-то более подходящее.
Для каждой рекламной единицы мы можем определить категории рекламных объявлений. Категорий достаточно много (примерно 385) и Вы можете выбрать несколько из них, но не более трёх. Вот как выглядит список категорий:
Для нашего приложения, помогающего чистить зубы, мы выберем, в том числе категорию «Health & Fitness – Dental Care».
После создания рекламной единицы, скопируем значения «AdUnitId» и «ApplicationId» в pubCenter, и зададим их в нашем элементе управления. Код будет выглядеть примерно так:
А так будет выглядеть приложение, запущенное в эмуляторе:
Profit!
Просто добавив рекламный элемент управления в приложение (предположим, что приложение используется реальными людьми), Вы начнёте замечать активность в pubCenter. Кроме того, в pubCenter можно найти несколько метрик, самой главной из которых для Вас является, конечно же, «Revenue» – доход.
Надо отметить, что есть интересный способ монетизации приложений. В дне #22 мы рассматривали, как сделать пробную версию приложения, но пробная версия не обязательно должна иметь урезанную функциональность. Она может быть полнофункциональной, просто в ней будет показываться реклама. Если пользователь заплатит деньги за приложение – реклама показываться перестанет. Данная модель относительно популярна.
Вчера мы говорили о том, как добавить приложение (игру) в хаб «Games». Сегодня мы узнаем, как сделать триальную (Trial) – пробную версию приложения или игры. На самом деле это не какая-то специализированная версия (.xap файл будет тот же), а просто некоторые дополнительные проверки в коде, благодаря которым в процессе работы приложение может изменять функциональность в зависимости от того, в каком режиме работает: полном или пробном. При покупке приложения в Marketplace, пользователь имеет возможность сначала приложение попробовать, а если оно ему понравится – уже заплатить деньги и использовать полную версию.
На иллюстрации процесса покупки видно, что внизу экрана присутствуют две кнопки – попробовать (try) и купить (buy). Типичным примером использования данной функциональности являются игры. Допустим, игра имеет 50 уровней. Тогда разработчик может в пробной версии оставить возможность пройти игру только до 5-ого уровня, а для прохождения остальных будет требоваться покупка игры.
Использование класса LicenseInformation.
В пространстве имён «Microsoft.Phone.Marketplace» есть, в том числе класс «LicenseInformation», который позволяет получить информацию о текущем статусе оплаты нашего приложения. Подключим нужное пространство имён:
using Microsoft.Phone.Marketplace;
Следующим шагом будет создание экземпляра класса «LicenseInformation»:
var li = new LicenseInformation();
Это почти всё, что требуется сделать. Класс «LicenseInformation» содержит функцию «IsTrial», возвращающую булевское значение и позволяющую определить, работаем ли мы в пробном режиме:
if (!li.IsTrial())
{
//Сделать что-то, доступное только платным пользователям
}
else
{
//Сделать что-то, доступное пробным пользователям
}
Тестирование пробного режима.
К сожалению, нет никакого встроенного способа переключения между пробным и полным режимами при разработке приложения («IsTrial()» на эмуляторе возвращает false). Но я использую достаточно простой способ, чтобы иметь возможность отлаживать пробную версию. Для этого я проверяю, находимся ли мы в режиме отладки, и если да, то сохраняю в настройках приложения параметр «trialMode» в значении «true». Делается это в файле «App.xaml.cs»:
В этом случае тестируется пробный режим, а для тестирования полного режима можно закомментировать строчку «_settings["trialMode"] = true;».
Теперь, проверяя в каком режиме работает приложение, требуется читать ещё и значение из настроек. Вот полный код нового варианта такой проверки:
LicenseInformation _li = new LicenseInformation();
IsolatedStorageSettings _settings = IsolatedStorageSettings.ApplicationSettings;
// Constructor
public MainPage()
{
InitializeComponent();
if (_li.IsTrial() || (bool)_settings["trialMode"])
{
//Сделать что-то, доступное пробным пользователям
}
else
{
//Сделать что-то, доступное только платным пользователям
}
}
Может это и не лучший способ, но он работает.
Определить, работает ли приложение в тестовом или полном режиме очень просто. Вам остаётся только подумать над тем, какую функциональность сделать доступной в тестовом режиме, а это уже сложнее.
Многие разработчики, создающие Windows Phone 7 Silverlight приложения, хотят использовать Silverlight, в том числе и для написания игр. Хотя основной платформой, позволяющей создавать игры для телефонов, является XNA, Silverlight также является мощной платформой для работы с графикой, поэтому игры, написанные на Silverlight, имеют такое же право на существование, как и XNA игры.
Если Вы создадите Silverlight Windows Phone 7 приложение (или XNA игру) и запустите его на эмуляторе, то данное приложение будет отображаться в списке всех установленных приложений телефона (данный список появляется при нажатии стрелочки вправо на главном экране). Но на реальном телефоне игры отображаются не в данном списке, а в специальном хабе «Games». Есть очень простой способ сделать так, чтобы Ваши приложения тоже отображались в данном хабе. Но делать это стоит, только если приложение действительно являются игрой. Попытка разместить приложение, не являющееся игрой, в хабе «Games» – повод для отказа в публикации приложения в Marketplace.
Помните день #1?
В первом дне данной серии мы рассматривали все файлы, входящие в проект Silverlight Windows Phone 7 приложения. В том числе и файл «WMAppManifest.xml» (он находится в папке «Properties»). Данный файл как раз и позволяет указать, что наше приложение является игрой и будет размещаться в хабе «Games».
Внутри файла «WMAppManifest.xml» находятся метаданные приложения, в том его имя, иконка, путь к стартовой странице и.т.д.
Кстати, изменение стартовой страницы – хороший способ ручного тестирования приложения. Например, вместо того, чтобы при отладке вначале загружать какую-то базовую страницу приложения, а уже потом с помощью навигации переходить на ту страницу, которую требуется отладить, можно сразу указать отлаживаемую страницу в качестве стартовой, а также передать ей некоторые параметры. Например, укажем, что вначале будет загружаться страница «ProductPage.xaml»:
<Tasks>
<DefaultTask Name ="_default" NavigationPage="ProductPage.xaml?id=42"/>
</Tasks>
Естественно, перед этим страницу «ProductPage.xaml» надо создать. Но вернёмся к задаче размещения нашего приложения в хабе «Games». Для этого изменим свойство «Genre» – жанр тега «App». Вот как выглядит данный тег по умолчанию (естественно, Ваших приложениях многие значения будут отличаться):
<App xmlns="" Genre="apps.normal"
ProductID="{6b6bf47b-9652-47d3-8758-fd1b11f99971}"
Title="Day22_AppsVsGames"
RuntimeType="Silverlight" Version="1.0.0.0"
Author="SergeyPugachev"
Description="An amazing demo on how to change your app's location."
Publisher="pugachve.info">
Значением жанра по умолчанию является «apps.normal». Поменяем данное значение на используемое для игр: «apps.games».
Теперь после запуска приложения на эмуляторе оно не будет отображаться в стандартном списке приложений, а так как хаба «Games» на эмуляторе нет, то приложение как будто исчезнет с телефона (запускаться из Visual Studio оно, конечно, продолжит). Далее приведу модифицированную версию тега «App»:
<App xmlns="" Genre="apps.games"
ProductID="{6b6bf47b-9652-47d3-8758-fd1b11f99971}"
Title="Day22_AppsVsGames"
RuntimeType="Silverlight" Version="1.0.0.0"
Author="SergeyPugachev"
Description="An amazing demo on how to change your app's location."
Publisher="pugachve.info">
Теперь при отладке приложения на реальном устройстве, Вы найдёте его в хабе «Games».
На данной фотографии моё приложение Вы найдёте в левом нижнем углу. Оно имеет стандартную иконку.
Вчера мы говорили об элементе управления «Map», который позволяет добавить картографию в Ваши приложения. Сегодня мы от элементов управления перейдём к более системным вещам. Мы рассмотрим уведомления (Push Notifications). Наверное, это одна из самых важных статей в данной серии.
Если Вы не знакомы с концепцией уведомлений, то всё достаточно просто: приложение вместо того, чтобы периодически отправлять запросы на сервер на предмет наличия новых данных, просто ждёт, когда сервер пошлёт уведомление, что новые данные появились. Более того, в некоторых случаях, когда сервер отправляет уведомление, Ваше приложение может быть даже не запущено. Ничего страшного в этом нет.
Почему уведомления?
Одним из главных преимуществ является экономия батареи телефона. Постоянная отправка запросов на сервер для проверки на наличие новых данных – это достаточно энергозатратный процесс. А для телефона заряд батарее невероятно важен. Может быть даже важнее всего остального. Его никогда не хватает. И пользователь часто предпочтёт не пользоваться Вашим приложением вообще, чем быстро сажать батарею.
Кроме того, даже если Ваше приложение не запущено, посредством уведомлений Вы можете сообщить пользователю, о том, что происходит что-то интересное, либо просто есть какая-то новая информация. Пользователь сможет открыть Ваше приложение, нажав на уведомление и уже в приложении получить дополнительную информацию.
Как работают уведомления.
Есть несколько видов уведомлений, но все они работают схожим образом. Во-первых, для работы уведомлений обязательно требуется соединение с интернетом, а дальше происходит следующее:
При первом запуске на телефоне приложение обращается к сервису уведомлений (Microsoft’s Push Notification service), который возвращает URI. С помощью данного URI серверная часть будет оправлять уведомления на телефон.
Когда требуется отправить уведомление, серверная часть передаёт на ранее сохранённый URI сообщение определённого формата. Сервис уведомлений передаст данное сообщение на телефон в форме Toast уведомления, Live Tile обновления или просто данных приложению.
Данная статья описывает то, как работают уведомления. Если Вы хотите увидеть пример того, как шаг за шагом реализовать уведомления в своём приложении, после прочтения данной статьи откройте Windows Phone Developer Training Kit и выполните практическое занятие.
Типы уведомлений.
Я уже говорил, что существуют три типа уведомлений. Далее приведу их список с кратким описанием каждого типа:
Raw уведомления – этот тип уведомлений используется для отправки «сырых» данных приложению, когда само приложение запущено. Телефон никак не отображает данный тип уведомлений. Приложение просто получает данные от сервера.
Toast уведомления – в отличие от Row уведомлений, данный тип уведомлений будет получен, если Ваше приложение не запущено. Toast уведомления всплывают полоской в верхней части экрана. Но, если Toast уведомления будут всплывать слишком часто, это может начать раздражать пользователя. Данный тип уведомления не предназначен для отправки данных приложению, для этого Вам всё равно надо передавать Raw уведомления. При нажатии на Toast уведомление пользователь быстро переключится в Ваше приложение.
Live Tile обновления – если Ваше приложение закреплено на стартовой странице телефона, Вы можете обновить Tile приложения (квадрат на стартовой странице). Можно обновить фон квадрата и/или добавить число от одного 0 до 99.
Получение URI от сервиса уведомлений.
Для получения URI, который будет использовать серверная часть Вашего приложения при отправке уведомлений на телефон, достаточно написать всего около десяти строчек кода. В первую очередь подключите пространство имён «Microsoft.Phone.Notification». Далее создаётся объект класса «HttpNotificationChannel». В конструктор класса «HttpNotificationChannel» передаётся уникальное имя канала. Класс «HttpNotificationChannel» используется для взаимодействия с сервисом уведомлений (Push Notification service – PNS). Всё взаимодействие происходит в отдельном потоке, а для получения URI требуется подписаться на событие. В обработчике события мы уже можем получить URI. В примере ниже полученный URI выводится в окно «Output» в Visual Studio как отладочная информация. Отображать URI на экране не требуется, так как это глубоко внутренняя информация.
public partial class MainPage
{
private readonly HttpNotificationChannel _channel;
public MainPage()
{
InitializeComponent();
_channel = new HttpNotificationChannel("pugachev.info" + DateTime.Now.Ticks);
_channel.ChannelUriUpdated += ChannelChannelUriUpdated;
_channel.ErrorOccurred += ChannelErrorOccurred;
_channel.Open();
_channel.BindToShellToast();
}
static void ChannelErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
{
Debug.WriteLine("An error occured while initializing the notification channel");
Debug.WriteLine(e.Message);
}
static void ChannelChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
Debug.WriteLine(e.ChannelUri);
}
}
При выполнении данного примера кода я получил следующий URI (в вашем случае он, естественно будет другим):
Поле получения URI передайте его каким-то образом серверной части Вашего приложения.
Отправка уведомления.
Код отправки уведомления, приведённый ниже, выполняется на сервере. Мы будем отправлять Toast уведомление. При этом отправляется HTTP сообщение определённого формата на ранее полученный URI:
private static void SendToastNotification()
{
var request = (HttpWebRequest)WebRequest.Create("http://db3.notify.live.net/throttledthirdparty/01.00/AAERNQbcM6D5TaCKRQDXVyGZAgAAAAADAQAAAAQUZm52OjIzOEQ2NDJDRkI5MEVFMEQ");
request.Method = "POST";
request.ContentType = "text/xml";
request.Headers.Add("X-NotificationClass", "2");
request.Headers.Add("X-WindowsPhone-Target", "toast");
const string notificationData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Toast>" +
"<wp:Text1>45 дней c Windows Phone 7</wp:Text1>" +
"<wp:Text2>Уведомления</wp:Text2>" +
"</wp:Toast>" +
"</wp:Notification>";
var contents = Encoding.UTF8.GetBytes(notificationData);
request.ContentLength = contents.Length;
using (var requestStream = request.GetRequestStream())
{
requestStream.Write(contents, 0, contents.Length);
}
using (var response = (HttpWebResponse)request.GetResponse())
{
var notificationStatus = response.Headers["X-NotificationStatus"];
var notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
var deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];
Console.WriteLine("Статус: {0}. Статус канала: {1}. Статус устройства: {2}.",
notificationStatus,
notificationChannelStatus,
deviceConnectionStatus);
}
}
Как видите, код достаточно длинный. Но пример полностью показывает, как отправить уведомление. Попробуйте выполнить данный пример, и Вы увидите, каким мощным инструментом являются уведомления. С их помощью Ваше приложение может чаще оказаться перед глазами пользователя.
Иконка на иллюстрации – это иконка приложения. Её достаточно легко поменять.