2011-07-25 57 views
3

我們的推送通知腳本已運行近一年,但突然停止工作。該腳本執行以下操作:發送到APNS套接字服務器的最大設備數

  1. 查詢一個DB的iPhone設備令牌列表

  2. 打開一個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); 
    
  3. 與創建了一個有效載荷255字節大小的消息

    $payload = '{ 
        "aps": { 
        "alert": "' . $message . '", 
        "badge": 1, 
        "sound": "default" 
        } 
    }'; 
    
  4. 循環遍歷每個設備並將有效負載寫入打開的連接。

    $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload; 
    fwrite($fp, $msg); 
    
  5. 然後關閉連接。

    fclose($fp); 
    

所以我的問題是在腳本this--一切都沒有改變,但改變的是數據庫的大小。我創建了一個Web界面,允許用戶將有效載荷發送給所有iphone設備,並在運行時只需幾秒鐘即可發送/加載。數據庫中的設備數量(大約3500)是否有可能造成問題?

當我寫入套接字時,我可以發送推送通知的設備的最大數量是多少?是否存在最大值或極限值?

回答

5

問題不在於發送到APNS的設備數量。問題原來是Apple改變了他們的API。您現在需要檢查每一臺設備,看它是否仍然有效(例如,如果他們拒絕推送通知,設備是否刪除了應用程序等)。如果設備不再接受來自應用程序的推送通知,並且無論如何都會向其發送一個通知,Apple會立即斷開與APNS套接字的連接。我現在有一個cronjob,每天運行一個程序,檢查並刪除我的數據庫中不再接受推送通知的任何設備(Apple有此列表)。但要小心 - 一旦你從Apple中提取禁用的設備ID列表,Apple會將其從服務器上刪除,並且您可以從永不再再次拉它。

您還需要更新您的推送通知代碼以檢查連接是否被刪除。當連接斷開時,程序需要重新建立連接並嘗試再次推送。

+0

在開發模式下測試時,我創建了5個僞造的令牌UDID,並在最後放置了一個真實的UDID,然後做了OP所做的(設置一個循環)以基本測試如果前幾個出現問題會發生什麼第一次嘗試失敗(或者有其他錯誤),(從未在真實設備上獲得通知)。進一步測試我先發送了真正的一個,然後發送了5個假的循環。這成功了。這似乎天生不好處理第一次發送的UDID的方式? – hokkuk

+0

這意味着如果有人抹去了他們的設備,並且它的令牌號碼位於你的發送設備組的中間,那麼你的通知沒有被傳送,並且你不知道他們是否已經通過..有人可以證實這個「實驗」,我也可能有某種導致此行爲的消息錯誤長度。如果這是蘋果公司的目標,我們將非常高興。 – hokkuk

+0

不確定2012年的情況如何,但是當前設備無法接受通知(例如,由於應用被刪除),連接不會丟失。我很難想象,這種行爲甚至是可能的,因爲它會使APNS無法使用 - 應用程序會不斷從設備中刪除。 – silentser

0

同樣的問題.. 它看起來像最多2000個設備的限制。 因此,2000(或更少)通過套接字打開令牌。試試看!

+0

肯定它的2000而不是200? –

+1

值得一讀:推送通知吞吐量和錯誤檢測 ,地址爲https://developer.apple.com/library/content/technotes/tn2265/_index。html#// apple_ref/doc/uid/DTS40010376-CH1-TNTAG44 - –

3

事實上,根據經驗,在通過一些通知後,似乎與APNS的連接將失敗。在我們自己的APNS庫(http://code.google.com/p/javapns/)中,包含在庫中的多線程傳輸引擎在推送200個通知後自動重新啓動連接(似乎在試錯後是一個幻數)。由於我們引入了該功能(以及其他一些次要通信鏈接恢復選項),因此大量通知的失敗通知率爲零。

+0

我知道沒有限制。絕對不是200個通知。 –

相關問題