मुझे समस्या है जहां कुछ डिवाइस कल से पुश अधिसूचना प्राप्त नहीं करेंगे। सर्टिफिकेट/डिवाइस टोकन सही प्रतीत होता है, क्योंकि उपकरण कल तक पुश नोटिफिकेशन सफलतापूर्वक प्राप्त करने के लिए उपयोग किया जाता है।पुश अधिसूचना सफलतापूर्वक भेजी जाती है, लेकिन डिवाइस प्राप्त नहीं होता है (कभी-कभी)
सर्वर-साइड पर, कोई त्रुटि या कनेक्शन रिफ्यूसल नहीं हैं, और पुश अधिसूचना हर बार सफलतापूर्वक भेजी जाती है।
लेकिन फिर भी, ऐसे कई अवसर हैं जहां डिवाइस को धक्का नहीं मिलता है।
कुछ आसपास के जानकारी:
- मैं उत्पादन वातावरण पर यह कर रहा हूं।
- सर्वर-साइड
- पर कोई त्रुटि/कनेक्शन रिफ्यूसल नहीं, मैं हर बार एक ही JSON भेज रहा हूं।
- हमारे उपकरणों के 2 पुश अधिसूचना प्राप्त नहीं कर रहे बिल्कुल कल से
- हमारे डिवाइस का 1 प्राप्त करता है कल की तुलना में कम सफलता दर (लगभग 70%) में पुश सूचनाएं
- 1 ~ हमारे उपकरणों के 2 अभी भी प्राप्त अभी भी अधिसूचनाओं को सफलतापूर्वक पुश करें।
- उपरोक्त सभी डिवाइस कल तक उत्पादन वातावरण पर पुश नोटिफिकेशन प्राप्त करने में सक्षम थे।
वहाँ धक्का सफल हुआ जब के लिए सर्वर साइड परिणाम में कोई अंतर नहीं है, और डिवाइस यह प्राप्त नहीं होता है जब ... इसलिए यह लगभग असंभव समस्या की पहचान है।
[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)
कैसे:
$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);
लॉग मुझे (गोपनीयता के लिए टोकन बाहर काटना) बताता धक्का सफल रहा था कि:
यह मैं उपयोग कर रहा हूँ सर्वर साइड PHP कोड है क्या मैं इसे हल करता हूँ?
तो मैं प्राप्त हो गया है की सलाह है कि उद्घाटन और हर एक संदेश के लिए सॉकेट बंद करने नहीं है आर जैसा कि ऐप्पल के आधिकारिक दस्तावेजों में उल्लेख किया गया है: "आपको कई अधिसूचनाओं में एपीएन के साथ कनेक्शन बनाए रखना चाहिए। एपीएन उन कनेक्शनों पर विचार कर सकते हैं जो तेजी से और बार-बार स्थापित किए जाते हैं और इनकार करने वाले सेवा हमले के रूप में फेंकते हैं। त्रुटि पर, एपीएन कनेक्शन को बंद कर देता है जिस पर त्रुटि हुई। " तो मैं अपने आर्किटेक्चर को ठीक करने का प्रयास करने जा रहा हूं ताकि मैं एकाधिक संदेशों में एक कनेक्शन का पुन: उपयोग कर सकूं। कनेक्शन का पुन: उपयोग करने के लिए सिस्टम को डिजाइन करने में कोई सलाह अच्छी होगी। धन्यवाद – ashiina
आप कितनी पुश सूचनाएं भेज रहे हैं? – hjm
@hjm मैं प्रति सेकंड 2 से अधिक कहूंगा। ऐप स्टोर पर बाहर है इसलिए हमारे पास पहले से ही एक सक्रिय उपयोगकर्ता आधार है। – ashiina