Статьи

Обновление пользователей с помощью уведомлений в приложениях для Windows Phone

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

Вы можете скачать полный проект с GitHub .

Для начала создайте новый проект в Visual Studio, выберите Windows Phone из списка и назовите проект.

Новый проект

Откройте MainPage.xaml и добавьте следующий код в теги сетки.

<ScrollViewer Margin="0,0,0,-1"> <StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Image and Text"/> <ToggleSwitch x:Name="ImageAndText" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Image Collection"/> <ToggleSwitch x:Name="ImageCollection" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Cyclic"/> <ToggleSwitch x:Name="Cyclic" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Badge"/> <ToggleSwitch x:Name="Badge" HorizontalAlignment="Left" Margin="0,0,0,10" FontFamily="Global User Interface"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Iconic Tile"/> <ToggleSwitch x:Name="IconicTile" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> <StackPanel> <TextBlock FontSize="20" Text="Block and Text"/> <ToggleSwitch x:Name="BlockAndText" HorizontalAlignment="Left" Margin="0,0,0,10"/> </StackPanel> </StackPanel> </ScrollViewer> 

Вид дизайна теперь должен выглядеть так:

Главная страница

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

Прежде чем мы начнем

Чтобы упростить следующие шаги, мы импортируем некоторые пространства имен в MainPage.xaml.cs .

 using Windows.UI.StartScreen; using Windows.Data.Xml.Dom; using Windows.UI.StartScreen; using Windows.UI.Xaml; 

Внутри класса MainPage объявляют эти глобальные переменные, не все будут использоваться сразу.

 private XmlDocument tileXml; private XmlElement tileImage; private XmlNodeList tileList; private TileNotification notif; SecondaryTile imageTile, blockTile, badgeTile, iconicTile, cyclicTile; 

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

 TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueueForSquare150x150(true); TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueueForWide310x150(true); 

Я прикрепил приложение к меню «Пуск» и изменил его размеры до широкого (310 × 150). Затем я программно добавил дополнительную квадратную плитку для каждого шаблона. Я рекомендую вам сделать то же самое, так как мы будем тестировать уведомления как на широких, так и на квадратных плитках, и это экономит время, изменяя их размеры, чтобы увидеть различия во время тестирования.

Вторичные плитки

Сначала я представлю Вторичные плитки, потому что мы будем использовать их на следующих шагах. Они идентичны плиткам, закрепленным в меню «Пуск», за исключением того, что они создаются программно. Мы можем создать несколько плиток, назначить им разные идентификаторы, а затем обновить их отдельно. В Windows Phone 8.1 мы можем добавлять только квадратные плитки размером 150 × 150 пикселей.

Для создания вторичной плитки используется класс с тем же именем из пространства имен StartScreen . Объекты создаются с помощью следующего конструктора.

 SecondaryTile.SecondaryTile(string tileId, string displayName, string arguments, Uri logoReference, TileSize tileSize); 

Чтобы прикрепить плитку к меню «Пуск», мы вызываем асинхронный метод SecondaryTile.RequestCreateAsync(); который возвращает логическое значение, чтобы сказать, был ли тайл закреплен успешно или нет. Удалить прикрепленную плитку так же просто, как вызвать SecondaryTile.RequestDeleteAsync();

Флип плитки

Этот тип плиток распространен в играх. Если вы прикрепите приложение к меню «Пуск», на плитке появится информация о таблице лидеров, достижениях или другая информация, относящаяся к игре.

В режиме конструктора MainPage.xaml двойной щелчок по переключателю ImageAndText добавит прослушиватель переключаемых событий и приведет вас к файлу .cs, создав новый метод, в который мы добавим наш код. Во-первых, нам нужно проверить, является ли переключатель, который вызвал событие, включенным или выключенным, чтобы выполнить правильное действие, достаточно простого оператора if else . Обратите внимание на ключевое слово async добавленное для поддержки асинхронных вызовов.

 private async void ImageAndText_Toggled(object sender, RoutedEventArgs e) { if (ImageAndText.IsOn) { } else { } } 

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

 imageTile = new SecondaryTile( "ImageAndText", "Image and Text", "Arguments", new Uri("ms-appx:///Assets/blue.150x150.png", UriKind.Absolute), TileSize.Square150x150); await imageTile.RequestCreateAsync(); 

Если выключатель выключен, мы должны удалить закрепленный тайл, добавив следующую строку внутри блока else .

 await imageTile.RequestDeleteAsync(); 

Если вы запустите приложение сейчас и включите переключатель изображения и текста, вы увидите две плитки рядом. Первый — широкий и называется « Локальные уведомления», а второй — квадратный и называется « Изображение и текст» . Мы еще не добавили никаких уведомлений.

Шаблоны уведомлений представлены в xml , но могут быть созданы с помощью кода. Это шаблон, который мы будем использовать.

 <tile> <visual version="2"> <binding template="TileSquare150x150PeekImageAndText01" fallback="TileSquarePeekImageAndText01"> <image id="1" src="" /> <text id="1"></text> <text id="2"></text> <text id="3"></text> <text id="4"></text> </binding> </visual> </tile> 

Далее мы получаем этот шаблон из TileUpdateManager . Вы можете заметить, что существует множество других доступных TileTemplateType , используемых как для Windows, так и для Windows Phone.

 tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileSquare150x150PeekImageAndText01 ); 

В коде xml есть один тег изображения, в котором отсутствует источник, а в четырех текстовых тегах отсутствует текст. Мы можем получить любой элемент xml из его имени тега, а затем установить нужные нам атрибуты. Функция GetElementsByTagName(string) возвращает XmlNodeList содержащий все элементы, найденные в документе. Давайте добавим атрибуты для изображения и текста.

 tileImage = tileXml.GetElementsByTagName("image")[0] as XmlElement; tileImage.SetAttribute("src", "ms-appx:///Assets/blue.150x150.png"); tileList = tileXml.GetElementsByTagName("text"); (tileList[0] as XmlElement).InnerText = "Header text"; (tileList[1] as XmlElement).InnerText = "First line of text"; (tileList[2] as XmlElement).InnerText = "Second line of text"; (tileList[3] as XmlElement).InnerText = "Third line of text"; 

На основе этого XML-шаблона мы создаем TileNotification и добавляем его в TileUpdateManager , который отвечает за изменение или обновление плиток.

 notif = new TileNotification(tileXml); TileUpdateManager.CreateTileUpdaterForSecondaryTile(imageTile.TileId).Update(notif); 

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

 tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileWide310x150PeekImage02 ); 

Источник изображения установлен в широкий синий прямоугольник.

 tileImage.SetAttribute("src", "ms-appx:///Assets/blue.310x150.png"); 

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

 (tileList[4] as XmlElement).InnerText = "Fourth line of text"; 

Наконец, мы обновляем основную плитку.

 TileUpdateManager.CreateTileUpdaterForApplication().Update(notif); 

Когда тумблер выключен, обновления плитки очищаются:

 TileUpdateManager.CreateTileUpdaterForApplication().Clear(); 

В примере проекта на github код повторяется в каждом случае, что неэффективно, но показывает каждое уведомление более четко.

Запустите приложение и включите первый переключатель. Вы должны увидеть это в меню «Пуск».

Изображение и текст

Цикл, как плитки

Если вы посмотрите на плитку «Фотографии», ваши личные фотографии будут медленно циклически переключаться с эффектом Кена Бернса . Это называется «Цикл плитки». В Windows Phone 8.1 эта плитка больше не доступна, но мы можем сделать нечто подобное. Один из подходов — добавление картинок в очередь, которая будет переключаться с эффектом переворота, но движение будет отсутствовать.

Создайте новую Вторичную плитку так же, как мы делали раньше.

 cyclicTile = new SecondaryTile( "Cyclic", "Cyclic", "Arguments", new Uri("ms-appx:///Assets/blue.150x150.png", UriKind.Absolute), TileSize.Square150x150); await cyclicTile.RequestCreateAsync(); 

Нам нужно включить очередь уведомлений для этой плитки, как мы сделали для основной плитки.

 TileUpdateManager.CreateTileUpdaterForSecondaryTile(cyclicTile.TileId).EnableNotificationQueueForSquare150x150(true); 

Обновите плитку с TileSquare150x150Image шаблона TileSquare150x150Image изменив только источник изображения.

 tileImage = tileXml.GetElementsByTagName("image")[0] as XmlElement; tileImage.SetAttribute("src", "ms-appx:///Assets/blue.150x150.png"); notif = new TileNotification(tileXml); TileUpdateManager.CreateTileUpdaterForSecondaryTile(cyclicTile.TileId).Update(notif); tileImage.SetAttribute("src", "ms-appx:///Assets/red.150x150.png"); notif = new TileNotification(tileXml); TileUpdateManager.CreateTileUpdaterForSecondaryTile(cyclicTile.TileId).Update(notif); // Repeat for orange, green, and yellow 

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

Циклическая как плитка

Значки

Счетчик или «значок» часто используется для отображения количества уведомлений. Это может быть глиф, но в Windows Phone он ограничен символом предупреждения и внимания . Мы будем использовать глифы на дополнительном тайле и значок с цифрами на основном тайле.

После создания и закрепления новой плитки мы генерируем xml из класса BadgeUpdateManager .

 tileXml = BadgeUpdateManager.GetTemplateContent(BadgeTemplateType.BadgeGlyph); 

XML состоит только из одного тега: <badge value=""/> . Далее установите значение глифа.

 tileImage = tileXml.SelectSingleNode("/badge") as XmlElement; tileImage.SetAttribute("value", "alert"); 

Создайте новое BadgeNotification из этого шаблона и обновите плитку.

 BadgeNotification badgeNotification = new BadgeNotification(tileXml); BadgeUpdateManager.CreateBadgeUpdaterForSecondaryTile(badgeTile.TileId).Update(badgeNotification); 

Широкая плитка обновляется аналогичным образом.

 tileXml = BadgeUpdateManager.GetTemplateContent( BadgeTemplateType.BadgeNumber ); tileImage = tileXml.SelectSingleNode("/badge") as XmlElement; tileImage.SetAttribute("value", "31"); badgeNotification = new BadgeNotification(tileXml); BadgeUpdateManager.CreateBadgeUpdaterForApplication().Update(badgeNotification); 

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

 BadgeUpdateManager.CreateBadgeUpdaterForApplication().Clear(); 

Запустите приложение, чтобы увидеть результаты.

Уведомление о значке

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

Уведомления о блокировке экрана

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

Откройте package.appxmanifest проекта и в уведомлениях на экране блокировки выберите значок и текст плитки .

Манифест 1

Красная пометка появится на вкладке Visual Assets, потому что нам нужно добавить логотип значка. Нажмите на вкладку и на левой панели выберите Badge Logo . Вы можете загрузить до трех разных размеров: 58 × 58, 33 × 33 и 24 × 24. Логотип лучше всего белого цвета с прозрачным фоном. Выберите логотип и сохраните изменения.

Манифест 2

Возможно, мы добавили функцию уведомлений в наше приложение, но пользователи сами выбирают, включать их или добавлять плитки на стартовый экран. Чтобы включить уведомления приложений, откройте « Настройки» -> «Экран блокировки» . По умолчанию должен быть выбран хотя бы Телефон и Сообщения. Добавьте другое приложение, нажав кнопку + .

Настройки 1

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

Настройки 2

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

Экран блокировки

Знаковые плитки

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

Сначала нам нужно добавить иконку к активам проекта. Для широкой плитки это должно быть 70 × 110 пикселей, а для квадратной плитки 130 × 202 пикселей.

Код за плиткой имеет ту же логику. Создайте новую Вторичную плитку и добавьте к ней значок. Нам нужен номер, чтобы показать рядом со значком, который будет номером, который мы установили на значке. Затем получите код XML для генерации TileNotification .

 tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquare150x150IconWithBadge); tileImage = tileXml.GetElementsByTagName("image")[0] as XmlElement; tileImage.SetAttribute("src", "ms-appx:///Assets/icon.130x202.png"); notif = new TileNotification(tileXml); TileUpdateManager.CreateTileUpdaterForSecondaryTile(iconicTile.TileId).Update(notif); 

Сделайте то же самое для широкой плитки, но в шаблоне xml есть три текстовых тега, которые требуют добавления атрибутов.

 tileList = tileXml.GetElementsByTagName("text"); (tileList[0] as XmlElement).InnerText = "Header text"; (tileList[1] as XmlElement).InnerText = "First line of text"; (tileList[2] as XmlElement).InnerText = "Second line of text"; 

Который должен выглядеть следующим образом.

Культовая плитка

Блок и текстовый шаблон

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

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

 tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileSquare150x150Block ); tileList = tileXml.GetElementsByTagName("text"); (tileList[0] as XmlElement).InnerText = "28"; (tileList[1] as XmlElement).InnerText = "Nov"; 

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

 tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileWide310x150BlockAndText01 ); tileList = tileXml.GetElementsByTagName("text"); (tileList[0] as XmlElement).InnerText = "28"; (tileList[1] as XmlElement).InnerText = "Nov"; (tileList[2] as XmlElement).InnerText = "Indipendence Day of Albania"; 

Когда вы добавляете TileNotifications для каждой плитки, вы должны получить похожий результат.

Блок и текст

Вывод

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

Спасибо за уделенное время. Пусть код будет с вами!