2009-08-14 12 views
28

से पूछने के लिए PHP तकनीक क्या कोई स्पष्टीकरण दे सकता है कि एपीएन (ऐप्पल पुश अधिसूचना) क्या चाहता है कि आप इसे कैसे पूछें?एपीएन फीडबैक सर्वर

दस्तावेज़ कहते हैं कि कनेक्शन जल्द ही भेजना शुरू हो जाता है। क्या इसका मतलब यह है कि मैं fread() पर ऐसा नहीं करता?

यह मेरा वर्तमान कोड है और इसे पढ़ने के लिए यहां है। मैंने fread() को लूप में नहीं रखा क्योंकि मुझे नहीं पता कि कौन सी प्रतिक्रिया "पढ़ने के लिए और रिकॉर्ड नहीं" इंगित करती है और मैं अपने सर्वर पर एक अनंत लूप नहीं चाहता था।

<?php 
$apnsCert = 'HOHRO-prod.pem'; 

$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
stream_context_set_option($streamContext, 'ssl', 'verify_peer', false); 

$apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext); 

echo 'error=' . $error; 
echo 'errorString=' . $errorString; 


$result = fread($apns, 38); 
echo 'result=' . $result; 


fclose($apns); 
?> 

अब तक मुझे जो कुछ मिल रहा है वह एक शून्य उत्तर है। कोई त्रुटि नहीं है इसलिए यह कनेक्ट हो रहा है।

मुझे नहीं पता कि शून्य उत्तर का मतलब है कि कोई डेटा नहीं है, या मेरा fread() ऐसा करने का गलत तरीका है।

धन्यवाद

+0

आज मैंने पाया कि fread() APN के प्रतिक्रिया वास्तविक प्रतिक्रिया जब तक कचरा डेटा भेजता है क्योंकि काम नहीं करेगा। इससे असफल होने का कारण बनता है, क्योंकि यह शून्य/खाली डेटा पढ़ रहा है। जैसा कि gw1921 नीचे उल्लेखित है, आपको स्ट्रॉन (फीड ($ apns, 38) तक feof() पर लूप होना चाहिए। उस बिंदु से, आपके पास वैध प्रतिक्रिया होगी। फिर, डेटा को अनपैक करें क्योंकि नीचे बी ने सुझाव दिया है। (एक और गंदा गॉचा: अनइंस्टॉल किया गया ऐप फीडबैक उत्पन्न नहीं करेगा जब तक कि आपके पास एक ही एपीएस-पर्यावरण के साथ डिवाइस पर कोई अन्य ऐप न हो। इसलिए आपको अनइंस्टॉल किए गए एक को प्रतिक्रिया को पॉप्युलेट करने के लिए अपने डिवाइस पर 2 पुश-सक्षम सैंडबॉक्स ऐप्स की आवश्यकता है।) – brack

+0

यहां तक ​​कि मेरे पास एक समान कोड है और मैं भी फ्रेड से शून्य हो जाता हूं। सुनिश्चित नहीं है कि मेरा कोड वास्तव में काम कर रहा है और एपीएनएस एक पूर्ण उत्तर भेज रहा है या बस कुछ गुम है। मुझे यकीन है कि एपीएनएस से मेरा कनेक्शन सफल है। मैंने अपने आवेदन को कुछ 5-10 उपकरणों पर स्थापित किया था और कुछ अलर्ट भेज दिए थे और फिर एप्लिकेशन से कुछ अनइंस्टॉल किया था और फिर अलर्ट भेजना शुरू कर दिया था ताकि एपीएनएस फीडबैक सर्वर हमें बताएगा कि यह कुछ उपकरणों को वितरित करने में विफल रहा है। मुझे फ्रेड() में रिक्त स्थान के अलावा कुछ भी नहीं मिला है :-(यदि आपने कुछ अलग किया है और इसे काम कर लिया है तो कृपया मुझे बताएं। – Anish

+0

क्या आपने "पुशुटिल" का उपयोग किया है? एक बार जब आप इसे समझ लेंगे, तो यह एक तेज़ तरीका है फीडबैक सर्वर की जांच करने के लिए। यह एक मैक ओएस एक्स यूटिलिटी है जिसे आप संकलित करते हैं और फिर यूनिक्स कमांड लाइन से चलाते हैं। Google एरिका सदन - यह पुश के तहत अपनी साइट पर है। –

उत्तर

1

मुझे सेब फोरम से समाधान मिला और यह विकास के लिए है। उत्पादन के लिए भी कोशिश करें।

"ठीक है, गूंगा के रूप में के रूप में यह लग रहा है, मैं एक समाधान नहीं मिला:

कार्यक्रम पोर्टल में एक डमी एप्लिकेशन आईडी बनाएं, पर यह बनाएँ और डाउनलोड जुड़े प्रावधान प्रोफ़ाइल एक नया बनाएं विकास पुश सूचनाएं सक्षम एक्सकोड प्रोजेक्ट, और रजिस्टर पर लॉग इन करेंमोरोटोटोटेशन टाइप विधि। अपने डिवाइस पर डमी ऐप इंस्टॉल करें। इस बिंदु पर, आपके डिवाइस पर दो डेवलपमेंट ऐप्स चल रहे हैं: मूल ऐप और डमी ऐप। दोनों को धक्का प्राप्त करने के लिए पंजीकृत होना चाहिए नोटिफिकेशन मूल ऐप को अनइंस्टॉल करें, और उस ऐप पर पुश अधिसूचना भेजने का प्रयास करें। फीडबैक सेरेशन को आमंत्रित करें उपाध्यक्ष, और आपको डेटा वापस प्राप्त करना चाहिए। "

2

वह कोड सही दिखता है हालांकि आपको सभी डिवाइस कोड पढ़ने के लिए लूप की आवश्यकता है और स्ट्रीम के अंत की जांच करनी है।

while (!feof($apns)) { 
     $devcon = fread($apns, 38); 
} 

हालांकि मेरी समस्या डेटा की वास्तविक अनपॅकिंग है। क्या किसी को पता है कि बाइनरी डेटा को अनपैक कैसे करना है जिसे आपने टाइमस्टैम्प इत्यादि के साथ वास्तविक डिवाइस आईडी (स्ट्रिंग के रूप में) प्राप्त करने के लिए अभी पढ़ा है?

+1

मुझे लगता है कि यह सही विचार है - $ array = unpack ("NnH32", $ परिणाम); $ फीडबैकटाइम = $ पंक्ति [0]; $ फीडबैक लेन = $ पंक्ति [1]; $ feedbackUDID = $ पंक्ति [2]; जो फीडबैक सर्वर द्वारा भेजे गए 38 बाइट्स को अनपैक करता है। हालांकि, 32-बिट दिनांक मान नेटवर्क ऑर्डर या बड़े-एंडियन में है। अगर कोई एक PHP फ़ंक्शन प्रदान कर सकता है जो इस 4 बाइट्स को इंटेल (छोटे-एंडियन) ऑर्डर पर फ़्लिप करेगा, तो मुझे लगता है कि हमारे पास समाधान है। नोट: वास्तविक यूडीआईडी ​​एक वर्ण स्ट्रिंग है और इसके ऑर्डर को फ़्लिप करने की आवश्यकता नहीं है। –

+0

यह कोई अच्छा है? --------- /* नेटवर्क आदेश */ समारोह FToN ($ वैल) { $ एक = खोल ("मैं", पैक ("f" करने के लिए HostOrder से नाव कन्वर्ट, $ वैल)); रिटर्न पैक ("एन", $ ए [1]); } /* नेटवर्क आदेश से HostOrder को नाव कन्वर्ट */ समारोह NToF ($ वैल) { $ एक = खोल ("एन", $ वैल); $ बी = अनपैक ("एफ", पैक ("मैं", $ ए [1]); $ b [1] वापसी; } – strange

0

यह अंत में मेरे लिए काम किया।

$arr = unpack("H*", $devconts); 
$rawhex = trim(implode("", $arr)); 

$feedbackTime = hexdec(substr($rawhex, 0, 8)); 
$feedbackDate = date('Y-m-d H:i', $feedbackTime); 
$feedbackLen = hexdec(substr($rawhex, 8, 4)); 
$feedbackDeviceToken = substr($rawhex, 12, 64); 

और फिर आप बस टाइमस्टैम्प के खिलाफ डिवाइस टोकन की जांच करें!

+0

यह बहुत अच्छा काम करता है, gw1921। मैं अब के लिए SQL कॉलम में $ फीडबैकडेट संग्रहीत कर रहा हूं।कॉलम किस प्रकार का डेटा होना चाहिए? मैंने इसे इंटीजर पर सेट किया और वह मुझे "200 9" दे रहा है। अन्य 2 कॉलम, लंबाई और टोकन, बढ़िया काम !! धन्यवाद –

70

यहां एक बड़ा गॉचा है जो मुझे पहली बार कनेक्ट करने का प्रयास करने में उलझन में डालता है: एपीएनएस फीडबैक सर्वर केवल आपके डिवाइस पर टोकन लौटाते हैं, जो आपके अंतिम प्रतिक्रिया अनुरोध के बाद से "समाप्त हो चुके हैं" । जिसका अर्थ है कि ज्यादातर समय आपको एक पूर्ण प्रतिक्रिया मिलेगी जबतक कि आप पहले से ही अपने ऐप के उपयोगकर्ताओं की उच्च मात्रा से निपट नहीं रहे हैं।

तो सुनिश्चित करें कि आप समाप्त हो चुके डिवाइस टोकन डिस्क या डीबी पर संग्रहीत करें, क्योंकि आपकी प्रतिक्रिया क्वेरी के बाद वे अच्छे के लिए चले गए हैं। यह कम से कम कहने के लिए दर्द का परीक्षण करता है!

यहां एक संपूर्ण समारोह APNS प्रतिक्रिया सर्वर से डिवाइस टोकन लाने के लिए है (उत्तर देने के लिए बहुत धन्यवाद ऊपर की मदद करने के लिए मुझे यह सब एक साथ रखा के लिए):

function send_feedback_request() { 
    //connect to the APNS feedback servers 
    //make sure you're using the right dev/production server & cert combo! 
    $stream_context = stream_context_create(); 
    stream_context_set_option($stream_context, 'ssl', 'local_cert', '/path/to/my/cert.pem'); 
    $apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context); 
    if(!$apns) { 
     echo "ERROR $errcode: $errstr\n"; 
     return; 
    } 


    $feedback_tokens = array(); 
    //and read the data on the connection: 
    while(!feof($apns)) { 
     $data = fread($apns, 38); 
     if(strlen($data)) { 
      $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data); 
     } 
    } 
    fclose($apns); 
    return $feedback_tokens; 
} 

सब कुछ ठीक है, तो से वापसी मान मेरे लिए अच्छा काम करता है -

Array 
(
    Array 
    (
     [timestamp] => 1266604759 
     [length] => 32 
     [devtoken] => abc1234..............etcetc 
    ), 
    Array 
    (
     [timestamp] => 1266604922 
     [length] => 32 
     [devtoken] => def56789..............etcetc 
    ), 
) 
+0

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

+0

यह उत्तर स्वीकृत समाधान, आईएमओ होना चाहिए। यह मूल रूप से मैं कर रहा हूं, और यह पूरी तरह से काम करता है। यदि आप अभी भी इस विधि के साथ फीडबैक डेटा नहीं देख रहे हैं, तो सत्यापित करें कि आपके पास डिवाइस w/push सक्षम पर एक और ऐप है जो अनइंस्टॉल किए गए ऐप के समान एपीएस-पर्यावरण को रिपोर्ट करता है। जॉनी- टाइमस्टैम्प के बारे में, एक बार जब आप निक के पोस्ट में इसे अनपैक करते हैं, तो आप एक पूर्णांक तुलना कर सकते हैं। – brack

+1

किस मामले में मुझे फीडबैक सर्वर से कोई प्रतिक्रिया नहीं मिलेगी? मेरी सूचनाएं ठीक से गुजरती हैं (जैसा कि मैं लॉग से कह सकता हूं) लेकिन किसी कारण से मुझे डिवाइस पर कभी भी कोई सूचना नहीं मिलती है! – lostInTransit

0

बस इस पुस्तकालय का उपयोग शुरू किया: इस समारोह कुछ इस तरह (print_r के माध्यम से()) दिखेगा!

https://github.com/mac-cain13/notificato