.Net Mobile Service Back-End для Центра уведомлений

В настоящее время я пишу мобильное приложение с Xamarin для Android и добавлю iOS, как только моя компания купит Mac, чтобы я мог начать разработку части iOS. В настоящее время я пытаюсь написать серверную часть .Net Mobile Services для Azure Notification Hub, которая позволит мне регистрировать устройства из серверной части, а также отправлять push-уведомления конкретному пользователю и/или всем пользователям.

Я следил за документацией Azure на всем протяжении Начало работы с Notification Hub и успешно выполнили отправку одной платформы. Однако выходя за рамки этого примера, я застреваю. Каждый пример после этого пункта полностью отказывается от поддержки Android и фокусируется только на Windows Phone и iOS. Я посмотрел несколько видеороликов Channel 9 на эту тему, и снова все они основаны на Windows Phone, Windows 8 и iOS.

Есть ли у кого-нибудь пример серверной части .Net Mobile Service для Azure Notification Hub, который будет регистрировать устройство в центре уведомлений из серверной части? Спасибо за уделенное время.


person Photekk    schedule 19.05.2014    source источник


Ответы (1)


У меня пока нет примера кода на GitHub, но вот суть того, как заставить NotificationHub работать на Android.

using Microsoft.ServiceBus.Notifications;
using Newtonsoft.Json;

public class AndroidNotificationHub
{
    private readonly NotificationHubClient _hubClient;

    public AndroidNotificationHub()
    {
        const string cn = "YourConnectionStringHere";
        const string hubPath = "YourHubPathHere";
        _hubClient = NotificationHubClient.CreateClientFromConnectionString(cn, hubPath);
    }

    public async Task<RegistrationDescription> Register(string platform, string installationId, string registrationId, string userName)
    {
        // Get registrations for the current installation ID.
        var regsForInstId = await _hubClient.GetRegistrationsByTagAsync(installationId, 100);

        var updated = false;
        var firstRegistration = true;
        RegistrationDescription registration = null;

        // Check for existing registrations.
        foreach (var registrationDescription in regsForInstId)
        {
            if (firstRegistration)
            {
                // Update the tags.
                registrationDescription.Tags = new HashSet<string>() { installationId, userName };

                // We need to handle each platform separately.
                switch (platform)
                {
                    case "android":
                        var gcmReg = registrationDescription as GcmRegistrationDescription;
                        gcmReg.GcmRegistrationId = registrationId;
                        registration = await _hubClient.UpdateRegistrationAsync(gcmReg);
                        break;
                }
                updated = true;
                firstRegistration = false;
            }
            else
            {
                // We shouldn't have any extra registrations; delete if we do.
                await _hubClient.DeleteRegistrationAsync(registrationDescription);
            }
        }

        // Create a new registration.
        if (!updated)
        {
            switch (platform)
            {
                case "android":
                    registration = await _hubClient.CreateGcmNativeRegistrationAsync(registrationId, new[] { installationId, userName });
                    break;
            }
        }

        return registration;
    }

    // Basic implementation that sends a notification to Android clients
    public async Task<bool> SendNotification(int id, string from, string text, string tag)
    {
        try
        {
            var payload = new
            {
                data = new
                {
                    message = new
                    {
                        // these properties can be whatever you want
                        id,
                        from,
                        text,
                        when = DateTime.UtcNow.ToString("s") + "Z"
                    }
                }
            };

            var json = JsonConvert.SerializeObject(payload);

            await _hubClient.SendGcmNativeNotificationAsync(json, tag);

            return true;
        }
        catch (ArgumentException ex)
        {
            // This is expected when an APNS registration doesn't exist.
            return false;
        }
    }

    public async Task<bool> ClearRegistrations(string userName)
    {
        // Get registrations for the current installation ID.
        var regsForInstId = await _hubClient.GetRegistrationsByTagAsync(userName, 100);

        // Check for existing registrations.
        foreach (var registrationDescription in regsForInstId)
        {
            // We shouldn't have any extra registrations; delete if we do.
            await _hubClient.DeleteRegistrationAsync(registrationDescription);
        }
        return true;
    }
}

Ваш Android-клиент должен будет вызвать регистрационный API вашего бэкэнда во время запуска. У меня есть действие MVC для этого.

[HttpPost]
public async Task<ActionResult> Register(string platform, string installationId, string registrationId, string userName)
{
    try
    {
        var hub = new AndroidNotificationHub();
        var registration = await hub.Register(platform, installationId, registrationId, userName);
        return Json(registration);
    }
    catch (Exception ex)
    {
        return Content(ex.ToString());
    }
}

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

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

person Kiliman    schedule 20.05.2014
comment
Привет @Kiliman, какую информацию о значении installationId мы отправили в функцию регистрации? - person andrefadila; 26.02.2015
comment
Для всех, кто наткнется на это, похоже, что installId — это просто значение для конкретного приложения, которое просто используется в качестве тега, поэтому ничего критичного для регистрации. - person Jason; 14.06.2016