Отправка Push уведомлений используя Microsoft Azure NotificationHub API

Azure Notification Hub позволяет довольно просто отправлять большие объемы уведомлений на все платформы сразу. В некоторых примерах Xamarin и Microsoft показывают как использовать компонент Azure Messaging на клиенте. Такая реализация не кажется правильной, так как таким образом в приложение зашивается Connection String и название хаба. Это во-первых не безопасно, а во-вторых все данных хранятся только в Azure. Рассмотрим как реализовать подписку и отправку уведомлений через Backend.

Общая схема работы выглядит следующим образом.

схема работы azure notification hub

С мобильного приложения поступает запрос с данными для подписки на уведомления на промежуточный backend сервер. Далее вся работа с push уведомлениями происходит на этом сервере. Web Api связывается через Azure SDK напрямую в Notification Hub и добавляет информацию про подписку на уведомления.

  1. Получение DeviceToken (секретная информация связывающая приложение и физическое устройство пользователя)
  2. Backend создает/обновляет информацию о регистрации в Azure
  3. Далее через NotificationHubClient Api происходит отправка пушей

Рассмотрим код регистрации подписки в Web Api.

public static void UpdateUserRegisterInAzure(PushRegisterModel model)
{
    NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(“ConnectionString”, “NotificationHub”);

//Уже зарегистрированные токены на это устройство
var existingRegistrationsByDeviceId = hub.GetRegistrationsByTagAsync("device_{0}".F(model.DeviceId), Int32.MaxValue).Result;

foreach (RegistrationDescription registrationDescription in existingRegistrationsByDeviceId)
    hub.DeleteRegistrationAsync(registrationDescription).Wait();

string newRegistrationId = hub.CreateRegistrationIdAsync().Result;

RegistrationDescription registration = null;
switch (model.PlatformType)
{
    case PlatformType.iOS:
    case PlatformType.iOSiPad:
        registration = new AppleRegistrationDescription(model.DeviceToken);
        break;
    case PlatformType.Android:
        registration = new GcmRegistrationDescription(model.DeviceToken);
        break;
    case PlatformType.WinPhone:
        registration = new MpnsRegistrationDescription(model.DeviceToken);
        break;
    case PlatformType.Windows8:
        registration = new WindowsRegistrationDescription(model.DeviceToken);
        break;
}

registration.RegistrationId = newRegistrationId;
registration.Tags = new HashSet<string> 
{ 
    "user_{0}".F(model.UserToken),
    "device_{0}".F(model.DeviceId)
};

try
{
    var result = hub.CreateOrUpdateRegistrationAsync(registration).Result;
}
catch (MessagingException e)
{
    ReturnGoneIfHubResponseIsGone(e);
}
catch (Exception ex)
{

}

}

private static void ReturnGoneIfHubResponseIsGone(MessagingException e) { var webex = e.InnerException as WebException; if (webex.Status == WebExceptionStatus.ProtocolError) { var response = (HttpWebResponse)webex.Response; if (response.StatusCode == HttpStatusCode.Gone) { //todo logs //throw new HttpRequestException(HttpStatusCode.Gone.ToString()); } } }

После этого в Notification Hub появится запись о регистрации. В этом же месте можно записывать информацию о регистрации к себе в базу. Стоит отметить, что в Azure через 90 дней неактивности пользователя информация о нем удаляется. Хотя пользователь может быть активным (приложение еще установлено), до него push уведомление не дойдет.

Отправка Push через Azure

Очень просто можно отправлять push уведомления через Windows Azure Notification Hub (Service Bus). 

NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(“Connection String”, “Notification Hub”);
string alert;
switch (pushModel.PlatformType)
{
    case PlatformType.iOS:
    case PlatformType.iOSiPad:
        {
            alert = string.Format(“{{\“aps\”:{{\“alert\”:\“{0}\“,\“badge\”:1}},\“id\”:\“{1}\“}}”,
                pushModel.Text, pushModel.ID);
            await hub.SendAppleNativeNotificationAsync(alert);
        }
        break;
    // Other platforms
    // …
}

Отправка Push через Push Sharp

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

//Create our push services broker
var push = new PushBroker();

string fileName = “dev.p12”; var file = File.ReadAllBytes(fileName);

push.RegisterAppleService(new ApplePushChannelSettings(file, “Certificate Password”));

string message = “Hello from Push Sharp”; var deviceToken = “TOKEN HERE”;

push.QueueNotification(new AppleNotification() .ForDeviceToken(deviceToken) .WithAlert(message) .WithBadge(1) .WithSound(“sound.caf”) .WithCustomItem(“id”, 0));

//В этот момент происходит отправка пушей в очереди push.StopAllServices(true);

Комментарии

comments powered by Disqus