2010-04-06 21 views
17

Sto utilizzando PHP per connettermi a apn s per inviare alcune notifiche a più dispositivi, sebbene la domanda sia più concettuale quindi non deve essere specifica per PHP.Notifica push Apple: invio di elevati volumi di messaggi

Invierò a circa 7000 dispositivi (e in crescita) tutti allo stesso tempo. Il mio processo viene eseguito UNA VOLTA al giorno e trasmette a tutti i dispositivi, quindi non sto riaprendo continuamente una connessione.

Attualmente posso facilmente inviare a 2 dispositivi alla volta e i messaggi verranno recapitati correttamente. Tuttavia, quando tento di inviare a tutti i 7000 dispositivi, i messaggi non sembrano recapitare.

La pseudo-logica per il mio codice è:

open connection to apple 
loop over device-tokens 
    write to socket connection per device 
end loop 
close connection to apple. 

ho visto da qualche parte che avrei dovuto eseguire solo una scrittura SINGLE, e costruire un corpo enorme, in altre parole la pseudo-codice sarà simile:

loop over device tokens 
    create payload aggregating all devices 
end loop 
open connection to apple 
write to socket ONCE with whole payload for 7000 devices 
close connection 

È difficile da testare perché ovviamente non posso inviare messaggi di prova ai miei 7000 utenti di produzione. Qualcun altro ha avuto un problema simile?

Grazie

+0

hai mai funzionato? Presto scriverò un'app che dovrà affrontare lo stesso problema - trasmessa a migliaia di clienti tramite APNS. –

+3

Ciao Mike. Si l'ho fatto. L'implementazione al momento in cui ho postato questa domanda era nelle fasi abbastanza iniziali. Il problema era che avevo alcuni dispositivi sandbox nella stessa tabella dei dispositivi di produzione. Apple a volte interrompe la connessione se si invia a un dispositivo sandbox device_token mentre si utilizzano i certificati di produzione. Quindi la soluzione più semplice è solo verificare che il numero corretto di byte sia stato scritto sulla connessione e che la connessione non sia caduta dopo ogni evento di scrittura. Se cade devi riaprire la connessione e continuare da dove eri rimasto. in bocca al lupo! – BoomShaka

+0

FYI, è possibile aprire la connessione ed eseguire il numero di scritture desiderato. assicurati di controllare lo stato della connessione dopo ogni scrittura – BoomShaka

risposta

5

Ho letto che Apple fa la cura per il numero di connessioni si fanno per i loro server, ma non ho mai sentito parlare di alcun limite di scrittura. Inoltre, non sono sicuro del tipo di risposta che riceveresti qui, ma potrebbe valere la pena provare a vedere cosa succede. Forse sperimentare con il server di notifica push sandbox, utilizzando solo i token dispositivo dei dispositivi di produzione. Quei telefoni non dovrebbero ricevere alcuna notifica push inviata al server sandbox e se la sandbox riporta "consegnato con successo", sarebbe un modo di test senza preoccupazioni.

+0

in ritardo. la tua risposta è stata sostanzialmente corretta. grazie :) – BoomShaka

+0

La sandbox richiede un certificato di sviluppo e la produzione richiede certificati di produzione. Il documento APNS afferma che i token dispositivo generati per lo sviluppo (sandbox environment) build sono totalmente diversi rispetto alla build di produzione. Anche la produzione di produzione APNS se ottiene un token dispositivo generato dalla creazione dello sviluppo invalida direttamente il token del dispositivo e interrompe la connessione. Quindi lo stato non avrà successo ma la connessione verrà interrotta. Per testare il mocking il servizio APNS è un'opzione migliore. –

-1

Vedo quello che vuoi e, piuttosto, ho affrontato lo stesso problema, quello che ha funzionato per me è stato il reverse engineering. Ho appena esaminato la libreria e controllato la funzione che convalida il deviceToken. Così, durante la creazione di un token dispositivo fittizio, mi sono semplicemente assicurato che il token generato fosse valido come da libreria.

Il seguente codice consente di generare validi token dispositivo, ora è su quanti milioni di token generare utilizzando questa funzione.

def generateRandomDeviceTokenAndAppendItToJson(tokenLength: Int) { 
    val randomlyGeneratedDeviceToken = new StringBuilder() 
     randomlyGeneratedDeviceToken.append("   \"") 
     (1 to tokenLength) foreach { 
     times: Int => 
     if (tokenLength equals Device.Apple) 
     randomlyGeneratedDeviceToken.append(validCharacter().toString.charAt(0)) 
     else 
     randomlyGeneratedDeviceToken.append(Random.alphanumeric.head) 
     } 
     randomlyGeneratedDeviceToken.append("\",") 
     println(randomlyGeneratedDeviceToken) 
     writer.write(randomlyGeneratedDeviceToken.toString()) 
     } 

     private def validCharacter(): Int = { 
     val a = Random.alphanumeric.head 
     if ('0' <= a && a <= '9') 
     return (a - '0') 
     else if ('a' <= a && a <= 'f') 
     return ((a - 'a') + 10) 
     else if ('A' <= a && a <= 'F') 
     return ((a - 'A') + 10) 
     validCharacter() 
    } 

Il dispositivo appleToken è di 64 caratteri, quindi è necessario eseguire un'iterazione per 64 volte.

+0

Dubito che questo possa funzionare. È possibile che sia stato eseguito il reverse engineering di una convalida di basso livello che controlla solo in qualche misura la correttezza di un token *. Ma questa è solo la prima linea di difesa di Apple per prevenire qualsiasi spamming. Potrei scommettere su un milione di dollari che non puoi inviare messaggi in natura a deviceTokens casuali. Apple ti spegnerebbe abbastanza rapidamente. Anche se funzionasse con il server sandbox, questo test non proverebbe nulla secondo me. –

+0

BTW, non c'è stata alcuna convalida? Perché dal codice sembra che generi semplicemente una lunghezza di 64 caratteri di caratteri esadecimali * completamente casuali *. Nessun vincolo di sorta. –

+0

Agreed Csaba Toth, questo genera una stringa casuale di 64 caratteri, ma la convalida (vedere la funzione caratteri valida sopra) è la stessa (mi ci è voluto analizzare i token piuttosto che trovarli da qualche parte sulla rete) quali apns fa alla fine, e ha funzionato per me testare il mio server per le prestazioni. Fai un tentativo e prova a inviarlo ad apns, sarebbe valido. Ovviamente, potrebbero essere generati token generati, dovremmo essere abbastanza cortesi da inviarlo su un ambiente sandbox, altrimenti come hai detto sarebbe spamming. –

Problemi correlati