2010-03-03 14 views
5

Ho uno script ruby ​​che apre una connessione al server push di Apple e invia tutte le notifiche in sospeso. Non riesco a vedere alcun motivo per cui, ma ottengo errori di pipe non corretti quando Apple disconnette il mio script. Ho scritto la mia sceneggiatura per far sì che questo accada, ma preferirei solo scoprire perché sta accadendo, quindi posso evitarlo in primo luogo.Cosa può causare la disconnessione intermittente di APNS?

Non si disconnette costantemente su una notifica specifica. Non si disconnette a una certa dimensione di trasferimento di byte. Tutto sembra essere sporadico. Esistono alcune limitazioni al trasferimento dati o al conteggio del carico utile che è possibile inviare su una singola connessione? Vedendo le soluzioni della gente che mantengono una connessione aperta tutto il tempo, suppongo che non sia questo il problema. Ho visto la caduta della connessione dopo 3 notifiche e l'ho vista cadere dopo 14 notifiche. Non l'ho mai visto fare oltre 14.

Qualcun altro ha riscontrato questo tipo di problema? Come può essere gestito?

risposta

11

Il problema è stato causato dall'invio di un token dispositivo non valido sul server APNS. In questo caso specifico era un token di sviluppo. Quando un token dispositivo non valido viene inviato ad APNS, disconnette il socket. Ciò può causare mal di testa ed è stato considerato da Apple come qualcosa che verrà trattato nei futuri aggiornamenti.

+0

Dove hai visto che hanno intenzione di affrontarlo? E cosa hai fatto per risolvere il problema? Chiudi e riapri la presa? – Sam

2

Ho avuto lo stesso problema per un po 'e ha fatto due cose per affrontarlo:

  1. mettere un po' di logica auto-riconnessione in atto: cerco di mantenere la mia connessione il più a lungo possibile, ma Apple si disconnette tu ogni tanto. Preparati a gestirlo.
  2. Passare all'interfaccia avanzata: l'utilizzo dell'interfaccia semplice (questo è ciò che la gemma APNS e molti altri utilizzano) provocherà la disconnessione senza alcun feedback. Se passi allo enhanced format, riceverai un intero intero ogni volta che succede qualcosa. I token non validi restituiscono 8 resi e io li uso per rimuovere il dispositivo dal mio database.

Ecco il mio codice di connessione corrente, utilizzando EventMachine:

module Apns 

    module SocketHandler 
    def initialize(wrapper) 
     @wrapper = wrapper 
    end 

    def post_init 
     start_tls(:cert_chain_file => @wrapper.pem_path, 
       :private_key_file => @wrapper.rsa_path, 
       :verify_peer => false) 
    end 

    def receive_data(data) 
     @wrapper.read_data!(data) 
    end 

    def unbind 
     @wrapper.connection_closed! 
    end 

    def write(data) 
     begin 
     send_data(data) 
     rescue => exc 
     @wrapper.connection_error!(exc) 
     end 
    end 

    def close! 
     close_connection 
    end 
    end 

    class Connection 
    attr_reader :pem_path, :rsa_path 

    def initialize(host, port, credentials_path, monitoring, read_data_handler) 
     setup_credentials(credentials_path) 
     @monitoring = monitoring 
     @host = host 
     @port = port 
     @read_data_handler = read_data_handler 
     open_connection! 
    end 

    def write(data) 
     @connection.write(data) 
    end 

    def open? 
     @status == :open 
    end 

    def connection_closed! 
     @status = :closed 
    end 

    def connection_error!(exception) 
     @monitoring.inform_exception!(exception, self) 
     @status = :error 
    end 

    def close! 
     @connection.close! 
    end 

    def read_data!(data) 
     @read_data_handler.call(data) 
    end 

    private 
    def setup_credentials(credentials_path) 
     @pem_path = "#{credentials_path}.pem" 
     @rsa_path = "#{credentials_path}.rsa" 
     raise ArgumentError.new("#{credentials_path}.pem and #{credentials_path}.rsa must exist!") unless (File.exists?(@pem_path) and File.exists?(@rsa_path)) 
    end 

    def open_connection! 
     @connection = EventMachine.connect(@host, @port, SocketHandler, self) 
     @status = :open 
    end 
    end 
end 

fine fine

Si separa scrive e legge nella connessione, utilizzando il campo ID nella notifica per le notifiche correlate mando con feedback che ricevo.

Problemi correlati