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ć?
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
ile powiadomień push wysyłasz? – hjm
@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