2016-10-11 82 views
17

我正嘗試從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請求?

+1

我猜你需要通過結合['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) –

回答

-1

我不知道去appengine,但無論它從代碼看起來,你的client := apns2.NewClient(cert).Development()線似乎是有缺陷的,我認爲對於生產,你不需要開發證書,你需要有發行證書。因此請檢查是否有任何可用的選項。此外,來自蘋果開發網站的證書是由您或通過appengine生成的。如果您已手動創建該證書,則必須創建兩種證書類型,一種用於開發,一種用於分發/生產,當應用程序在生產模式下運行時,您需要使用該證書。

+0

這是不相關的。問題在於HTTP格式,而不是在證書中。 –

2

這將需要通過App Engine Sockets API。該文檔指出:

可以接受net.Conn的庫應該不加修改地工作。

您可以從appengine/socket包拿到net.Conn,並把它傳遞給一個lib將接受一個,但在apns2的情況下,它不允許你這樣做。但是另一個用戶的submitted a pull requestapns2項目中添加了可以使用App Engine套接字的不同GAEClient

截至目前看起來,提交仍然沒有被拉入主分支,但您仍然可以手動將這些更新手動合併到您自己的源代碼樹中,作爲現在的解決方法。