Статьи

Windows Phone 8: кратко: локализация, магазин Windows Phone и встроенные покупки

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

Одной из отличительных особенностей приложений Windows Phone является то, что они поддерживают пробный режим, который позволяет загружать их из Магазина Windows Phone в качестве пробной версии с ограниченными функциями. Как только пользователи решают приобрести полное приложение, им не нужно загружать его с нуля; Магазин просто загрузит обновленный сертификат, который разблокирует все ранее заблокированные функции.

С точки зрения разработчика, управление пробной версией простое. Пространство имен Windows.ApplicationModel.Store содержит класс LicenseInformation , который предлагает свойство IsTrial . Если его значение равно true , это означает, что приложение было установлено в пробном режиме, поэтому мы должны заблокировать функции, которые мы не хотим включать; в противном случае пользователь приобрел его, поэтому все функции могут быть доступны.

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

1
2
3
4
5
6
7
8
9
LicenseInformation info = new LicenseInformation();
if (info.IsTrial)
{
    MessageBox.Show(«Application is running in trial mode»);
}
else
{
    MessageBox.Show(«Application is running in full mode!»);
}

Одним из лучших способов увеличить продажи и количество загрузок приложения является поддержка нескольких языков. Шаблон Windows Phone 8 по умолчанию в Visual Studio уже поддерживает локализацию, включая папку с именем Resources . Он содержит все файлы ресурсов, которые являются простыми файлами XML со специальным расширением .resx .

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

Стандартный шаблон создает файл с именем AppResources.resx внутри папки Resources , который ссылается на стандартный язык (обычно английский).

Поддерживать новый язык легко. Просто щелкните правой кнопкой мыши свой проект в обозревателе решений и выберите « Свойства» . В окне поддерживаемых культур отобразятся все доступные языки. Когда вы добавляете новые языки, выбирая их в списке, Visual Studio автоматически создает новый файл AppResources именем AppResources.xx-yy.resx в папке Resources, где xx-yy — это код культуры выбранного языка (например, если вы добавили итальянский, он создаст файл с именем AppResources.it-IT.resx ).

Visual Studio предлагает полезный визуальный редактор для работы с файлами ресурсов. Он отображает все значения внутри таблицы, где вы можете легко определить ключ, его значение и необязательный комментарий. Чтобы получить к нему доступ, просто дважды щелкните файл ресурса в папке « Ресурсы ».

В дополнение к стандартному файлу ресурсов шаблон Windows Phone также включает класс LocalizedStrings , который действует как оболочка между файлом локализации и XAML. Вы можете найти его как глобальный ресурс в файле App.xaml :

1
2
3
<Application.Resources>
    <local:LocalizedStrings xmlns:local=»clr-namespace:Localizzazione» x:Key=»LocalizedStrings»/>
</Application.Resources>

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

1
<TextBlock Text=»{Binding Source={StaticResource LocalizedStrings}, Path=LocalizedResources.SampleText}» />

Благодаря классу LocalizedStrings мы можем получить доступ к каждому значению в файле ресурсов, просто используя синтаксис LocalizedResources.MyKey , где MyKey — это ключ, который идентифицирует текст, который вы хотите отобразить.

Если вы хотите получить доступ к строке ресурса непосредственно из кода, вам придется использовать одноэлементный класс AppResources , как показано в следующем примере:

1
2
3
4
private void OnShowMessageClicked(object sender, RoutedEventArgs e)
{
    MessageBox.Show(AppResources.SampleText);
}

Microsoft создала полезное расширение Visual Studio под названием Multilingual App Toolkit, которое можно загрузить из Центра разработки Windows . Инструмент не меняет работу локализации; он всегда будет основан на файлах ресурсов, к которым приложение обращается с помощью класса LocalizedString .

В следующем списке подробно описаны некоторые основные преимущества набора многоязычных приложений:

  • Одним из наиболее трудоемких аспектов работы с локализацией является ручное копирование всех новых значений, добавленных вами на базовом языке, во все остальные файлы ресурсов. Многоязычный App Toolkit сделает это за вас. В процессе сборки он скопирует все новые ключи, добавленные в файл AppResources.resx во все остальные файлы ресурсов.
  • Он предлагает лучший визуальный интерфейс для управления переводами. Вы сможете сразу определить новые ключи для перевода и установить другой статус перевода.
  • Он поддерживает сервисы Bing для автоматического перевода предложений. Очевидно, что вы не можете полностью полагаться на автоматические переводы, но они могут стать хорошим началом вашего процесса локализации.
  • Он способен автоматически генерировать псевдоязык, что позволяет сразу идентифицировать непереведенные ресурсы и лучше понять, сколько места занимает текст в пользовательском интерфейсе.

После установки инструментария его необходимо включить для своего проекта в меню « Инструменты» Visual Studio, выбрав параметр « Включить многоязыковой инструментарий приложения» . После включения Visual Studio будет работать с файлами .xlf вместо файлов .resx (за исключением основного языка). В процессе компиляции инструментарий сгенерирует все необходимые файлы .resx для вас.

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

Многоязычный набор инструментов приложения

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

Вы можете изменить это поведение, например, если вы хотите дать пользователям возможность выбирать язык, который они предпочитают, независимо от языка телефона. Для этого вам нужно будет установить другой код культуры при создании класса App (объявленного в файле App.xaml.cs ):

1
2
3
4
5
6
public App()
{
    CultureInfo culture = new CultureInfo(«it-IT»);
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
}

После того как вы определили объект CultureInfo , передав код культуры в качестве параметра, вы можете назначить его двум различным свойствам объекта Thread.CurrentThread :

  • CurrentCulture — это культура приложения, которая используется для определения таких функций, как формат даты и времени, валюта и т. Д.
  • CurrentUICulture — это культура пользовательского интерфейса, которая используется для понимания того, какой файл ресурсов выбрать.

Этот подход также необходим, если вы хотите использовать псевдоязык, сгенерированный Multilingual App Toolkit в процессе тестирования. Поскольку псевдоязык не является официальным языком, поддерживаемым платформой, вам придется форсировать его, используя код культуры qps-ploc , как показано в следующем примере:

1
2
3
4
5
6
public App()
{
    CultureInfo culture = new CultureInfo(«qps-ploc»);
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
}

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

Как упоминалось в первой статье , Windows Phone Store является единственным способом распространения приложений среди ваших пользователей, если вы не занимаетесь распространением на корпоративном уровне. Вам понадобится платная учетная запись разработчика, которую можно приобрести в Центре разработки Windows . Плата составляет 19 долларов в год, если вы не являетесь студентом, подписавшимся на программу DreamSpark, и в этом случае доступ бесплатный. Аналогичное преимущество предоставляется подписчикам MSDN: на странице преимуществ вы можете получить токен, который позволяет бесплатно зарегистрироваться.

Помимо годовой платы, Microsoft применяет подход с распределением доходов: 30% стоимости приложения остается за Microsoft, а остальные 70% отдаются разработчику. Конечно, этот обмен не применяется, если приложение бесплатное.

Как только ваша учетная запись разработчика активирована и ваше приложение готово, вы можете отправить его на портал по адресу dev.windowsphone.com . В ходе этого процесса вам нужно будет определить функции маркетинга приложения, такие как цена, метаданные и тип распространения. После этого отправка завершается, и начинается процесс сертификации. Приложения не публикуются в Магазине автоматически; сначала они должны пройти процесс сертификации, который проверяет приложение как с технической, так и с точки зрения содержания.

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

Ручные тесты проверяют содержание приложения. Некоторые виды контента, как порнография, чрезмерное насилие и т.д., не допускаются и приведут к провалу сертификации.

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

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

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

Другим важным параметром, который нужно установить на этом этапе, является канал распространения. Существует три способа распространения приложения для Windows Phone:

  • Публичный магазин : приложение может быть обнаружено и загружено любым пользователем.
  • Скрытый : приложение все еще доступно в публичном магазине, но пользователи не могут его обнаружить. Единственный способ найти его — использовать прямую ссылку, которая создается при публикации приложения.
  • Бета : приложение не может быть обнаружено пользователями, и, кроме того, только авторизованным пользователям будет разрешено загружать его. Пользователи авторизуются с учетной записью Microsoft, с которой они зарегистрировали телефон. Вы сможете включить до 10 000 пользователей в процессе отправки. Этот канал распространения был создан для поддержки бета-тестирования; однако в этом случае приложение фактически не будет тестироваться, но будет доступно для выбранных пользователей в течение двух часов после отправки приложения. Срок действия бета-версии автоматически истекает через 90 дней после того, как оно было отправлено впервые, независимо от последующих обновлений.

Второй шаг требует больше времени для завершения, так как вам придется предоставить всю информацию о приложении, которая будет отображаться в Магазине Windows Phone.

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

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

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

Информация о приложении отображается в магазине

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

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

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

Если приложение не проходит процесс сертификации, на панели инструментов вы найдете файл PDF, содержащий полный отчет. Он подробно расскажет вам, что пошло не так и что вы должны сделать, чтобы исправить выявленные проблемы.

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

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

Покупки в приложениях всегда были разрешены, но в Windows Phone 8 были введены специальные API и поддержка бэкэнда Microsoft. Ранее разработчик отвечал за создание серверной инфраструктуры, управление платежами и подключение клиента.

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

Важно подчеркнуть, что внутриигровые покупки через сервисы Microsoft разрешены только для виртуальных продуктов (таких как новые функции, игровые уровни и т. Д.); его нельзя использовать для покупки физических товаров.

Windows Phone поддерживает два вида продуктов:

  • Товары длительного пользования — это продукты, которые можно приобрести только один раз, например, функции приложений, пакеты уровней и т. Д.
  • Расходные материалы — это продукты, которые можно приобрести снова после их потребления, например, виртуальные монеты.

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

Есть два ключевых свойства:

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

После того как вы определили все свойства, вы можете начать работать с продуктами в вашем приложении. Вероятно, первым требованием является отображение списка доступных продуктов, которые пользователи могут купить. Эта цель достигается с CurrentApp класса CurrentApp который принадлежит пространству имен Windows.ApplicationModel.Store .

1
2
3
4
5
6
7
private async void OnListStuffClicked(object sender, RoutedEventArgs e)
{
    ListingInformation listing = await CurrentApp.LoadListingInformationAsync();
    List<ProductListing> productListings = listing.ProductListings.Values.ToList();
 
    Purchases.ItemsSource = productListings;
}

Класс CurrentApp предоставляет метод LoadListingInformationAsync() , который возвращает объект ListingInformation котором хранится вся информация о доступных продуктах.

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

01
02
03
04
05
06
07
08
09
10
<phone:LongListSelector x:Name=»Purchases» SelectionChanged=»OnSelectedPurchaseChanged»>
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation=»Horizontal» Margin=»15, 0, 0, 20″>
                <TextBlock Text=»{Binding Path=Name}» Margin=»0, 0, 20, 0″ />
                <TextBlock Text=»{Binding Path=FormattedPrice}» />
            </StackPanel>
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>

Каждый объект ProductListing содержит одно и то же свойство, которое мы присвоили продукту в Магазине. В предыдущем примере мы показываем название ( Name ) и цену ( FormattedPrice ) продукта.

Как только у вас есть список продуктов, вы должны управлять процессом покупки. Опять же, нам нужно использовать класс CurrentApp , который предлагает метод RequestProductPurchaseAsync() . В качестве параметра мы собираемся передать объект ProductListing выбранный пользователем.

1
2
3
4
5
private async void OnSelectedPurchaseChanged(object sender, SelectionChangedEventArgs e)
{
    ProductListing selectedPurchase = Purchases.SelectedItem as ProductListing;
    await CurrentApp.RequestProductPurchaseAsync(selectedPurchase.ProductId, true);
}

Как только продукт приобретен, вы можете проверить его состояние с помощью коллекции CurrentApp.LicenseInformation.ProductLicenses . Он содержит все поддерживаемые продукты со статусом соответствующей лицензии. Каждый продукт идентифицируется ключом, который является уникальным идентификатором, который мы присвоили при создании на портале.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    if (CurrentApp.LicenseInformation.ProductLicenses.ContainsKey(«CoolProduct»))
    {
        ProductLicense license = CurrentApp.LicenseInformation.ProductLicenses[“CoolProduct”];
        if (license.IsActive)
        {
            //Unlock the feature.
        }
        else
        {
            //Lock the feature.
        }
    }
}

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

Для расходных материалов процесс покупки такой же. Единственное отличие состоит в том, что после его использования нам необходимо сообщить об этом, чтобы его можно было «разблокировать» для повторной покупки.

Мы можем сообщить об этом, вызвав метод ReportProductFullfillment() класса CurrentApp , который требует в качестве параметра объект ProductLicense который идентифицирует продукт.

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

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

По этой причине Microsoft предоставила тестовую библиотеку под названием MockIAP . Его цель — «смоделировать» реальные API-интерфейсы покупки в приложении, чтобы операции не выполнялись с реальной службой Microsoft, а использовали поддельные продукты, определенные в приложении.

MockIAP можно скачать с MSDN и добавить в ваше решение. API-интерфейсы, которые он предлагает, такие же, как и в собственном SDK; единственное отличие состоит в том, что они принадлежат пространству имен MockIAPLib вместо пространства имен Windows.ApplicationModel.Store .

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

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

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

Следующий код показывает пример инициализации:

Мы создаем два продукта: долговечный, идентифицируемый ключом CoolProduct , и расходный, идентифицируемый ключом CoolProductConsumable . Каждый продукт идентифицируется классом ProductListing (тот же класс, который мы использовали с реальными сервисами), и мы можем использовать его для определения всех свойств продукта, которые обычно извлекаются из сервисов Microsoft, таких как имя, тип, цена и т. Д.

Мы добавляем каждый продукт, используя метод AddProductListing() класса MockIAP . После добавления продуктов мы можем использовать стандартные API для покупок в приложении. Операции будут выполняться локально с поддельными продуктами вместо реальных сервисов, но поведение будет точно таким же. Мы сможем перечислять, покупать и потреблять доступные продукты.

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

  • Как локализовать приложение так, чтобы оно обращалось к более широкой аудитории.
  • Как работает Windows Phone Store и процесс сертификации. Отправка приложения является важным шагом, поскольку нам необходимо принять много важных маркетинговых решений, таких как цена приложения, страны, в которых оно будет доступно, и т. Д.
  • Как увеличить доход за счет поддержки покупок в приложении.

Это руководство представляет собой последнюю главу Windows Phone 8 Succinctly , бесплатной электронной книги от команды Syncfusion. Мы надеемся, что вам понравилась эта серия статей о разработке приложений для Windows Phone 8!