Ошибка InvalidToken концентратора уведомлений Azure для iOS / APNS с использованием Xamarin и мобильного приложения служб приложений Azure

Я пытаюсь добавить уведомления в свое мобильное приложение Azure (мобильное приложение служб приложений Azure), и мне не удается заставить их работать с iOS. Я успешно заставил их работать на Android.

Я выполнил инструкции в Интернете, чтобы настроить сертификаты Apple и профили обеспечения:

https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter5/ios/

Приложение iOS регистрируется в APNS, и получен токен устройства. Затем я удаляю символы «‹ »и«> »и пробелы и отправляю регистрацию в центры уведомлений.

 var templates = new JObject
 {
     ["genericMessage"] = new JObject
     {
         {"body", "{\"aps\":{\"alert\":\"$(message)\"}}"}
     }
 };

 var push = m_MobileServiceClient.GetPush();
 await push.RegisterAsync(token, templates);

Когда я отправляю первый запрос на push-уведомление ...

 var notification = new Dictionary<string, string> { { "message", "Test notification message" } };
 await m_Hub.SendTemplateNotificationAsync(notification);

... регистрация удаляется из Центров уведомлений.

Я повысил уровень цен в Центре уведомлений Azure до «Стандартный» и использовал его для поиска отслеживания, хранящегося в учетной записи хранения, и он показывает «InvalidToken» как ошибку от APNS.

Что я сделал / проверил:

  • Центр уведомлений в качестве учетных данных APNS, установленных с помощью сертификата разработки (создан и экспортирован с портала разработчика Apple для идентификатора приложения без подстановочного знака, для которого включено push-уведомление) и для среды песочницы.
  • Проект приложения iOS настроен на использование идентификатора разработчика и профиля подготовки, с которым связан идентификатор приложения:

Настройки подписи пакета проектов iOS

  • Я добавил следующее в Info.plist (не все инструкции включали это, но в других статьях предполагалось, что это необходимо)

    <key>aps-environment</key>
    <string>development</string>

Вещи, которые я пытался исправить

  • Пробовал заглавные буквы DeviceToken
  • Пробовал НЕ удалять пробелы и / или символы '‹' '>' (при этом возникла ошибка InvalidTokenSize, из-за которой я решил, что удаление символов является обязательным)
  • Пытался изменить концентратор уведомлений для использования сертификата производственного push-уведомления (удаленный концентратор между сменой сертификата)

Тем не менее, я продолжаю получать InvalidToken.

Есть ли у кого-нибудь идеи, что я делаю не так?

ИЗМЕНИТЬ

DeviceToken для APNS (после удаления пробелов и символов '‹' '>') имеет длину 64 символа. Я проверил, и это то, что я получаю в клиенте и отправляю в центр уведомлений. Но когда я смотрю в центр уведомлений, я получаю DeviceToken длиной 128 символов.

Похоже, это причина проблемы. Это мои журналы на мобильной стороне (я выводю в окно вывода)

RegisteredForRemoteNotifications срабатывает ‹7012d5d7 66e3d765 de017f65 a58e0dfb 461a6b77 9c57b6c6 60040f64 95ea20ab>

Регистрация с NH: 7012D5D766E3D765DE017F65A58E0DFB461A6B779C57B6C660040F6495EA20AB

но это то, что затем появляется в Регистрации устройства (вызов https: // {my_namespace} .servicebus.windows.net / {my_hub} / installation / {installationid}? api-version = 2015-01

{
    "installationId": "{installationId}",
    "pushChannel": "37303132443544373636453344373635444530313746363541353845304446423436314136423737394335374236433636303034304636343935454132304142",
    "pushChannelExpired": false,
    "platform": "apns",
    "expirationTime": "9999-12-31T23:59:59.9999999Z",
    "tags": [
        ...
    ],
    "templates": {
        "genericMessage": {
            "body": "{\"aps\":{\"alert\":\"$(message)\"}}",
            "tags": [
                "genericMessage"
            ]
        }
    }
}

Мне удалось добиться успешной работы Уведомления, используя REST API, чтобы ПОСТАВИТЬ установку, чтобы DeviceToken был указан в журналах на стороне клиента.

Если я перезапущу приложение, значение изменится обратно при повторной регистрации в Центре уведомлений, поэтому где-то после вызова NotificationHubClient значение изменяется!

ИЗМЕНИТЬ 2

Я записал трафик httpclient в окно вывода, и оказалось, что это проблема на стороне клиента, поскольку DeviceToken неверен при вызове сервера:

Method: PUT, 
RequestUri: 'https://{my_namespace}/push/installations/5ed26cac-2735-4d58-91f4-2220569a3f0c', 
Version: 1.1, 
Content: System.Net.Http.StringContent, 
Headers:
{
X-ZUMO-INSTALLATION-ID: 5ed26cac-2735-4d58-91f4-2220569a3f0c
X-ZUMO-AUTH: ...
Accept: application/json
User-Agent: ZUMO/3.1 (lang=Managed; os=iOS; os_version=10.3.2; arch=MacOSX; version=3.1.50105.0)
X-ZUMO-VERSION: ZUMO/3.1 (lang=Managed; os=iOS; os_version=10.3.2; arch=MacOSX; version=3.1.50105.0)
ZUMO-API-VERSION: 2.0.0
Content-Type: application/json; charset=utf-8
}
{
  "pushChannel": "37303132443544373636453344373635444530313746363541353845304446423436314136423737394335374236433636303034304636343935454132304142",
  "platform": "apns",
  "templates": {
    "genericMessage": {
      "body": "{\"aps\":{\"alert\":\"$(message)\"}}"
    }
  }
}

comment
Проверьте, есть ли у вас обновил идентификатор пакета с идентификатором пакета, который вы создали ранее, с новым идентификатором приложения и переопределил событие FinishedLaunching на настроить NotificationSettings.   -  person Amor    schedule 13.07.2017
comment
@ Amor-MSFT Да, идентификатор пакета совпадает в проекте с идентификатором приложения на портале Apple Developer. У меня FinishedLaunching вызывает параметры запуска APNS точно так, как указано в этой ссылке. У меня включена трассировка отладки, и я вижу токен устройства, возвращенный из APNS, и вижу, что я отправляю его в центр уведомлений.   -  person oatsoda    schedule 13.07.2017
comment
Проверьте, есть ли у вас создал профиль обеспечения и установил его на вашем компьютере разработки для приложения или нет?   -  person Amor    schedule 13.07.2017
comment
@ Amor-MSFT Да, профиль обеспечения создается и связывается с идентификатором приложения, для которого включены push-уведомления (с сертификатами). Профиль указан в X-Code на Mac, Visual Studio на ПК подключен к Mac, и я выбрал профиль подготовки в свойствах проекта - см. Снимок экрана в моем вопросе.   -  person oatsoda    schedule 13.07.2017
comment
@ Amor-MSFT Я обнаружил причину, по которой он не работает - DeviceToken изменяется (полностью!), Поэтому регистрация в NotificationHubs неверна!   -  person oatsoda    schedule 13.07.2017


Ответы (1)


Проблема оказалась досадно простой:

Я называл регистрационный код так:

 var token = DeviceToken.Description.Trim('<', '>').Replace(" ", "").ToUpperInvariant();
 var templates = new JObject
 {
     ["genericMessage"] = new JObject
     {
         {"body", "{\"aps\":{\"alert\":\"$(message)\"}}"}
     }
 };

 var push = m_MobileServiceClient.GetPush();
 await push.RegisterAsync(token, templates);

Где DeviceToken относится к типу NSData

Это означало, что я передавал string в первый параметр RegisterAsync, но для этого требуется тип NSData. Должно быть неявное приведение от string к NSData, чтобы он по-прежнему компилировался и выполнялся, но давал неправильное значение.

Исправление заключалось в том, чтобы удалить обработку строк и оставить ее как тип NSData. Оказывается, RegisterAsync уже выполняет эту обработку за вас!

person oatsoda    schedule 13.07.2017
comment
Похоже, что последняя версия кода больше не удаляет скобки, если функциональность не переместилась в другое место. - person oatsoda; 22.07.2020