當iOS App需要透過Server推送通知時,就會需要寫一段server端的程式碼,連接到APNS發送推播;這個程序已經不是什麼秘密了,但在各教學網站中,通常都只教你怎麼用PHP寫一段推播程式碼,而實作的細節,卻是這些教學網站沒提到的。
大量推播怎麼發?
推播的PHP範例程式碼已經太常見了,在此就不再列出來,概略的推播程序會是這樣:
- 建立socket連線
- 打包payload
- 傳送
- 關閉socket連線
好的,問題來了,上面這程序是推送一筆通知的,如果現在要推送100筆通知呢?整個程序做100次嗎?
不對喔~
如果要推送100筆,程序上應該是這樣:
- 建立socket連線
- 打包payload(第1筆)
- 傳送(第1筆)
- 打包payload(第2筆)
- 傳送(第2筆)
- …(重複發完100筆)
- 關閉socket連線
好的,沒問題了,是嗎?
不是喔~
在APNS的文件中有提到,server端應持續發送payload,並偵測socket寫入的字元數;如果發現寫入字元數為0,表示socket斷線了,則必須將這一筆通知重發。
所以,上面的程序,必須將寫入字元數為0時的error handle加進去,程序完整了…嗎…
大量推播速度問題
實務上在作大量推播時,會發生socket確實寫入了,但手機卻一直收不到推播的情形;觀察推播發送的情形,大略是前十餘筆發出的會收到,之後的就全數石沈大海了。
這個問題在APNS文件中就沒有提到應該如何偵測、處理了。
解決方法:在每一筆payload寫入socket之後,等待50~200 ms後,再傳送下一筆。
這個等待時間的長短,網路上的實測結果長短不一,有些說只要等待50 ms,就可以正常發送,但我個人的實測結果,加到200 ms才不會遺失推播。
會不會這個數字隨著iOS的設備越來越多,就必須設定越來越久呢?天知道囉~
現在有http2應該比較快
很感謝你這篇
找出了自己的盲點