PushSharp Apple - полученное сообщение было неожиданным или плохо отформатированным

Я использую версию 2.1.2 PushSharp. Приложение .NET 4.5.1 (хотя я также пробовал настроить таргетинг на .NET 4.5 и .NET 4)

Я пытаюсь, но не удается отправить push-сообщения через песочницу Apple APNS.

Я успешно отправляю сообщения с помощью PHP script, предоставленного здесь, в прохождении Ray Wenderlich, используя тот же сертификат и отправка на тот же идентификатор устройства, что и для моего приложения PushSharp.

Я тестировал, экспортировав завершенный сертификат как p12 из ключевой цепи. Экспорт завершенного сертификата и ключа. Экспорт секретного ключа. Также с помощью метода здесь. Когда я объединяю cert и ключ для использования в PHP script, у меня нет проблем.

Я импортировал сертификат p12 на проверенные мной машины - кажется, не имеет значения.

Я попытался изменить флаг IsProduction при регистрации функции push apple для push-брокера. Нет ошибки, если она задана как производство (даже если это сертификат для песочницы), но в этом случае он, очевидно, тоже не попадает на устройство.

Ни одно из моих сообщений не пройдет, все получат исключение службы, которое выглядит следующим образом:

System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The message received was unexpected or badly formatted
 --- End of inner exception stack trace ---
at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at PushSharp.Apple.FeedbackService.Run(ApplePushChannelSettings settings, CancellationToken cancelToken)
at PushSharp.Apple.ApplePushService.<>c__DisplayClass4.<.ctor>b__1(Object state)

В основном это мой код:

var push = new PushBroker();
// register event handlers for channel create/destroy/exception, notificationrequeue, serviceexception, notification sent

var appleCert = File.ReadAllBytes(ConfigurationManager.AppSettings["CertAddress"]);
push.RegisterAppleService(new ApplePushChannelSettings(false, appleCert, ConfigurationManager.AppSettings["CertPassword"]));

var pn = new AppleNotification().ForDeviceToken(item.SendToDeviceIdentifier).WithAlert(item.AlertMessage).WithBadge(item.Badges);

push.QueueNotification(pn);

Я получаю вызванное событие канала, а затем - исключение службы.

Некоторые из связанных вопросов упоминают, что эта ошибка может быть связана с проблемой брандмауэра - я тестировал свое приложение в двух разных сетях, которые могут отправлять push-уведомления (1 из которых использует приложение PushSharp в настоящее время).

Любое понимание было бы очень оценено.

Ответ 1

У нас была такая же проблема, используя теперь устаревшую библиотеку APNS-Sharp (предок PushSharp). Я отправил запрос на перенос для APNS-Sharp, который исправляет проблему на основе моих тестов.

Модификация должна была измениться (в ApplePushChannel.cs)

stream.AuthenticateAsClient(this.appleSettings.Host, this.certificates, System.Security.Authentication.SslProtocols.Ssl3, false);                   

to

stream.AuthenticateAsClient(this.appleSettings.Host, this.certificates, System.Security.Authentication.SslProtocols.Tls, false);

Я не нашел подтверждения об этом, но похоже, что протокол SSL3 больше не поддерживался APNS Sandbox. Как и другие, которые сообщали о проблеме, мои уведомления против APNS производства все еще работали.

Здесь вы можете найти запрос на перенос:

https://github.com/Redth/PushSharp/pull/369/files

Обновление

На веб-сайте Apple Developer есть поток на эту тему:

https://devforums.apple.com/thread/224320?tstart=0

Тем не менее, некоторые из людей там также находятся в этой теме или в потоке github. Таким образом, информация является предвзятой. Контакт, который я имею в Apple, говорит:

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

Ответ 2

Если кто-то из вас запускает это на Windows Server 2003 (я знаю, я знаю), вам придется запустить этот патч, иначе вы по-прежнему будете получать странные ошибки даже после того, как будете внедрять исправление. Я потратил несколько часов на то, чтобы узнать, почему мой сервер 2008 работал, а мой сервер 2003 не сделал этого.

http://support.microsoft.com/kb/948963