14

Ich muss Benachrichtigungen an Zehntausende von iOS-Geräten, die meine App installiert hat Push-Benachrichtigungen. Ich versuche es mit PushSharp, aber mir fehlen einige grundlegende Konzepte. Zuerst habe ich versucht, dies in einem Windows-Dienst auszuführen, aber ich konnte es nicht funktionieren lassen - NULL-Referenzfehler vom Aufruf _push.QueueNotification() stammend. Dann habe ich genau das, was die dokumentierte Beispielcode hat und es funktionierte:Push-Benachrichtigungen mit PushSharp - die Grundlagen

PushService _push = new PushService(); 

    _push.Events.OnNotificationSendFailure += new ChannelEvents.NotificationSendFailureDelegate(Events_OnNotificationSendFailure); 
    _push.Events.OnNotificationSent += new ChannelEvents.NotificationSentDelegate(Events_OnNotificationSent); 

    var cert = File.ReadAllBytes(HttpContext.Current.Server.MapPath("..pathtokeyfile.p12")); 

    _push.StartApplePushService(new ApplePushChannelSettings(false, cert, "certpwd")); 

    AppleNotification notification = NotificationFactory.Apple() 
                 .ForDeviceToken(deviceToken) 
                 .WithAlert(message) 
                 .WithSound("default") 
                 .WithBadge(badge); 
    _push.QueueNotification(notification); 

    _push.StopAllServices(true); 

Ausgabe # 1: Das funktioniert perfekt, und ich sehe die Meldung auf dem iPhone auftauchen. Da es sich jedoch um einen Push-Dienst handelt, ging ich davon aus, dass es sich wie ein Dienst verhalten würde - das heißt, ich instanziiere es und rufe möglicherweise _push.StartApplePushService() in einem Windows-Dienst auf. Und ich dachte eigentlich meine Benachrichtigungen Schlange, ich dies auf dem Front-End tun könnte (app admin, sagen wir mal):

 PushService push = new PushService(); 

     AppleNotification notification = NotificationFactory.Apple() 
                  .ForDeviceToken(deviceToken) 
                  .WithAlert(message) 
                  .WithSound("default") 
                  .WithBadge(badge); 
     push.QueueNotification(notification); 

Offensichtlich (und wie ich schon sagte), es hat nicht funktioniert - die In der letzten Zeile wurde eine Nullreferenzausnahme geworfen.

Ich habe Probleme, irgendeine andere Art von Dokumentation zu finden, die zeigen würde, wie man dies in einer Service/Client-Weise einrichtet (und nicht einfach alles auf einmal aufruft). Ist es möglich oder fehlt mir der Sinn, wie PushSharp eingesetzt werden sollte?

Issue # 2: Auch kann ich nicht auf einmal viele Geräte-Tokens zu zielen, ohne sie zu Looping und Schlange stehen Benachrichtigungen einer nach dem anderen scheinen, einen Weg zu finden. Ist das der einzige Weg oder verpasse ich auch hier etwas?

Vielen Dank im Voraus.

+1

Ich bekomme immer eine rote Linie unter "NotificationFactory" und "PushService" fehlt mir etwas zu enthalten? –

+0

welche PushSharp-Version verwenden Sie?> – Lakshay

Antwort

3

Von dem, was ich gelesen habe und wie ich es bin mit, der ‚Service‘ Stichwort verleiten Sie haben ...

Es ist ein Service in einer Weise, dass Sie es einmal konfigurieren und starten es. Von diesem Punkt an wird es darauf warten, dass Sie neue Benachrichtigungen in sein Warteschlangensystem schieben und es wird Ereignisse auslösen, sobald etwas passiert (Zustellungsbericht, Zustellungsfehler ...). Es ist asynchron und Sie können 10000 Benachrichtigungen pushen (= Warteschlange) und darauf warten, dass die Ergebnisse später mit den Event-Handlern zurückkommen.

Aber es ist immer noch eine regelmäßige Objektinstanz, die Sie erstellen und auf die Sie regelmäßig zugreifen müssen. Es gibt keinen "externen Listener" (z. B. http/tcp/ipc-Verbindung), Sie müssen das aufbauen.

In meinem Projekt habe ich einen kleinen Selfhosted-Webservice (der auf ServiceStack beruht) erstellt, der sich um die Konfiguration und die Lebensdauer der Instanz kümmert und nur die SendNotification-Funktion bereitstellt.

Und über die Issue # 2, gibt es in der Tat keine „Batch-Queue“, sondern als die Warteschlange Funktion sofort zurück (enqueue und drücken Sie später), es ist nur eine Frage der eine dem Gerät Token Liste Einschleifen in. ..

public void QueueNotification(Notification notification) 
{ 
    if (this.cancelTokenSource.IsCancellationRequested) 
    { 
     Events.RaiseChannelException(new ObjectDisposedException("Service", "Service has already been signaled to stop"), this.Platform, notification); 
     return; 
    } 

    notification.EnqueuedTimestamp = DateTime.UtcNow; 

    queuedNotifications.Enqueue(notification); 
} 
4

@baramuse erklärt alles, wenn Sie einen Dienst „Prozessor“, um sehen möchten, können Sie durch meine Lösung auf https://github.com/vmandic/DevUG-PushSharp sehen, wo ich den Workflow für Sie suchen, implementiert haben, also eine Win-Service, gewinnen Prozessor oder sogar ein Web-API-Ad-hoc-Prozessor, der den gleichen Kernprozessor verwendet.