2012-12-12 15 views
9

मुझे समस्या है जहां कुछ डिवाइस कल से पुश अधिसूचना प्राप्त नहीं करेंगे। सर्टिफिकेट/डिवाइस टोकन सही प्रतीत होता है, क्योंकि उपकरण कल तक पुश नोटिफिकेशन सफलतापूर्वक प्राप्त करने के लिए उपयोग किया जाता है।पुश अधिसूचना सफलतापूर्वक भेजी जाती है, लेकिन डिवाइस प्राप्त नहीं होता है (कभी-कभी)

सर्वर-साइड पर, कोई त्रुटि या कनेक्शन रिफ्यूसल नहीं हैं, और पुश अधिसूचना हर बार सफलतापूर्वक भेजी जाती है।

लेकिन फिर भी, ऐसे कई अवसर हैं जहां डिवाइस को धक्का नहीं मिलता है।

कुछ आसपास के जानकारी:

  • मैं उत्पादन वातावरण पर यह कर रहा हूं।
  • सर्वर-साइड
  • पर कोई त्रुटि/कनेक्शन रिफ्यूसल नहीं, मैं हर बार एक ही 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 कोड है क्या मैं इसे हल करता हूँ?

+0

तो मैं प्राप्त हो गया है की सलाह है कि उद्घाटन और हर एक संदेश के लिए सॉकेट बंद करने नहीं है आर जैसा कि ऐप्पल के आधिकारिक दस्तावेजों में उल्लेख किया गया है: "आपको कई अधिसूचनाओं में एपीएन के साथ कनेक्शन बनाए रखना चाहिए। एपीएन उन कनेक्शनों पर विचार कर सकते हैं जो तेजी से और बार-बार स्थापित किए जाते हैं और इनकार करने वाले सेवा हमले के रूप में फेंकते हैं। त्रुटि पर, एपीएन कनेक्शन को बंद कर देता है जिस पर त्रुटि हुई। " तो मैं अपने आर्किटेक्चर को ठीक करने का प्रयास करने जा रहा हूं ताकि मैं एकाधिक संदेशों में एक कनेक्शन का पुन: उपयोग कर सकूं। कनेक्शन का पुन: उपयोग करने के लिए सिस्टम को डिजाइन करने में कोई सलाह अच्छी होगी। धन्यवाद – ashiina

+1

आप कितनी पुश सूचनाएं भेज रहे हैं? – hjm

+0

@hjm मैं प्रति सेकंड 2 से अधिक कहूंगा। ऐप स्टोर पर बाहर है इसलिए हमारे पास पहले से ही एक सक्रिय उपयोगकर्ता आधार है। – ashiina

उत्तर

4

इसे स्वयं हल करें, इसलिए मैं एक उत्तर पोस्ट कर दूंगा।

मैं सलाह है कि खोलने और हर एक संदेश के लिए सॉकेट बंद करने अनुशंसित नहीं है, के रूप में एप्पल के आधिकारिक दस्तावेजों में उल्लेख प्राप्त किया है:

"आप एक से अधिक सूचनाएं भर APN के साथ कनेक्शन प्राप्त करना चाहिए।एपीएन उन कनेक्शनों पर विचार कर सकते हैं जो तेजी से और बार-बार स्थापित किए जाते हैं और इनकार करने वाले सेवा हमले के रूप में फेंकते हैं। त्रुटि होने पर, APN के कनेक्शन जिस पर त्रुटि हुई बंद कर देता है। "

मैं इतना है कि कनेक्शन कई APNS कॉल के दौरान बनाए रखा है मेरी वास्तुकला तय है, और अब यह किसी भी समस्या के बिना काम कर रहा है। मैं एक कतार सिस्टम बनाया के आधार पर APNS-php (https://code.google.com/p/apns-php/)

यहाँ किसी को भी, जो इसे जरूरत के लिए, मेरे कोड है:।

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

1

सबसे पहले जांचें कि क्या आपका डिवाइस जेलबैक है तो यह पुशोटोटिफिकेशन का समर्थन नहीं करेगा। इसके लिए आपको साइडिया से SAMPref ऐप डाउनलोड करना होगा और उस ऐप को खोलना होगा, फिर आपका डिवाइस पुश अधिसूचना का समर्थन कर रहा है। आप ऐप स्टोर से iPusher ऐप का उपयोग करके पुश अधिसूचना के लिए अपने डिवाइस का परीक्षण कर सकते हैं। अगर आपको पुश अधिसूचना मिलती है तो आपका डिवाइस समर्थित है।

उसके बाद पहली बार जांचें कि आपके ऐप को उचित पुश अधिसूचना सक्षम प्रमाणपत्र का उपयोग करके हस्ताक्षरित किया गया है?

धन्यवाद

संबंधित मुद्दे