我們的推送通知腳本已運行近一年,但突然停止工作。該腳本執行以下操作:發送到APNS套接字服務器的最大設備數
查詢一個DB的iPhone設備令牌列表
打開一個SSL套接字連接到蘋果的現場APNS服務器
$ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', $apnsCert); stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); $fp = stream_socket_client($apnsHost, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
與創建了一個有效載荷255字節大小的消息
$payload = '{ "aps": { "alert": "' . $message . '", "badge": 1, "sound": "default" } }';
循環遍歷每個設備並將有效負載寫入打開的連接。
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload; fwrite($fp, $msg);
然後關閉連接。
fclose($fp);
所以我的問題是在腳本this--一切都沒有改變,但改變的是數據庫的大小。我創建了一個Web界面,允許用戶將有效載荷發送給所有iphone設備,並在運行時只需幾秒鐘即可發送/加載。數據庫中的設備數量(大約3500)是否有可能造成問題?
當我寫入套接字時,我可以發送推送通知的設備的最大數量是多少?是否存在最大值或極限值?
在開發模式下測試時,我創建了5個僞造的令牌UDID,並在最後放置了一個真實的UDID,然後做了OP所做的(設置一個循環)以基本測試如果前幾個出現問題會發生什麼第一次嘗試失敗(或者有其他錯誤),(從未在真實設備上獲得通知)。進一步測試我先發送了真正的一個,然後發送了5個假的循環。這成功了。這似乎天生不好處理第一次發送的UDID的方式? – hokkuk
這意味着如果有人抹去了他們的設備,並且它的令牌號碼位於你的發送設備組的中間,那麼你的通知沒有被傳送,並且你不知道他們是否已經通過..有人可以證實這個「實驗」,我也可能有某種導致此行爲的消息錯誤長度。如果這是蘋果公司的目標,我們將非常高興。 – hokkuk
不確定2012年的情況如何,但是當前設備無法接受通知(例如,由於應用被刪除),連接不會丟失。我很難想象,這種行爲甚至是可能的,因爲它會使APNS無法使用 - 應用程序會不斷從設備中刪除。 – silentser