PushSharp — ios — StopAllServices() зависает без ошибок

#c# #ios #.net #pushsharp

#c# #iOS #.net #pushsharp

Вопрос:

Я пытаюсь отправить push-уведомление на устройство IOS через PushSharp. Для Android это работает. Для IOS вызов StopAllServices() зависает навсегда, без вызова каких-либо обработчиков исключений.

Может ли проблема в том, что мне был предоставлен файл сертификата .pem, а для pushsharp требуется файл .p12?

Код следующий:

 var br = new PushBroker();
br.OnNotificationSent  = br_OnNotificationSent;
br.OnNotificationFailed  = br_OnNotificationFailed;
br.OnChannelException  = br_OnChannelException;
br.OnServiceException  = br_OnServiceException;
br.OnDeviceSubscriptionChanged  = br_OnDeviceSubscriptionChanged;
br.OnDeviceSubscriptionExpired  = br_OnDeviceSubscriptionExpired;
br.OnChannelCreated  = br_OnChannelCreated;
br.OnChannelDestroyed  = br_OnChannelDestroyed;

var appleCert = Resource1.ck; // this is a pem file, not a p12 file!!! could this be the problem?
var sandbox = true;
br.RegisterAppleService(new ApplePushChannelSettings(!sandbox, appleCert, "223684"));
// password given to me by ios developer

var deviceIds = new string[] { "09eddcb8b89494adf802a0caf97d5daaa789a53f52d8c544dbdcf39f2c0b619a" };

foreach (var did in deviceIds)
{
    br.QueueNotification(
         new AppleNotification()
               .ForDeviceToken(did)//the recipient device id
               .WithAlert("test: "   DateTime.Now.ToString())//the message
               .WithBadge(1)
               .WithSound("sound.caf"));
}
br.StopAllServices(waitForQueuesToFinish: true); // hangs forever, no callbacks are called
  

Я использую PushSharp, взятый через Git, и скомпилированный мной с помощью Visual Studio 2013, по состоянию на вчерашний день.

Зависание происходит, как если код находится в консольном приложении, так и в asp.net приложение.

Я использую изолированную среду, потому что мне сказали. Если я использую рабочий сервер, я получаю исключение, сообщающее мне, что сертификат предназначен для изолированной среды.

Спасибо за любой намек на причину зависания.

Комментарии:

1. Не могли бы вы подождать несколько секунд для br_OnNotificationFailed или любого другого события? Он должен содержать некоторое описание ошибки.

2. Извините, что вы подразумеваете под «подождите несколько секунд для br_onnotificationfailed»? Это обратный вызов, а не то, чего нужно ждать. И он не вызывается.

3. Обратные вызовы PushSharp обычно вызываются через несколько секунд. Я также не уверен, как можно получить обратный вызов, когда вы блокируете свой поток с помощью waitForQueuesToFinish — разве это не тупик? Ожидая, я думал о том, чтобы позволить программе работать нормально и посмотреть, получите ли вы какой-либо обратный вызов. Тем не менее, я бы исследовал проблему с сертификатами — однажды это доставило мне много головной боли.

Ответ №1:

Мы потратили целый день, пытаясь угадать проблему! В итоге это было в неправильном Newtonsoft.Версия Json Некоторые проекты в нашем решении зависали от более старой версии этой библиотеки, в результате чего нам не повезло получить неправильную версию в папке / bin веб-проекта.

Комментарии:

1. Спасибо. Это устранило мою проблему.

Ответ №2:

Вы можете подождать несколько секунд br_OnNotificationFailed или, возможно, любое другое событие. Он должен содержать некоторое описание ошибки.

Тем не менее, я обнаружил, что PushSharp предъявляет строгие требования к использованию сертификатов. PEM должен быть в порядке, но этого недостаточно, даже если вы импортируете его из файла — у вас должны быть все необходимые сертификаты в хранилище сертификатов Windows (сам pem и его зависимости):

  1. Импортируйте ваш PEM на локальный компьютер корневое хранилище и предоставьте права доступа на чтение его закрытого ключа пользователю вашего запущенного приложения

  2. Импортируйте сертификаты с сайтаApple из центра сертификации Apple Worldwide Developer Relations и корневого центра сертификации Apple в локальный компьютер Доверенные корневые центры сертификации

  3. Импортируйте сертификат доверенного безопасного центра сертификации (для SSL, как описано в библиотеке разработчиков iOS) на локальный компьютер Доверенные корневые центры сертификации

Комментарии:

1. «Импортируйте ваш PEM на локальный компьютер корневое хранилище»: я не могу найти руководство для этого. Pageant.exe не удается импортировать его. Контекстное меню ничего не показывает. Я в Windows 8.

2. @seguso, здесь у вас есть небольшое руководство. Но вам, вероятно, нужно преобразовать этот pem в pfx, как описано здесь .

3. Спасибо. Я не могу преобразовать pem в p12, потому что для этого мне нужны два pem, а разработчик ios не предоставит мне оба. Я попросил у него p12, он сделал один и передал его мне, и теперь я получаю другую ошибку. На этот раз генерируется исключение: CryptographicExcepion, генерируемое новыми настройками ApplePushChannelSettings(!sandbox, appleCert, «223684»). Я думаю, мне нужно открыть новый вопрос для этого … может ли p12 быть недействительным или созданным неправильно?

Ответ №3:

В конце концов, это была проблема с сертификатом. Предоставленный мне файл .pem не принимается PushSharp. Только когда мне был предоставлен файл .p12, созданный с помощью этого руководства

https://code.google.com/p/apns-sharp/wiki/HowToCreatePKCS12Certificate

проблема была решена.

Однако PushSharp должен был вызвать исключение вместо зависания.

Ответ №4:

An ASP.NET приложение НЕ является идеальным местом для использования PushSharp. Вам было бы лучше использовать службу Windows или какую-либо другую инфраструктуру, если это вообще возможно. Причина в том, что в ASP.NET приложение, пул приложений (AppPool) может быть перезапущен вами и обычно не находится под вашим непосредственным контролем, что означает, что все уведомления в очереди, которые PushSharp может отправлять, могут быть потеряны, если PushSharp не очищен должным образом.

Если вы ДОЛЖНЫ запустить PushSharp в ASP.NET приложение, лучший способ — создать экземпляр одноэлементного PushBroker в вашем глобальном файле.asax. Вы должны сохранить этот одноэлементный экземпляр в течение всего срока службы вашего веб-приложения, включая вызов pushBroker.StopAllServices() когда ваше приложение завершается (Application_End в global.asax).

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

Вы не должны создавать и уничтожать экземпляры PushBroker каждый раз, когда отправляете уведомление, поскольку это требует ненужных ресурсов, и если вы используете APNS Apple, они требуют, чтобы вы поддерживали соединение с их серверами открытым как можно дольше при отправке уведомлений. Вы также должны вызвать pushBroker.StopAllServices() в вашем событии Application_Ended в вашем глобальном.asax. Имейте в виду, что PushSharp работает.

Ссылка:https://github.com/Redth/PushSharp/issues/240