1. 程式人生 > >基於http2的apns的push傳送平臺(使用go語言寫的)

基於http2的apns的push傳送平臺(使用go語言寫的)

在linux環境下執行上面的語句。需要改幾個引數,
這個http2的ios push推送真的是要了我的老命啊,足足用了兩個禮拜的時間,從零基礎的go語言開始,一步步的學習和找對應的例子,終於掌握了其中的使用技巧。從此,多了一項生存之道啊。哈哈!!
好的,直接進入主題吧,首先第一步,需要安裝一個go語言的環境,這個我之前的部落格上寫過了。來個跳轉地址:http://blog.csdn.net/Rodgexue/article/details/53789635。然後需要將你伺服器的curl升級到支援http2的版本,好的這些是準備工作。

一、使用最基本的curl命令來發送apns push。

從頭開始,如果校驗你的伺服器能不能傳送push呢?通過curl測試是否傳送成功是最簡單的方式。
curl -i -d '{"aps":{"alert":"Hello http2.0","sound":"msg_high.m4a","badgeNum":1}}'  --cert "push.pem":"" -H "apns-topic: 你的top,就是應用的bundle-id" --http2  https://api.development.push.apple.com/3/device/你要傳送的裝置的device_token
  • 一個是-d後面的內容,這個是需要根據你自己的應用,修改對應的結構。正常來說,上面的格式是能正常傳送出來的,但是在使用voip的push的情況下,一般voip(voice over ip) 是要ios8.0以上能使用的。使用這類push的時候,ios工程師可能會對push內容進行遮蔽等。這也是可能導致你介面返回值為200,但是手機上沒有收到push的問題的原因
  • 一個是curl命令的 -i,表示展示返回展示curl返回的header頭,因為push的返回結果是在header裡面的,如果是下面這個200,表示是成功,的,如果錯誤可以去官網檢視對應的編碼,正常curl也會展示出來的。最常見的錯誤就是
HTTP/2 200 
apns-id: 65743B1B-BB3A-3CD6-BD27-D566660642D8
  • 最常見的錯誤是兩個,一個是 bad device token, 一個是Topic disallowed。這兩個問題的時候,先是Topic Disallowed這個問題,這個是你的topic不被允許,你再和ios開發確認下應用的bundle id,如果他確定的話,然後你可以在你的bundle id的後面加上 .voip ,然後再去試一下,如bundle id為com.a.a, 然後試著將上面的curl的語句修改下, -H "apns-topic: com.a.a.voip

    然後再去試下

  • 還有個最長見的錯誤是 bad device token,這個的話,你要確保你的證書是通用版證書,這個可以百度查下或者問ios開發。生成後,要放在你執行curl命令的地址下面,因為我--cert "push.pem":"" 這條命令後面是相對路徑,然後名字也需要修改成你要的名字,然後要保證你的device_token是debug包還是生產包生成。如果是debug包生成的device token的話,就傳送到https://api.development.push.apple.com/3/device/你要傳送的裝置的device_token這個蘋果的沙盒地址,如果你的device token是生產包的話,需要傳送到https://api.push.apple.com/3/device/你要傳送的裝置的device_token這個蘋果的生產環境地址。

二、使用go語言的apns的開源程式來發送push

我的go語言的push找的是GitHub上開源的,下載地址如下:https://github.com/RobotsAndPencils/buford
1.需要修改的地方是src/github.com/RobotsAndPencils/buford/push/service.go這個路徑下的service.go檔案需要修改。
在設定header的地方增加一行,不然會因為topic沒有報錯的

req.Header.Set("apns-topic", "com.a.a.voip")
headers.set(req.Header)

2.然後可以將以.p12結尾的通用版證書放在這個目錄下面src/github.com/RobotsAndPencils/buford/example/push。然後在這個目錄下,編譯打碼,用go build main.go,會生成一個main的可執行檔案,然後輸入命令 ./main -d 裝置的device_token -c push.p12 -p 證書密碼 -e development,這樣就能給debug版本的傳送push了。

3.src/github.com/RobotsAndPencils/buford/example/concurrent這個目錄下下的main.go的話,是用go的並行的方式來發送push,增加push的效率。核心邏輯就是在主執行緒裡面,用for迴圈不斷的去redis去資料,然後取到資料後,放入chennel裡面,然後在程式碼中,go func後面的程式碼表示子程序。讀取這個chennel來發送push