iOS的推播怎麼會收不到?

當iOS App需要透過Server推送通知時,就會需要寫一段server端的程式碼,連接到APNS發送推播;這個程序已經不是什麼秘密了,但在各教學網站中,通常都只教你怎麼用PHP寫一段推播程式碼,而實作的細節,卻是這些教學網站沒提到的。

大量推播怎麼發?

推播的PHP範例程式碼已經太常見了,在此就不再列出來,概略的推播程序會是這樣:

  1. 建立socket連線
  2. 打包payload
  3. 傳送
  4. 關閉socket連線

好的,問題來了,上面這程序是推送一筆通知的,如果現在要推送100筆通知呢?整個程序做100次嗎?

不對喔~

如果要推送100筆,程序上應該是這樣:

  1. 建立socket連線
  2. 打包payload(第1筆)
  3. 傳送(第1筆)
  4. 打包payload(第2筆)
  5. 傳送(第2筆)
  6. …(重複發完100筆)
  7. 關閉socket連線

好的,沒問題了,是嗎?

不是喔~

在APNS的文件中有提到,server端應持續發送payload,並偵測socket寫入的字元數;如果發現寫入字元數為0,表示socket斷線了,則必須將這一筆通知重發。

所以,上面的程序,必須將寫入字元數為0時的error handle加進去,程序完整了…嗎…

大量推播速度問題

實務上在作大量推播時,會發生socket確實寫入了,但手機卻一直收不到推播的情形;觀察推播發送的情形,大略是前十餘筆發出的會收到,之後的就全數石沈大海了。

這個問題在APNS文件中就沒有提到應該如何偵測、處理了。

解決方法:在每一筆payload寫入socket之後,等待50~200 ms後,再傳送下一筆。

這個等待時間的長短,網路上的實測結果長短不一,有些說只要等待50 ms,就可以正常發送,但我個人的實測結果,加到200 ms才不會遺失推播。

會不會這個數字隨著iOS的設備越來越多,就必須設定越來越久呢?天知道囉~

2 thoughts on “iOS的推播怎麼會收不到?

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *