Грешка InvalidToken на Azure Notification Hub за iOS/APNS с помощта на Xamarin и мобилно приложение Azure App Services

Опитвам се да добавя известия към моето мобилно приложение Azure (мобилно приложение Azure App Services) и се боря да ги накарам да работят с iOS. Успешно ги накарах да работят за Android.

Следвах инструкции онлайн, за да настроя сертификатите на Apple и профилите за осигуряване:

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

Приложението за iOS се регистрира в APNS и е получен Device Token. След това премахнах знаците „‹“ и „>“, както и интервалите, и изпратих регистрацията до центровете за уведомяване.

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

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

Когато изпратя първата заявка за насочено известие...

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

...регистрацията е премахната от Notification Hubs.

Повиших нивото на ценообразуване в Azure Notification Hub до Standard и го използвах, за да потърся проследяването, съхранено в акаунта за съхранение, и то показва „InvalidToken“ като грешка от APNS.

Неща, които съм направил/проверил:

  • Центърът за уведомяване като APNS идентификационни данни, зададени със сертификата за разработка (Създаден и експортиран от портала за разработчици на Apple за идентификатор на приложение без заместващ знак, който има активирано Push Notification) и за средата на Sandbox.
  • Проектът за приложение за iOS е настроен да използва самоличността на програмиста и профила за осигуряване, към който е свързан идентификаторът на приложението:

Настройки за подписване на iOS Project Bundle

  • Добавих следното в Info.plist (не всички инструкции включват това, но други статии предполагат, че е задължително)

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

Неща, които се опитах да поправя

  • Опитах с главни букви на DeviceToken
  • Опитах НЕ да премахна интервалите и/или знаците '‹' '>' (това доведе до грешка "InvalidTokenSize", което ме кара да вярвам, че премахването на знаците е задължително)
  • Опита се да се промени Notification Hub, за да се използва Production Push Notification сертификат (изтрит Hub между промяната на сертификата)

Все пак продължавам да получавам „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}/installations/{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, както е посочен в регистрационните файлове от страна на клиента.

Ако рестартирам приложението, стойността се променя обратно, когато се регистрирам отново в Notification Hub, така че някъде след извикването на 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. Имам 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 на PC е свързан с 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