Ich habe ein Problem, wo einige Geräte keine Push-Benachrichtigung erhalten, seit gestern. Das Zertifikat/Geräte-Token scheint korrekt zu sein, da das Gerät bis gestern Push-Benachrichtigungen erfolgreich empfangen hat.Push-Benachrichtigung erfolgreich gesendet, aber das Gerät nicht empfangen (gelegentlich)
Auf der Serverseite gibt es keine Fehler oder Verbindungsverweigerungen, und die Push-Benachrichtigung scheint jedes Mal erfolgreich gesendet zu werden.
Dennoch gibt es viele Gelegenheiten, bei denen das Gerät den Push nicht korrekt empfängt.
Einige Umgebungsinformationen:
- Ich tue dies auf die Produktionsumgebung.
- Keine Fehler/Verbindungsverweigerungen auf der Serverseite
- Ich sende immer die genau gleiche JSON.
- 2 unserer Geräte erhalten die Benachrichtigung nicht Push AT ALL seit gestern
- 1 unserer Vorrichtung mit einer niedrigeren Erfolgsrate Push-Benachrichtigungen erhält (etwa 70%) als gestern
- 1 ~ 2 unserer Geräte erhalten nach wie vor Push-Benachrichtigungen auch jetzt erfolgreich.
- Alle oben genannten Geräte konnten bis gestern in der Produktionsumgebung ordnungsgemäß Push-Benachrichtigungen empfangen.
Es gibt keinen Unterschied in dem serverseitigen Ergebnis, wenn der Druck erfolgreich ist, und wenn das Gerät es nicht empfängt ... Daher ist es praktisch unmöglich, das Problem zu identifizieren.
Dies ist die serverseitige PHP-Code verwende ich:
$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);
Das Protokoll sagt mir, dass die Push erfolgreich war (das Token für die Privatsphäre Ausschneiden):
[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)
Wie löse ich das?
So habe ich erhalten Beratung, dass das Öffnen und Schließen der Buchse für jede einzelne Nachricht nicht r empfohlen, wie in den offiziellen Dokumenten von Apple vermerkt: "Sie sollten auch Verbindungen mit APNs über mehrere Benachrichtigungen beibehalten. APNs können Verbindungen in Betracht ziehen, die schnell und wiederholt als Denial-of-Service-Angriffe eingerichtet und abgebaut werden. Bei einem Fehler schließt APNs die Verbindung, bei der der Fehler aufgetreten ist. " Also werde ich versuchen, meine Architektur zu reparieren, so dass ich eine Verbindung über mehrere Nachrichten wiederverwenden kann. Jeder Ratschlag beim Entwerfen eines Systems zur Wiederverwendung der Verbindung wird nett sein. Danke – ashiina
wie viele Push-Benachrichtigungen senden Sie? – hjm
@hjm Ich würde sagen, mehr als 2 pro Sekunde.Die App ist in den Läden, so dass wir eine aktive Benutzerbasis bereits haben. – ashiina