如何从Go appengine网站发送Apple推送通知?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (88)

我正尝试从Go appengine网站发送Apple推送通知。我正在使用apns2库,如下所示:

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库,所以我试着设置底层HTTPClient使用:

client.HTTPClient = urlfetch.Client(ctx)

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

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

我相信问题是Apple推送通知需要HTTP / 2,但是urlfetch仅实现HTTP / 1.1。

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

提问于
用户回答回答于

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

用户回答回答于

这需要通过App Engine套接字API。该文件指出:

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

你可以net.Connappengine/socket包中获得一个,并将它传递给一个可以接受它的库,但是在apns2它不允许你这样做的情况下。然而,另一个用户已经向该项目提交了一个pull请求,该请求apns2添加了GAEClient可以使用App Engine套接字的独特的。

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励