Apple Push APNS Иногда не прибывает - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть приложение, которое уже есть в магазине приложений, У меня также есть сервер, который отправляет push-уведомления на iphone.

Моя проблема в том, что иногда уведомление не приходит на iphone, и это произошло только после того, как через 2 или 3 часа не было соединения apns с сервером Apple Push, но по истечении времени ожидания он снова заработал. это было действительно случайно.

Сначала я хотя проблема была в тайм-ауте, затем я попытался распечатать возвращаемое значение моих функций ssl_wrap.send (), и он вернул длину строк, которые должны были быть отправлены, то есть Apple APNS получил все мои строки JSON. это просто не передает их на телефон клиента.

Мне нужно продолжать запускать сервер apns до тех пор, пока не истечет время ожидания, прежде чем заставить push-уведомление снова работать, это неправильно.

Есть идеи?

class PushSender:
def __init__(self):     
    _sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
    _sock.settimeout(2)
    self.ssl_sock = ssl.wrap_socket( _sock, certfile = theCertfile )
    self.ssl_sock.settimeout(1) 
    self.ssl_sock.connect( theHost )
    self.counter = 0
    self.lastPush = time()

def reset(self):
    Log("Reset APNS");
    self.ssl_sock.close()
    _sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
    _sock.settimeout(2)
    self.ssl_sock = ssl.wrap_socket( _sock, certfile = theCertfile )
    self.ssl_sock.settimeout(1)
    self.ssl_sock.connect( theHost )
    self.counter = self.counter + 1;
    self.lastPush = time()

def send(self,token, message, badge, sound):
    #Log("INIT APNS")
    payload = {}
    aps = {}
    aps["alert"] = str(message)
    aps["badge"] = badge
    aps["sound"] = str(sound)

    payload["aps"] = aps

    if time() - self.lastPush> 60*30 : # 30 minutes idle reconnect
        self.reset()
    try:
        #Log("Making Message APNS")
        tokenh = binascii.unhexlify(token)
        payloadstr = json.dumps(payload, separators=(',',':'))
        payloadLen = len(payloadstr)
        fmt = "!cH32sH%ds" % payloadLen
        command = '\x00'
        msg = struct.pack(fmt, command, 32, tokenh, payloadLen, payloadstr)
    except:
        Log("APNS Data Error " +token+" " +message);
        return;     
    try:
        #Log(msg)
        sent = 0;
        while sent < len(msg):
            msg2 = msg[sent:];
            justSent = self.ssl_sock.write( msg2 )
            #Log(str(len(msg)) + " " + str(justSent))
            sent += justSent
            if justSent==0 :
                raise socket.error(0,"Send failed")
    except socket.error, err:
        Log( "APNS Error: "+str(self.counter)+" "+ str(err) )
        self.reset()
        if self.counter<=2 : self.send(token,message,badge,sound)
    Log( "APNS DONE"+ str(self.counter))
    self.counter = 0;
    self.lastPush = time()
...