Как получить дескриптор PNS из службы уведомлений платформы? - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть приложение Xamarin.iOS, которое подключает внутреннюю службу Azure, и я хочу, чтобы моя служба отправляла уведомления клиентским приложениям.

В документации Microsoft объясняется, как настроить Центр уведомлений для другого сценария. Я думаю, что получаю большую часть этого, однако я не уверен, что понял самую первую часть , которая предназначена для приложения iOS до Retrieve PNS Handle из службы уведомлений платформы, как показано на следующем рисунке:

enter image description here

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

У меня такое ощущение, что это происходит на 10-м шаге этого раздела , когда iOS вызывает приложение обратно по методу RegisteredForRemoteNotifications. В этом обратном вызове приложение получает deviceToken:

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    Hub = new SBNotificationHub(Constants.ListenConnectionString, Constants.NotificationHubName);

    Hub.UnregisterAllAsync (deviceToken, (error) => {
        if (error != null)
        {
            System.Diagnostics.Debug.WriteLine("Error calling Unregister: {0}", error.ToString());
            return;
        }

        NSSet tags = null; // create tags if you want
        Hub.RegisterNativeAsync(deviceToken, tags, (errorCallback) => {
            if (errorCallback != null)
                System.Diagnostics.Debug.WriteLine("RegisterNativeAsync error: " + errorCallback.ToString());
        });
    });
}

Вопрос

Это deviceToken дескриптор PNS, который мне нужно отправить в бэкэнд-сервис, чтобы начать процесс регистрации? Если нет, то как мне связаться с PNS, чтобы получить ручку?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Информация содержится в документации , но не в очевидной форме для разработчика на C #.

В Objective-C deviceToken предоставляется приложением iOS, как упоминалось @LucasZ, после того, как оно было зарегистрировано в PNS.

Однако я не могу просто отправить это deviceToken сразу, так как оно не будет принято классом AppleRegistrationDescription, используемым в моей Службе.

Мне потребовалось некоторое время, чтобы познакомиться с Objective-C, чтобы выяснить, что этот токен на самом деле был преобразован перед отправкой в ​​Azure:

NSSet* tagsSet = tags?tags:[[NSSet alloc] init];

NSString *deviceTokenString = [[token description]
        stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];

    deviceTokenString = [[deviceTokenString stringByReplacingOccurrencesOfString:@" " withString:@""] uppercaseString];

Я реализовал нечто подобное в C #:

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    string pnsHandle = deviceToken.Description
                                  .Replace("<", string.Empty)
                                  .Replace(">", string.Empty)
                                  .Replace(" ", string.Empty)
                                  .ToUpper(); 

    Hub = new SBNotificationHub(Constants.ListenConnectionString, Constants.NotificationHubName);

    Hub.UnregisterAllAsync (pnsHandle, (error) => 
    {
        if (error != null)
        {
            System.Diagnostics.Debug.WriteLine("Error calling Unregister: {0}", error.ToString());
            return;
        }

        // In my use case, the tags are assigned by the server based on privileges.
        NSSet tags = null;

        Hub.RegisterNativeAsync(pnsHandle, tags, (errorCallback) => 
        {
            if (errorCallback != null)
                System.Diagnostics.Debug.WriteLine("RegisterNativeAsync error: " + errorCallback.ToString());
        });
    });
}

Чтобы ответить на мой вопрос, да, deviceToken - это дескриптор PNS, но он должен быть отформатирован.

0 голосов
/ 03 сентября 2018

Метод RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) - сообщить делегату, что приложение успешно зарегистрировано в службе push-уведомлений.

Параметр «deviceToken» является глобально уникальным токеном, который идентифицирует это устройство для службы push-уведомлений.

    NSSet tags = null; // create tags if you want

    Hub.RegisterNativeAsync(deviceToken, tags, (errorCallback) => 
    {
        if (errorCallback != null)
            System.Diagnostics.Debug.WriteLine("RegisterNativeAsync error: " + errorCallback.ToString());
    });

Поскольку вы используете Azure, концентратор отправил токен для создания удаленных уведомлений в вышеуказанном методе. Поэтому, если вы хотите передать что-то всем пользователям, вам не нужно делать что-то еще. Если вы хотите отправить конкретным пользователям, вы можете зарегистрировать тег и использовать его в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...