从Go appengine网站发送Apple推送通知

时间:2016-10-11 03:44:42

标签: ios google-app-engine go push-notification

我正在尝试从Go appengine网站发送Apple推送通知。我正在使用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

看起来appengine希望您在发送出站请求时使用自己的urlfetch library,因此我尝试将基础HTTPClient设置为使用:{/ p>

client.HTTPClient = urlfetch.Client(ctx)

但是,Apple服务器的响应现在是

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

我认为问题是Apple推送通知require HTTP/2,但urlfetch只实现了HTTP / 1.1。

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

2 个答案:

答案 0 :(得分:2)

这需要通过App Engine Sockets API。文档说明:

  

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

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

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

答案 1 :(得分:-1)

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