14

Ho bisogno di inviare notifiche a decine di migliaia di dispositivi iOS installati dalla mia app. Sto cercando di farlo con PushSharp, ma mi mancano alcuni concetti fondamentali qui. All'inizio ho provato a farlo funzionare in un servizio di Windows, ma non riuscivo a farlo funzionare - ottenendo errori di riferimento nulli provenienti dalla chiamata _push.QueueNotification(). Poi ho fatto esattamente ciò che il codice di esempio documentato ha fatto e ha funzionato:Notifiche push con PushSharp - Nozioni di base

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); 

Issue # 1: Questo funziona perfettamente e vedo la notifica pop-up su iPhone. Tuttavia, dal momento che si chiama servizio push, ho pensato che si sarebbe comportato come un servizio - cioè, l'ho istanziato e chiamato _push.StartApplePushService() in un servizio di Windows, forse. E ho pensato che in realtà in coda le notifiche, avrei potuto fare questo sul front-end (admin app, diciamo):

 PushService push = new PushService(); 

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

Ovviamente (e come ho già detto), non ha funzionato - il l'ultima riga continuava a generare un'eccezione di riferimento nulla.

Non riesco a trovare nessun altro tipo di documentazione che mostri come configurarlo in modo servizio/client (e non solo chiamare tutto in una volta). È possibile o mi manca il punto su come utilizzare PushSharp?

Issue # 2: Inoltre, io non riesco a trovare un modo per indirizzare molti gettoni di dispositivi in ​​una sola volta, senza loop attraverso di loro e fare la fila notifiche uno alla volta. È l'unico modo o mi manca qualcosa anche qui?

Grazie in anticipo.

+1

Continuo a ricevere una riga rossa sotto "NotificationFactory" e "PushService" mi manca qualcosa da includere? –

+0

quale versione di PushSharp stai usando?> – Lakshay

risposta

3

Da quello che ho letto e come lo sto usando, parola chiave del 'servizio' può avere trarre in inganno ...

E 'un servizioin un modo che è possibile configurare una volta e inizio esso. Da questo punto, aspetterà che tu spinga nuove notifiche all'interno del suo sistema di code e aumenterà gli eventi non appena qualcosa accade (rapporto di consegna, errore di consegna ...). È asincrono e puoi inviare (= coda) notifiche 10000 e attendere che i risultati tornino in seguito utilizzando i gestori di eventi.

Tuttavia, è ancora un'istanza di oggetto normale che sarà necessario creare e accedere come una normale. Non espone alcun "listener esterno" (ad esempio la connessione http/tcp/ipc), dovrai costruirlo.

Nel mio progetto ho creato un piccolo webservice selfhosted (basato su ServiceStack) che si occupa della configurazione e della durata dell'istanza mentre espone solo la funzione SendNotification.

E sulla Issue # 2, c'è in effetti non è un qualsiasi "coda di batch", ma come la funzione di coda ritorna subito (accodamento e spingere più avanti) è solo una questione di un loop nella vostra lista token dispositivo. ..

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 spiegato tutto, se si vuole vedere un "processore di" servizio è possibile navigare attraverso la mia soluzione sul https://github.com/vmandic/DevUG-PushSharp dove ho implementato il flusso di lavoro che cercate per, vale a dire un servizio di win, win processore o persino un processore web ad hoc con lo stesso core processor.