2016-10-11 84 views
17

我正尝试从Go appengine网站发送Apple推送通知。我使用的apns2 library如下:发送来自Go Appengine网站的Apple推送通知

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 

它看起来像AppEngine上希望你用自己的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。

我该如何解决这个问题?有没有办法让appengine应用程序发送HTTP/2请求?

+1

我猜你需要通过结合['http2.Transport']来使自己[[http.RoundTripper]](https://golang.org/pkg/net/http/#RoundTripper) (https://github.com/golang/net/blob/master/http2/transport.go#L299)和['urlfetch.Transport'](https://github.com/golang/appengine/blob/master/ urlfetch/urlfetch.go#L127) –

回答

-1

我不知道去appengine,但无论它从代码看起来,你的client := apns2.NewClient(cert).Development()线似乎是有缺陷的,我认为对于生产,你不需要开发证书,你需要有发行证书。因此请检查是否有任何可用的选项。此外,来自苹果开发网站的证书是由您或通过appengine生成的。如果您已手动创建该证书,则必须创建两种证书类型,一种用于开发,一种用于分发/生产,当应用程序在生产模式下运行时,您需要使用该证书。

+0

这是不相关的。问题在于HTTP格式,而不是在证书中。 –

2

这将需要通过App Engine Sockets API。该文档指出:

可以接受net.Conn的库应该不加修改地工作。

您可以从appengine/socket包拿到net.Conn,并把它传递给一个lib将接受一个,但在apns2的情况下,它不允许你这样做。但是另一个用户的submitted a pull requestapns2项目中添加了可以使用App Engine套接字的不同GAEClient

截至目前看起来,提交仍然没有被拉入主分支,但您仍然可以手动将这些更新手动合并到您自己的源代码树中,作为现在的解决方法。