2017-09-20 12 views
8

पर पुश अधिसूचना भेज रहा है मैं php से ios तक पुश नोटिफिकेशन भेज रहा हूं।PHP: आईओएस

$passphrase = ''; 
$badge = 1; 
$path = base_path('path/to/certificate.pem'); 
$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', $path); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 
$fp = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195', $err, 
    $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx 
); 

if (!$fp) { 
    self::SavePush($device_token, $message, $device_id, $device_type, $user_id, "pending", "normal", null); 
} 

//echo 'Connected to APNS' . PHP_EOL; 
$body['aps'] = array(
    'alert' => $message, 
    'badge' => $badge, 
    'sound' => 'default' 
); 
$payload = json_encode($body); 
$msg = chr(0) . pack('n', 32) . pack('H*', $device_token) . pack('n', strlen($payload)) . $payload; 
$result = fwrite($fp, $msg, strlen($msg)); 

//print_r($result);exit; 

if (!$result) { 
    self::SavePush($device_token, $message, $device_id, $device_type, $user_id, "pending", "normal", null, $result); 
} else { 
    self::SavePush($device_token, $message, $device_id, $device_type, $user_id, "sent", "normal", null, $result); 
} 

fclose($fp); 

अब समस्या यह है कि मैं का सामना करना पड़ रहा है, मैं निर्धारित नहीं कर सकता है, तो एक अधिसूचना में विफल रहता है के रूप में $result एक पूर्णांक हर मामले में, या तो, सफलता या विफलता होता है: यह ठीक काम कर रहा है और यहाँ है मेरी कोड है। मैंने टोकन के रूप में एक यादृच्छिक अंक पारित किया है और यह 115 या 65 की तरह पूर्णांक देता है और यह हर बार बदलता है। तो !$result काम नहीं करेगा। अधिसूचना विफल होने पर मुझे कैसे पता चलेगा?

+0

संभवतः इस एक https://stackoverflow.com/questions/25830597/how-to-know-push-notification-delivery-status – arunjos007

उत्तर

6

fwrite() को कॉल करने के लिए कॉल सफलतापूर्वक भेजे गए बाइट्स की संख्या वापस कर देगा, या अगर कोई त्रुटि भेजने में विफलता वापस आ जाएगी। आपका $ परिणाम बदल रहा है क्योंकि यह आपके द्वारा भेजे जा रहे संदेश के आकार के साथ बदलता है। तो यह जानकर, आप अनुमान लगा सकते हैं कि अगर $ परिणाम === गलत तो एक त्रुटि हुई और अधिसूचना विफल रही। अगर $ परिणाम! == गलत, तो अधिसूचना सफलतापूर्वक भेजी गई थी। यह केवल सत्यापित करता है कि संदेश नेटवर्क पर भेजा गया था। यह सत्यापित नहीं करता है कि संदेश की संरचना या टोकन की वैधता या उस तरह की कुछ भी।

अब, यदि आप यह पता लगाने की कोशिश कर रहे हैं कि पुश अधिसूचना संदेश स्वयं मान्य है या वह सेब स्वीकार कर लिया गया है और इसे संसाधित कर रहा है, तो आप शायद ऐसा करने के लिए कर्ल और HTTP/2 करना चाहते हैं। एक त्वरित Google खोज करना मैं इस साइट पर आया था जो एक डेमो दिखाता है कि यह कैसे करें। मैंने इस साइट का परीक्षण नहीं किया है http://coding.tabasoft.it/ios/sending-push-notification-with-http2-and-php/ इसलिए आपको यह नहीं बता सकता कि डेमो सही है या नहीं। यह सिर्फ एक त्वरित खोज थी लेकिन आपको सही रास्ते पर ले जा सकती है।

+0

मैंने डुप्लिकेट $ परिणाम === झूठी कोशिश की, और यह काम नहीं किया। – Saani

+0

आपका क्या मतलब है कि यह काम नहीं करता है? क्या आपका मतलब है कि आप इस तथ्य के बारे में जानते हैं कि fwrite विफल हो गया है और आप कह रहे हैं कि यह झूठी नहीं लौटा? एकमात्र समय $ परिणाम === झूठा है जब fwrite विफल रहता है। http://php.net/manual/en/function.fwrite.php –

+0

अच्छी तरह से, मैंने इस डिवाइस टोकन को पास किया, "ddd" और निश्चित रूप से यह वैध डिवाइस टोकन नहीं है लेकिन '$ परिणाम === झूठा 'विफल रहा। – Saani

4

fwrite के साथ एपीएनएस को कुछ भेजने के बाद, आपको fread (या stream_get_contents;)) प्रतिक्रिया की आवश्यकता होगी। सबसे अच्छा तरीका गैर अवरुद्ध कनेक्शन (stream_set_blocking($fp, 0);) का उपयोग करें और सरल समय-सीमित पाश में प्रतिक्रिया के लिए प्रतीक्षा करने के लिए है:

$read = ''; 
$to = time() + 2; // max 2 seconds wait... 
while (!feof($fp)) // ...or end of connection 
{ 
    $r = stream_get_contents($fp); 
    if (strlen($r) > 0) 
     $read .= $r; 
    if (time() >= $to) 
     break; 
    usleep(100000); 
} 

उसके बाद, $read में आप या तो कुछ या कुछ भी नहीं होगा। कुछ (बिल्कुल 6 बाइट्स के साथ) त्रुटि का मतलब है ($error = unpack('Ccommand/Cstatus/Nident', $read);)। कुछ भी नहीं (या सामग्री कम/6 बाइट्स से अधिक) का मतलब सफलतापूर्वक संदेश भेजा गया है।

4

मेरे दो सेंट एक महत्वपूर्ण बिंदु को साफ़ करने के लिए: ऐप्पल के अनुसार, "वितरण की कोई गारंटी नहीं है" क्योंकि पुश इस तरह से काम करता है।

तो आप निश्चित रूप से नेटवर्क त्रुटियों के लिए परीक्षण कर सकते हैं, क्योंकि अन्य लोगों ने सुझाव दिया है लेकिन आपके पास कोई गारंटी अधिसूचना प्राप्त नहीं हुई है। ऐसा करने के लिए, केवल (लंबा ..) तरीका आईओएस डिवाइस में यूआरएल अनुरोध को ट्रिगर प्राप्त करने पर ट्रिगर प्राप्त करना है। यह यूआरएल अनुरोध आपके डीबी को अपडेट करेगा।