我正尝试从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请求?
我猜你需要通过结合['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) –