Я хочу отправлять push-сообщения приложениям по определенным каналам, например «en-us» и «fr-fr», чтобы локализовать push-уведомления.
Сначала я следовал этому руководству, и все сработало: https://learn.microsoft.com/en-us/azure/notification-hubs/notification-hubs-windows-store-dotnet-get-started-wns-push-notification
рабочая регистрация есть:
var result = await hub.RegisterNativeAsync(channel.Uri);
Но это для отправки одного сообщения всем клиентам. Затем я последовал этому руководству: https://learn.microsoft.com/en-us/azure/notification-hubs/notification-hubs-windows-notification-dotnet-push-xplat-segmented-wns
и из того, что я смог извлечь из этой запутанной смеси с кодом uwp, есть эта строка:
var hub = new NotificationHub("AppName", "endpoint");
const string templateBodyWNS = "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">$(messageParam)</text></binding></visual></toast>";
var result = await hub.RegisterTemplateAsync(channel.Uri, templateBodyWNS, "simpleWNSTemplateExample", new string[] { "en-us" });
Результат также дает мне действительную регистрацию.
Затем я попытался протестировать его с помощью консоли концентратора уведомлений Azure (которая работала с предыдущим шагом, чтобы отправить его всем клиентам:
в результате приложение получило уведомление (оно не фильтрует «en-us»). Затем я попытался поместить «en-us» в «выражение отправки тега»:
При этом всплывающее сообщение не приходит.
Затем я попытался отправить сообщение через пакет Microsoft.Azure.NotificationHubs.
Этот код работает:
NotificationHubClient Hub = NotificationHubClient.CreateClientFromConnectionString(endpoint, name);
string toast = @"<?xml version='1.0' encoding='utf-8'?>
<toast>
<visual><binding template='ToastText01'>
<text id='1'> Test message </text>
</binding>
</visual>
</toast>
";
var result = await Hub.SendWindowsNativeNotificationAsync(toast);
Приходит тост-сообщение. Но как только я изменю последнюю строку на:
var result = await Hub.SendWindowsNativeNotificationAsync(toast, "en-us");
Ничего не приходит. Итак, Notification Hub успешно подключается к клиенту через WNS, но с помощью тегов вообще не работает. Что я делаю неправильно?
Хорошо, я понял, вот для тех, у кого такой же вопрос:
Во-первых, поскольку кто-то еще может запутаться в этом, нам нужно понять, что концепция определения шаблонов push отличается от того, как работает FCM (для Android). В FCM вы определяете макет и содержимое push-сообщений на стороне сервера.
В UWP это происходит на стороне клиента при использовании тегов. При разработке всплывающего уведомления вы можете поместить в него переменные, которые затем будут заполнены на стороне сервера.
Это рабочий код.
Сторона клиента:
var hub = new NotificationHub("Hubname", "endpoint");
string toast = @"<toast>
<visual><binding template='ToastGeneric'>
<text id='1'>$(Title)</text>
<text id='2'>$(Message)</text>
<text placement='attribution'>via SMS</text>
</binding>
</visual>
</toast>
";
var result = await hub.RegisterTemplateAsync(channel.Uri, toast, localizedWNSTemplateExample", new string[] { "myTag" });
На стороне сервера:
NotificationHubClient Hub = NotificationHubClient.CreateClientFromConnectionString(endpoint, name);
Dictionary<string, string> templateParams = new Dictionary<string, string>();
templateParams["Title"] = "Title here";
templateParams["Message"] = "Message here";
await Hub.SendTemplateNotificationAsync(templateParams, "myTag");
А из Интернета вы можете отправлять сообщения с помощью платформы «Пользовательский шаблон»:
Не уверен, что «Пользовательский шаблон» также можно использовать с Android и iOS. Это было бы замечательно.