Próbuję wysłać powiadomienie push Apple z witryny Go appengine. Używam apns2 library następująco:Wysyłaj powiadomienie push Apple z witryny aplikacji Go app
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 { ... }
na lokalnym serwerze rozwoju, to działa dobrze; ale w produkcji widzę:
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
Wygląda AppEngine spodziewa się wykorzystywać własne urlfetch library podczas wysyłania żądań wychodzących, więc próbowałem ustawienie stanowiącego podstawę HTTPClient
użyć tego:
client.HTTPClient = urlfetch.Client(ctx)
jednak odpowiedź z serwera Apple jest teraz
@@?HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 504f5354202f332f6465766963652f393935616138373035
Uważam, że problemem jest to, że Apple powiadomienia push require HTTP/2, ale urlfetch implementuje tylko HTTP/1.1.
Jak rozwiązać ten problem? Czy istnieje aplikacja Appengine do wysyłania żądania HTTP/2?
Zgaduję, że musiałbyś wprowadzić własną implementację ['http.RoundTripper'] (https://golang.org/pkg/net/http/#RoundTripper) przez połączenie [' http2.Transport'] (https://github.com/golang/net/blob/master/http2/transport.go#L299) i ['urlfetch.Transport'] (https://github.com/golang/appengine/blob/master/ urlfetch/urlfetch.go # L127) –