Как стать автором
Обновить

Делаем приложение push'истым

Время на прочтение 6 мин
Количество просмотров 18K

Хочу поделиться своим user developer experience от внедрения WNS push notifications в приложение Windows Store. Приглашаю всех прочитать мои непутевые заметки о том, как я делал свое приложение белым и push'истым.



Ребята, я прочитал вот эту статью: «О проблемах и решении задачи доставки пуш-уведомлений миллионам устройств на различных платформах».
И еще вот эту: «Как отправлять push-уведомления на Windows Universal app».
И вот эта мне понравилась: «Работаем с уведомлениями в Windows Phone 8.1».
Довольно понятной оказалась вот эта статья на не родном и не всегда понятном английском языке: «Windows Azure Notification Hubs: Tags and creating a breaking news app».
Видео еще с прошлогоднего Build-а оказалось интересным и все еще актуальным.

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

По адресу https://portal.azure.com/ можно управлять своей учетной записью, просматривать действия и ресурсы, управлять подпиской. Но если вы хотите создавать различные объекты, а после управлять ими, то вам по адресу: https://manage.windowsazure.com

Зайдя по адресу https://manage.windowsazure.com и выбрав в меню пункт «Мобильные службы», вы сможете создать мобильную службу, нажав на ссылку «Создать мобильную службу»



Далее пошагово можете выбрать имя для вашего URL-адреса и задать параметры базы данных.




Я ограничился бесплатной базой данных и никакие дополнительные параметры не настраивал. Дефолтные параметры меня вполне устраивают.

Альтернативно можно создать мобильную службу, нажав на кнопку «СОЗДАТЬ» в нижнем левом углу (смотрите первый скриншот). И в первом и во втором варианте шаги приблизительно одинаковые.



Создав службу любым из способов, мы получим такое вот окошечко:



Дважды кликнув на название службы, мы попадаем в панельку управления службой:



Выбираем пункт PUSH и лицезрим пустые поля с секретом клиента и SID пакета:



До привязки приложения и поле секрет клиента, и поле SID пакета не содержат данные.

Отвлечемся от веб-сайта и поработаем с приложением, в которое мы хотим добавить push-уведомления. Для того чтобы привязать наше приложение к только что созданному хабу, первым делом нам нужно открыть наше приложение в Visual Studio.

Далее вызвав контекстное меню на названии проекта (именно проекта, а не решения), получим возможность добавить в приложение Push Notification. В моей англоязычной версии студии это выглядит так:



Следующими шагами «Next-Next» мы выбираем наше приложение в Store и недавно созданный сервис:



Этих действий уже достаточно для того, чтобы ваше приложение смогло получать push уведомления. Если обновим страничку на сервере, то сможем увидеть, что поля «секрет клиента» и «SID пакета» уже заполнены.
После операции добавления Push notifications, некоторый код будет добавлен в ваше приложение автоматически.
В файл App.xaml.cs к объявлениям переменных класса App будет добавлена следующая public переменная:

public static Microsoft.WindowsAzure.MobileServices.MobileServiceClient redactorClient = new Microsoft.WindowsAzure.MobileServices.MobileServiceClient("https://redactor.azure-mobile.net/", "TSIFgOYeMNUdwIViawpdeIJKXlcVIV57");

В том же App.xaml.cs в конец кода обработки события OnLaunched будет добавлена регистрация канала:

RedactoR.redactorPush.UploadChannel(); 

Автоматически будет создана папка Services, внутри которой будет создана папка MobileServices, внутри нее еще одна папка с именем созданного сервиса «redactor» и уже внутри этой папки файл push.register.cs в котором и находится смерть Кощея метод UploadChannel, выполняемый при запуске приложения.
Развернем приложение и запустим его, дабы оно зарегистрировалось в хабе.

Создав привязку, вернемся к сайту https://manage.windowsazure.com Если вы не закрывали страницу, то можете кликом на имя хаба попасть на его страницу. Если закрыли, то это же можно сделать из общего меню слева:



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

Из хаба, зайдя на закладку «Отладка», можно отправить тестовое push уведомление.



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

Попробуйте отправить всплывающее уведомление. Если все ОК, то вы все сделали правильно, и мы с вами пойдем дальше и немножко усложним.

Обратите внимание на поле ТЭГ «ОТПРАВИТЬ» на скриншоте. При регистрации приложения в хабе мы можем задать определенные ключевые слова для конкретной регистрации. Скажем, у нас новостное приложение с различными категориями новостей. В таком случае мы можем рассылать определенные уведомления, скажем, только пользователям, которые предпочитают новости о спорте.

Для этого нам нужно будет изменить код UploadChannel. Изначально он выглядит так:

var channel = await Windows.Networking.PushNotifications.PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
            try
            {
                await App.redactorClient.GetPush().RegisterNativeAsync(channel.Uri);
            }
            catch (Exception exception)
            {
                HandleRegisterException(exception);
            }

Если заменить строку:

await App.redactorClient.GetPush().RegisterNativeAsync(channel.Uri);

На:

string[] PushTags = { "ралли", "формула 1" };
await App.redactorClient.GetPush().RegisterNativeAsync(channel.Uri, PushTags);

то можно зарегистрировать приложение для получения определенных новостей, отправленных с тегом «ралли» или «формула 1». В реальной программе элементы массива PushTags, разумеется, устанавливаются динамически.

В моем случае мне захотелось регистрировать пользователей, которые используют русский язык интерфейса, с тегом «RU», а тех, кто использует английский, с тегом «EN» и присылать им различные сообщения. Те небольшие изменения, которые я сделал, это заменил строку:

await App.redactorClient.GetPush().RegisterNativeAsync(channel.Uri);

На:

  string tempstr;
   tempstr = Convert.ToString(Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride);
                if (tempstr.ToUpper() == "EN")
                {
                    string[] PushTags = { "EN" };
                    await App.redactorClient.GetPush().RegisterNativeAsync(channel.Uri,PushTags);
                }
                else
                {
                    string[] PushTags = { "RU" };
                    await App.redactorClient.GetPush().RegisterNativeAsync(channel.Uri, PushTags);
                }

Теперь приложение регистрируется в хабе либо с тегом «RU», либо с тегом «EN», в зависимости от текущего языка приложения. В панели управления сайта можно отключить «Произвольную широковещательную передачу» и отправить сообщение только тем приложениям, которые были зарегистрированы с тегом нужного языка (т.е. указав в поле ТЕГ «ОТПРАВИТЬ» либо «RU», либо «EN»)

Отправка уведомлений


Из интерфейса Azure удобно отправлять тестовые уведомления, но на них наложены определенные ограничения – рассылка идет только 10-ти произвольным пользователям.

Отправить уведомление всем пользователям можно различными способами. Обычно предлагается создать мобильный сервис. Но более удобным и простым для разработчика способом является создание консольного приложения.
Этот способ довольно понятно излагается в следующем руководстве:
«Getting Started with Notification Hubs».

Коротенько опишу этот способ (он совсем простой).

Создадим простое консольное приложение. С помощью поиска по NuGet менеджеру текста «WindowsAzure.ServiceBus» найдем и установим пакет Microsoft Azure Service Bus. С помощью консоли NuGet менеджера его же можно установить командой:

Install-Package WindowsAzure.ServiceBus

Добавим пространство имен:

using Microsoft.ServiceBus.Notifications;

И всего-навсего один простой метод:

private static async void SendNotificationAsync()
{
    NotificationHubClient hub = NotificationHubClient
        .CreateClientFromConnectionString("<строка подключения с полным доступом>", "<имя хаба>");
    var toast = @"<toast><visual><binding template=""ToastText01""><text id=""1"">Привет, App!</text></binding></visual></toast>";
    await hub.SendWindowsNativeNotificationAsync(toast);
}

Вот именно здесь нам и будет нужна строка подключения, которую можно получить на сайте в разделе хаба. Кликаем на ссылку «Просмотреть строку подключения» (см. скриншот выше) и копируем значение DefaultFullSharedAccessSignature, которое выглядит приблизительно так:
Endpoint=sb://redactorhub-ns.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=kjeJDdtIdvE+3dh3hyIRlkvPF3Ns0zPbewouDHMwe4v3=
Вот этот текст и вставляем вместо <строка подключения с полным доступом>, а вместо <имя хаба> вставим имя хаба (в моем случае это redactorhub).

В метод main добавляем всего 2 строки кода:

      SendNotificationAsync();
      Console.ReadLine();

Теги:
Хабы:
+7
Комментарии 1
Комментарии Комментарии 1

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн