2010-04-06 90 views
17

我使用PHP連接到apn s發送一些通知到多個設備,雖然問題是更概念化,所以它不一定是特定於PHP。蘋果推送通知:發送大量的郵件

我將同時發送大約7000個設備(並不斷增長)。 我的流程每天運行一次,並廣播到所有設備,所以我不會不斷重新打開連接。

目前,我一次可以輕鬆發送到2個設備,並且郵件將成功發送。 但是,當我嘗試發送到完整的7000設備時,這些消息似乎無法傳送。

僞邏輯,我的代碼是:

open connection to apple 
loop over device-tokens 
    write to socket connection per device 
end loop 
close connection to apple. 

我已經看到的地方,我應該只執行一次寫,構建一個龐大的身軀,換句話說,僞代碼將如下所示:

loop over device tokens 
    create payload aggregating all devices 
end loop 
open connection to apple 
write to socket ONCE with whole payload for 7000 devices 
close connection 

這很難測試,因爲我顯然不能用測試消息給我的7000個生產用戶發送垃圾郵件。 其他人有類似的問題嗎?

感謝

+0

你有沒有得到這個工作?我很快會寫一個應用程序,它將面臨同樣的問題 - 通過APNS向數千個客戶進行廣播。 – 2010-10-01 16:56:54

+3

嗨,邁克。是的,我做到了。我發佈這個問題的時候的實施還處於相當早期的階段。問題在於我在生產設備的同一張表中安裝了一些沙箱設備。如果您在使用生產證書時發送到sandbox device_token,Apple有時會斷開連接。因此,簡單的解決方案是驗證是否將正確的字節數寫入連接,並且連接在每次寫入事件後都沒有丟失。如果丟失,您必須重新打開連接並從您離開的地方繼續。祝你好運! – BoomShaka 2010-10-02 13:23:58

+0

僅供參考,您可以打開連接並執行儘可能多的寫操作。只要確保在每次寫入後檢查連接狀態 – BoomShaka 2010-10-02 13:28:31

回答

5

我讀過,蘋果很關心的連接數您對他們的服務器,但我從來沒有聽說過任何寫入限制。另外,我不確定你會收到什麼樣的迴應,但可能值得嘗試看看會發生什麼。也許嘗試使用沙盒推送通知服務器,僅使用生產設備的設備令牌。這些手機不應該收到發送到沙箱服務器的推送通知,並且如果沙盒報告「已成功發送」,這將是一個無憂的測試方式。

+0

方式逾期。你的回答基本上是正確的。謝謝:) – BoomShaka 2010-10-02 13:53:31

+0

沙箱需要開發證書,生產需要生產證書。 APNS文件說,爲開發生成的設備令牌(沙箱環境)構建與生產構建完全不同。 此外,APNS生產版本如果獲取由開發版本生成的設備令牌,則會直接使設備令牌失效並丟棄連接。所以狀態不會成功,但連接將被丟棄。 對於測試嘲笑APNS服務是一個更好的選擇。 – 2013-06-28 11:38:50

-1

我明白你想要什麼,而且我確實面臨同樣的問題,對我而言是反向工程。 我剛剛查看了庫並檢查了驗證deviceToken的函數。所以,雖然創建虛擬設備令牌,我只是確保生成的令牌是有效的每個庫。

下面的代碼會讓你生成有效的設備令牌,現在它對你使用這個函數產生多少令牌。

def generateRandomDeviceTokenAndAppendItToJson(tokenLength: Int) { 
    val randomlyGeneratedDeviceToken = new StringBuilder() 
     randomlyGeneratedDeviceToken.append("   \"") 
     (1 to tokenLength) foreach { 
     times: Int => 
     if (tokenLength equals Device.Apple) 
     randomlyGeneratedDeviceToken.append(validCharacter().toString.charAt(0)) 
     else 
     randomlyGeneratedDeviceToken.append(Random.alphanumeric.head) 
     } 
     randomlyGeneratedDeviceToken.append("\",") 
     println(randomlyGeneratedDeviceToken) 
     writer.write(randomlyGeneratedDeviceToken.toString()) 
     } 

     private def validCharacter(): Int = { 
     val a = Random.alphanumeric.head 
     if ('0' <= a && a <= '9') 
     return (a - '0') 
     else if ('a' <= a && a <= 'f') 
     return ((a - 'a') + 10) 
     else if ('A' <= a && a <= 'F') 
     return ((a - 'A') + 10) 
     validCharacter() 
    } 

蘋果deviceToken是64個字符,所以你需要迭代64次。

+0

我懷疑這可以工作。您可能已經反向設計了一個低級驗證,它只是在某種程度上檢查了令牌*的正確性。但這只是蘋果防止垃圾郵件的第一道防線。我可以下注一百萬美元,你無法在野外發送消息給隨機設備Token。蘋果會很快關閉你。即使它可以與沙盒服務器一起工作,但這種測試在我看來並不能證明任何事情。 – 2015-09-08 05:36:18

+0

順便說一句,有沒有任何驗證?因爲從你的代碼看起來它只是產生了64個字符長度的*完全隨機*十六進制字符的字符串。不受任何限制。 – 2015-09-23 17:06:25

+0

約定的Csaba Toth,這確實會產生隨機的64個字符長度的字符串,但驗證(見上面有效的字符函數)是相同的(它使我分析令牌而不是在網絡上的某處找到它)它確實爲我測試我的服務器的性能。嘗試一下,然後嘗試將它發送給apns,它會報告有效。 當然,它可能是實際的令牌生成,我們應該有禮貌地發送它在沙箱環境,否則,正如你所說,它會發送垃圾郵件。 – 2015-10-21 05:22:13