Список зарегистрированных устройств Azure Notification Hub

#ios #azure #asp.net-web-api #azure-notificationhub

#iOS #azure #asp.net-web-api #azure-notificationhub

Вопрос:

Я следую этому сообщению, чтобы работать с Azure Notification hub. Что я пытаюсь сделать, так это создать веб-api, который регистрирует устройства в Azure notification hub. Когда я отправляю запрос на регистрацию устройства, как показано в статье, он попадает в Azure notification hub.

Ниже приведен снимок экрана моего портала Azure. Который показывает, что был запрос на регистрацию.

Но когда я пытаюсь получить сведения о зарегистрированных устройствах, используя следующий код, он всегда равен 0.

 var registrationsCount = await hub.GetAllRegistrationsAsync(Int32.MaxValue);
return registrationsCount.Count().ToString();
 

Теперь у меня есть несколько вопросов :

1) как я могу просмотреть сведения о зарегистрированных устройствах?

2) Как я могу отправить тестовое уведомление на устройства ios из серверной части. Ниже приведен код, который я использую для отправки тестовых уведомлений.

  var payload = string.Format(toastTemplate, message);

 hub.SendAppleNativeNotificationAsync(payload, "worldnews");
 

3) Если я использую веб-api в качестве серверной части, необходимо ли настраивать сведения о приложении ios в azure notification hub? т.е. Загружать сертификат и другие сведения на портал Azure?

введите описание изображения здесь

Ответ №1:

Ваша первая проблема заключается в том, как вы звоните GetAllRegistrationsAsync . Параметр не является максимальным количеством регистраций, которые вы хотите вернуть. Это индекс первой регистрации, которую вы хотите. В большинстве сценариев это значение будет равно 0, а не Int32.MaxValue

Смотрите: https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.notificationhubs .notificationhubclient#Microsoft_Azure_NotificationHubs_NotificationHubClient_GetAllRegistrationsAsync_System_Int32_

 public Task<CollectionQueryResult<RegistrationDescription>> 
    GetAllRegistrationsAsync(int top)
 

Также имейте в виду, что этот метод возвращает максимум 100 регистраций. Если вы хотите больше, вам нужно будет использовать ContinuationToken.

Вот код, который я использую для получения регистраций:

 internal async Task<List<RegistrationDescription>> GetAllRegisteredDevicesAsync()
{
    var hub = NotificationHubClient.CreateClientFromConnectionString(
        Settings.Default.AzureNotificationsMobileAppFullSharedAccessListenerConnection,
        Settings.Default.AzureNotificationsMobileAppHubName,
        Settings.Default.AzureNotificationsTestSendMode);

    var allRegistrations = await hub.GetAllRegistrationsAsync(0);
    var continuationToken = allRegistrations.ContinuationToken;
    var registrationDescriptionsList = new List<RegistrationDescription>(allRegistrations);
    while (!string.IsNullOrWhiteSpace(continuationToken))
    {
        var otherRegistrations = await hub.GetAllRegistrationsAsync(continuationToken, 0);
        registrationDescriptionsList.AddRange(otherRegistrations);
        continuationToken = otherRegistrations.ContinuationToken;
    }

    return registrationDescriptionsList;
}
 

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

Комментарии:

1. Спасибо за объяснение. Это было действительно здорово 🙂 Есть еще один вопрос, если вы заметили 2-й пункт. Я хочу отправить уведомление на устройства Apple. Для Windows Phone есть средство для несанкционированных уведомлений. есть ли какой-либо способ, которым я могу отправлять одни и те же уведомления для устройств ios без отправки ключа приложения или сертификата?

2. StackOverflow работает лучше, если вы не объединяете вопросы. Но вкратце, я не знаю никакого способа отправлять уведомления через службу Push-уведомлений Apple без загрузки необходимого вам сертификата в Azure. В этой статье показано, что нужно делать: azure.microsoft.com/en-us/documentation/articles /…

3. пожалуйста, взгляните на это: azure.microsoft.com/en-us/documentation/articles/… . По-прежнему ли необходимо регистрировать приложение с помощью сертификата и всего остального? или это можно сделать прямо с помощью серверного веб-api?

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

5. Точно, спасибо за объяснение параметра «top». Это действительно не очевидно.

Ответ №2:

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

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

Надеюсь, это кому-нибудь поможет.

Ответ №3:

короткий код:

     private async Task<List<RegistrationDescription>> GetAllRegisteredDevicesAsync()
    {
        List<RegistrationDescription> allRegistrations = new List<RegistrationDescription>();

        var hub = NotificationHubClient.CreateClientFromConnectionString(
            Settings.Default.AzureNotificationsMobileAppFullSharedAccessListenerConnection,
            Settings.Default.AzureNotificationsMobileAppHubName,
            Settings.Default.AzureNotificationsTestSendMode);

        CollectionQueryResult<RegistrationDescription> page = null;
        do
        {
            page = await hub.GetAllRegistrationsAsync(page?.ContinuationToken, 0);
            allRegistrations.AddRange(page);
        }
        while (!string.IsNullOrWhiteSpace(page.ContinuationToken));

        return allRegistrations;
    }
 

Комментарии:

1. Не могли бы вы подробнее остановиться на своем ответе? Публикация фрагмента кода без текста часто не очень полезна.