PushSharp уведомления на APNS от Apple не работают, не выдает никаких исключений

Я понятия не имею, почему это не работает и не выдает никаких ошибок. Ни одно из подписанных событий никогда не срабатывает (включая OnNotificationSent а также OnNotificationSendFailure). Код практически идентичен примеру кода PushSharp в GIT, с той лишь разницей, что он работает внутри потока:

public class MyNotificationService
{
    ILog _log = LogManager.GetLogger("");
    PushService _PushService;
    public void Start()
    {
    PushService _PushService;
    byte[] appleCert = File.ReadAllBytes("myCert.p12");
    _PushService = new PushService();
    _PushService.Events.OnChannelCreated += Events_OnChannelCreated;
    _PushService.Events.OnChannelDestroyed += Events_OnChannelDestroyed;
    _PushService.Events.OnChannelException += Events_OnChannelException;
    _PushService.Events.OnDeviceSubscriptionExpired += Events_OnDeviceSubscriptionExpired;
    _PushService.Events.OnDeviceSubscriptionIdChanged += Events_OnDeviceSubscriptionIdChanged;
    _PushService.Events.OnNotificationSendFailure += Events_OnNotificationSendFailure;
    _PushService.Events.OnNotificationSent += Events_OnNotificationSent;

    _PushService.StartApplePushService(new ApplePushChannelSettings(false, appleCert, "myPass"));
            _MainThread = new Thread(() =>
            {
                try 
                {
            var nt = NotificationFactory.Apple()
            .ForDeviceToken("60A378B0FF0628FB52461C6F9F2CEDAA29A05D52F97EF2E811")
            .WithAlert("Test")
            .WithSound("default")
            .WithCustomItem("data", "some other data")
            .WithBadge(7);
            _PushService.QueueNotification(nt);
                    }
                    catch (Exception e)
                    {
                        _log.Error("In main thread", e);
                    }
                }
            });
            _MainThread.Start();
    }

    static void Events_OnDeviceSubscriptionIdChanged(PlatformType platform, string oldDeviceInfo, string newDeviceInfo, Notification nt)
    {
        //Currently this event will only ever happen for Android GCM
        _log.Debug("Device Registration Changed:  Old-> " + oldDeviceInfo + "  New-> " + newDeviceInfo);
    }

    static void Events_OnNotificationSent(Notification nt)
    {
        _log.Debug("Sent: " + nt.Platform.ToString() + " -> " + nt.ToString());
    }

    static void Events_OnNotificationSendFailure(Notification nt, Exception notificationFailureException)
    {
        _log.Error("Failure: " + nt.Platform.ToString() + " -> " + notificationFailureException.Message + " -> " + nt.ToString());
    }

    static void Events_OnChannelException(Exception exception, PlatformType platformType, Notification nt)
    {
        _log.Error("Channel Exception: " + platformType.ToString() + " -> " + exception.ToString());
    }

    static void Events_OnDeviceSubscriptionExpired(PlatformType platform, string deviceInfo, Notification nt)
    {
        _log.Debug("Device Subscription Expired: " + platform.ToString() + " -> " + deviceInfo);
    }

    static void Events_OnChannelDestroyed(PlatformType platformType, int newChannelCount)
    {
        _log.Debug("Channel Destroyed for: " + platformType.ToString() + " Channel Count: " + newChannelCount);
    }

    static void Events_OnChannelCreated(PlatformType platformType, int newChannelCount)
    {
        _log.Debug("Channel Created for: " + platformType.ToString() + " Channel Count: " + newChannelCount);
    }

}

Опять же, ни одно из событий не запускается (ничего не регистрируется, точки останова не попадают). Любопытно, зовет StopAllServices висит навсегда, видимо, ничего не делая. Я проверил свой профиль обеспечения и несколько раз подтверждаю и не могу найти в них ничего плохого. Есть идеи?

РЕДАКТИРОВАТЬ:

Оказывается, проблема может быть воспроизведена только тогда, когда я запускаю ее из проекта Windows Service .Net. Из консольного приложения все отлично работает. Я думал, что это была проблема с разрешениями, которая блокировала доступ к сети, но я не мог заставить это работать.

4 ответа

У меня была точно такая же проблема! Я использовал push sharp в dll, на которую ссылался мой exe. Я исправил проблему, добавив в свой app.config следующее:

<configuration>
    <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Убедитесь, что dll Newtonsoft.Json находится в папке bin!

У меня была похожая проблема. Я использовал PushSharp в своем приложении ASP.Net MVC. Убедитесь, что версия Newtonsoft.Json в вашем приложении и в вашей версии PushSharp одинакова.

Первый

У меня такая же проблема. События не инициированы, но уведомление доставлено. Все еще ищу ответ. Может быть, эта ссылка поможет.

Второе (про "StopAllServices зависает навсегда")

Может быть, это поможет. Короче - пустой маркер устройства не должен предоставляться

Ваш сервис работает как "LocalSystem"? Если нет, попробуйте установить его как "LocalSystem".

Возможно, сервис не имеет доступа к сети, поэтому нет подключения к Интернету или базе данных.

Кстати, токен устройства кажется очень коротким, но если он работает как консольное приложение, он должен работать как служба.

Другие вопросы по тегам