2010-03-03 4 views
5

Ich habe ein Ruby-Skript, das eine Verbindung zu Apples Push-Server öffnet und alle ausstehenden Benachrichtigungen sendet. Ich kann keinen Grund dafür sehen, aber ich bekomme kaputte Rohrleitungsfehler, wenn Apple mein Skript trennt. Ich habe mein Skript geschrieben, um dies zu berücksichtigen, aber ich würde lieber herausfinden, warum es passiert, damit ich es vermeiden kann.Was kann dazu führen, dass eine Verbindung zu APNS zeitweise getrennt wird?

Die Verbindung zu einer bestimmten Benachrichtigung wird nicht dauerhaft getrennt. Es trennt nicht bei einer bestimmten Byte-Übertragungsgröße. Alles scheint sporadisch zu sein. Gibt es bestimmte Einschränkungen für die Datenübertragung oder die Anzahl der Nutzdaten, die Sie für eine einzelne Verbindung senden können? Wenn ich die Lösungen der Leute sehe, die eine Verbindung immer offen halten, würde ich annehmen, dass das nicht das Problem ist. Ich habe gesehen, dass die Verbindung nach 3 Benachrichtigungen abbrach, und ich habe gesehen, dass sie nach 14 Benachrichtigungen abstürzte. Ich habe es noch nie über 14 hinaus gesehen.

Hat jemand anderes diese Art von Problem erfahren? Wie kann damit umgegangen werden?

Antwort

11

Das Problem wurde verursacht, indem ein ungültiges Geräte-Token an den APNS-Server gesendet wurde. In diesem speziellen Fall war es ein Entwicklungstoken. Wenn ein ungültiges Geräte-Token an APNS gesendet wird, trennt es den Socket. Dies kann einige Kopfschmerzen verursachen und wurde von Apple als etwas angesprochen, mit dem sie sich in zukünftigen Updates befassen werden.

+0

Wo haben Sie gesehen, dass sie sich damit befassen? Und was hast du getan, um das Problem zu lösen? Einfach schließen und die Steckdose wieder öffnen? – Sam

2

hatte ich das gleiche Problem für ein bisschen und hat zwei Dinge, die es zu bekämpfen:

  1. einige Auto-Wiederaufnahme-Logik in Kraft gesetzt: Ich versuche, wie möglich, so lange meine Verbindung zu halten, aber Apple wird trennen Sie ab und zu. Sei darauf vorbereitet, damit umzugehen.
  2. Wechsel zur erweiterten Schnittstelle: Durch die Verwendung der einfachen Schnittstelle (dies wird vom APNS gem und vielen anderen verwendet) lösen Fehler die Trennung ohne Rückmeldung aus. Wenn Sie zu enhanced format wechseln, erhalten Sie jedes Mal, wenn etwas passiert, eine Ganzzahl zurück. Schlechte Token führen dazu, dass eine 8 zurückgegeben wird, und ich verwende diese, um das Gerät aus meiner Datenbank zu entfernen.

Hier ist mein aktueller Verbindungscode, eventmachine mit:

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 

Ende Ende

Er trennt schreibt und liest in der Verbindung, in der Mitteilung des ID-Feld mit korrelierten Mitteilungen I senden mit Rückmeldung bekomme ich.

Verwandte Themen