2016-10-11 20 views
17

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?

+1

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) –

Odpowiedz

-1

Nie wiem zbyt wiele o tym, jak to zrobić, ale cokolwiek wygląda z kodu, Twoja linia client := apns2.NewClient(cert).Development() wydaje się być wadliwa, myślę, że do produkcji nie potrzebujesz certyfikatu programistycznego, musisz mieć certyfikat dystrybucji. Sprawdź, czy jest dostępna jakaś opcja. Ponadto, certyfikaty z witryny Apple'a są generowane przez ciebie lub przez appengine. Jeśli ręcznie je utworzyłeś, musisz utworzyć 2 typy certyfikatów: jeden do rozbudowy i jeden do dystrybucji/produkcji, a gdy aplikacja działa w trybie produkcyjnym, musisz użyć tych certyfikatów.

+0

To nie ma związku. Problem występuje w formacie HTTP, a nie w certyfikacie. –

2

Wymagałoby to przejścia przez App Engine Sockets API. Dokumentacja stwierdza:

Biblioteki, które mogą akceptować sieć. Połączenie powinno działać bez modyfikacji.

Można uzyskać net.Conn z pakietu appengine/socket i przekazać go do lib że zaakceptuje jeden, ale w przypadku apns2 to nie pozwala, aby to zrobić. Jednak inny użytkownik ma submitted a pull request do projektu apns2, który dodaje odrębne GAEClient, które mogą korzystać z gniazd App Engine.

Obecnie wygląda na to, że zatwierdzenia nadal nie zostały wciągnięte do gałęzi głównej, jednak nadal można połączyć te aktualizacje ręcznie z własnym drzewem źródłowym.