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

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

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

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

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

Я импортировал сертификат 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);

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

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

Любое понимание будет высоко оценено.


person bean    schedule 16.04.2014    source источник
comment
Я просто публикую ответ, надеюсь, что это может помочь. stackoverflow.com/questions/23116726/   -  person dichen    schedule 17.04.2014


Ответы (2)


У нас была такая же проблема с использованием уже устаревшей библиотеки 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 больше не поддерживается Sandbox APNS. Как и другие, сообщившие об этой проблеме, мои уведомления от APNS для производства все еще работали.

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

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

Обновить

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

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

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

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

person Phil Lalonde    schedule 16.04.2014
comment
Спасибо за это! Ваш запрос на вытягивание — это именно то изменение, которое я внес, и теперь оно работает. - person bean; 17.04.2014
comment
Не повезло мне. Я скомпилировал текущую версию, так как пакет nuget еще не обновлен, и я получаю ту же ошибку, что и раньше... код ошибки HRESULT - -2146233087. Не знаю, поможет ли это... - person david; 15.07.2014
comment
Я попытался перейти по ссылке на форум разработчиков Apple, чтобы объяснить акцент с SSL на TLS, и он просто перешел на мою домашнюю страницу Центра участников. - person Michael Kniskern; 21.08.2014
comment
Мне тоже не повезло. Я скачал исходный код с github для Moon-APNS github.com/arashnorouzi/Moon-APNS , попытался свернуть свое собственное приложение для уведомлений и получил ту же ошибку в той же строке кода в этом решении. Я пробовал System.Security.Authentication.SslProtocols.Tls, System.Security.Authentication.SslProtocols.Ssl3 и System.Security.Authentication.SslProtocols.Default - person Michael Kniskern; 21.08.2014
comment
Сегодня я столкнулся с той же проблемой, и она была решена с помощью указанного выше исправления; однако я нахожу это очень странным. Кто-нибудь знает, было ли это уже задокументировано где-то посередине? - person Codor; 07.10.2014
comment
это решило это для меня! хотя я все еще вижу ту же ошибку в своих журналах, но push-уведомления теперь работают! Спасибо! это очень неудобно, так как мои push-уведомления вырвались из ниоткуда, без предупреждения от Apple :( - person greenhouse; 15.10.2014
comment
Со вчерашнего дня (29 октября) рабочий шлюз также требует TLS. У нас была старая версия PushSharp, и это исправление решило проблему. - person alexey; 30.10.2014
comment
Да, SSL3 в TLS, бинго, это решает проблему. - person Nicholas Petersen; 31.10.2014

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

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

person S. Binder    schedule 18.04.2014