2012-12-12 12 views
9

Mam problem z tym, że niektóre urządzenia nie otrzymają powiadomienia push od wczoraj. Wydaje się, że token certyfikatu/urządzenia jest prawidłowy, od urządzenia, z którego wysyłano powiadomienia push do wczoraj.Powiadomienie push zostało pomyślnie wysłane, ale urządzenie nie odbiera (okazjonalnie)

Po stronie serwera nie występują żadne błędy ani odmowy połączenia, , a powiadomienie wypychane wydaje się pomyślnie wysyłane za każdym razem.

Jednak wciąż istnieje wiele sytuacji, w których urządzenie nie odbiera poprawnie naciśnięcia.

Niektóre otaczający informacje:

  • robie to w środowisku produkcyjnym.
  • Brak błędów/odmowy połączenia po stronie serwera
  • Wysyłam dokładnie ten sam JSON za każdym razem.
  • 2 z naszych urządzeń nie są otrzymaniu powiadomienia push ALL od wczoraj
  • 1 naszego urządzenia otrzymuje powiadomienia push na niższym wskaźnikiem sukcesu (około 70%) niż wczoraj
  • 1 ~ 2 naszej urządzeń nadal odbierać wypychaj powiadomienia z powodzeniem nawet teraz.
  • Wszystkie powyższe urządzenia były w stanie prawidłowo odbierać powiadomienia push w środowisku produkcyjnym do wczoraj.

Nie ma różnicy w wyniku po stronie serwera, gdy push jest udane, a gdy urządzenie nie otrzyma go ... Dlatego jest to praktycznie niemożliwe do zidentyfikowania problemu.

To jest po stronie serwera kod PHP Używam:

 $ctx = stream_context_create(); 
     stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsData[$development]['certificate']); 
     $fp = stream_socket_client($this->apnsData[$development]['ssl'], $error, $errorString, 100, (STREAM_CLIENT_C ONNECT|STREAM_CLIENT_PERSISTENT), $ctx); 

     if(!$fp){ 
       $this->_pushFailed($pid); 
       $this->_triggerError("Failed to connect to APNS: {$error} {$errorString}."); 
     } 
     else { 
       $msg = chr(0).pack("n",32).pack('H*',$token).pack("n",strlen($message)).$message; 
       $fwrite = fwrite($fp, $msg); 
       if(!$fwrite) { 
         error_log("[APNS] push failed..."); 
         $this->_pushFailed($pid); 
         $this->_triggerError("Failed writing to stream.", E_USER_ERROR); 
       } 
       else { 
         error_log("[APNS] push successful! ::: $token -> $message ($fwrite bytes)"); 
       } 
     } 
     fclose($fp); 

Dziennik mi mówi, że nacisk był udany (Wycinanie token prywatności):

[Wed Dec 12 11:42:00 2012] [error] [client 10.161.6.177] [APNS] push successful! ::: aa4f******44 -> {"aps":{"alert":{"body":"\\u300casdfasdf\\u300d","action-loc-key":"OK"},"badge":4,"sound":"chime"}} (134 bytes) 

Jak mam to rozwiązać?

+0

Więc Dostałem informację, że otwieranie i zamykanie gniazdo dla każdej pojedynczej wiadomości nie jest r Zauważono, jak zauważono w oficjalnych dokumentach Apple: "Powinieneś również zachować połączenia z numerami APN w wielu powiadomieniach. APN mogą brać pod uwagę połączenia, które są szybko i wielokrotnie ustanawiane i zrywane jako atak typu "odmowa usługi". Po błędzie APN zamyka połączenie, w którym wystąpił błąd. " Spróbuję więc naprawić moją architekturę, aby ponownie połączyć się z wieloma wiadomościami. Każda rada w projektowaniu systemu do ponownego użycia połączenia będzie przyjemna. Dzięki – ashiina

+1

ile powiadomień push wysyłasz? – hjm

+0

@hjm Powiedziałbym więcej niż 2 na sekundę. Aplikacja jest dostępna w sklepach, więc mamy już aktywną bazę użytkowników. – ashiina

Odpowiedz

4

Rozwiązałem to sam, więc będę zamieszczać odpowiedzi.

Dostałem informację, że otwieranie i zamykanie gniazdo dla każdej pojedynczej wiadomości nie jest zalecane, jak wspomniano w dokumentach urzędowych Apple'a:

„Należy również zachować połączeń z APN w wielu zgłoszeń.APN mogą brać pod uwagę połączenia, które są szybko i wielokrotnie ustanawiane i zrywane jako atak typu "odmowa usługi". Po błędzie, APN zamyka połączenie, w którym wystąpił błąd.”

naprawiłem moją architekturę tak, że połączenie jest zachowana w całym stwardnienie APNS nazywa, a teraz działa bez problemu. I stworzył system kolejkowania na podstawie APN-php (https://code.google.com/p/apns-php/)

Oto mój kod, dla każdego, kto tego potrzebuje.

https://github.com/ashiina/APNS-QueueServer

1

Najpierw sprawdź, czy twoje urządzenie jest jailbreak, to nie obsługuje PushNotification. W tym celu należy pobrać aplikację SAMPref z Cydii i otworzyć tę aplikację, a następnie urządzenie obsługuje powiadomienia push. Możesz przetestować swoje urządzenie pod kątem powiadomień push przy użyciu aplikacji iPusher ze sklepu z aplikacjami. jeśli otrzymasz powiadomienie push, twoje urządzenie jest obsługiwane.

Po tym pierwszym sprawdzeniu aplikacja jest podpisana przy użyciu odpowiedniego certyfikatu z włączonym powiadomieniem push?

Dziękujemy

Powiązane problemy