2016-10-11 6 views
17

से ऐप्पल पुश अधिसूचना भेजें मैं एक गो एपेंजिन साइट से ऐप्पल पुश अधिसूचना भेजने की कोशिश कर रहा हूं। इस प्रकार मैं apns2 library उपयोग कर रहा हूँ:गो एपेंजिन साइट

cert, err := certificate.FromPemFile(pemFile, "") 
if err != nil { 
    log.Fatalf("cert error: %v", err) 
} 
client := apns2.NewClient(cert).Development() 
n := &apns2.Notification{...} 
if res, err := client.Push(n); err != nil { ... } 

एक स्थानीय विकास सर्वर पर, यह ठीक काम करता है; लेकिन उत्पादन में मैं देख रहा हूँ:

Post https://api.development.push.apple.com/3/device/995aa87050518ca346f7254f3484d7d5c731ee93c35e3c359db9ddf95d035003: 
dial tcp: lookup api.development.push.apple.com on [::1]:53: dial udp [::1]:53: socket: operation not permitted 

यह ऐप्लिकेशन इंजन की तरह दिखता है आप का उपयोग करने की उम्मीद है अपनी ही urlfetch library आउटबाउंड अनुरोध भेजने, इसलिए मुझे लगता है कि उपयोग करने के लिए अंतर्निहित HTTPClient स्थापित करने की कोशिश की:

client.HTTPClient = urlfetch.Client(ctx) 

हालांकि , एप्पल सर्वर से प्रतिक्रिया अब है

@@?HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 504f5354202f332f6465766963652f393935616138373035 

मुझे विश्वास है, समस्या यह है कि एप्पल सूचनाएं require HTTP/2 धक्का लेकिन urlfetch केवल HTTP/1.1 लागू करता है।

मैं इस समस्या को कैसे हल करूं? क्या ऐपेंजिन ऐप को HTTP/2 अनुरोध भेजने का कोई तरीका है?

+1

मुझे लगता है कि आपको ['http.RoundTripper'] (https://golang.org/pkg/net/http/#RoundTripper) का अपना स्वयं का प्रत्यारोपण करना होगा [' http2.Transport'] (https://github.com/golang/net/blob/master/http2/transport.go#L299) और ['urlfetch.Transport'] (https://github.com/golang/appengine/blob/master/ urlfetch/urlfetch.go # एल 127) –

उत्तर

-1

मुझे एपेंगिन जाने के बारे में बहुत कुछ पता नहीं है, लेकिन जो भी यह कोड से दिखता है, आपकी client := apns2.NewClient(cert).Development() लाइन दोषपूर्ण प्रतीत होती है, मुझे लगता है कि उत्पादन के लिए आपको विकास प्रमाण की आवश्यकता नहीं है, आपको वितरण प्रमाण होना चाहिए। तो जांचें कि इसके लिए कोई विकल्प उपलब्ध है। साथ ही, सेब की देव साइट से प्रमाण पत्र आपके द्वारा उत्पन्न किए जाते हैं या एपेंगेन द्वारा जाते हैं। यदि आपने मैन्युअल रूप से इसे बनाया है, तो आपको 2 प्रकार के प्रमाणपत्र बनाना होगा, एक विकास के लिए और एक वितरण/उत्पादन के लिए, और जब उत्पादन मोड में ऐप चल रहा है, तो आपको उस प्रमाणपत्र का उपयोग करने की आवश्यकता है।

+0

यह असंबंधित है। यह मुद्दा HTTP प्रारूप में है, प्रमाणपत्र में नहीं। –

2

इसे App Engine Sockets API के माध्यम से जाने की आवश्यकता होगी। दस्तावेज़ीकरण में कहा गया है:

पुस्तकालय जो नेट स्वीकार कर सकते हैं। कॉन को संशोधन के बिना काम करना चाहिए।

आप appengine/socket पैकेज से net.Conn प्राप्त कर सकते हैं और यह एक lib है कि एक को स्वीकार करेंगे के पास है, लेकिन apns2 के मामले में यह आपको ऐसा करने की अनुमति नहीं है। हालांकि किसी अन्य उपयोगकर्ता के पास submitted a pull requestapns2 प्रोजेक्ट है जो एक अलग GAEClient जोड़ता है जो ऐप इंजन सॉकेट का उपयोग कर सकता है।

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