2011-03-29 132 views
1

我在我的應用程序和PHP服務器中使用推送通知,該服務器使用令牌管理數據庫並向Apple服務器發送有效內容。將消息發送到少量設備(我嘗試使用2)時效果很好,但是當我想要發送消息到整個數據庫(超過20,000個設備)時,它不起作用。與蘋果服務器連接(我沒有連接錯誤),但我有兩個設備(也在數據庫中)沒有收到消息。 PHP代碼爲:Iphone推送通知服務問題

$apnsHost = 'gateway.push.apple.com'; 
$apnsPort = 2195; 
$apnsCert = 'path/to/my/certificate.pem'; 
$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 

while($row = mysql_fetch_array($result)) 
{ 
    $deviceToken=$row['token']; 

    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload; 
    fwrite($apns, $apnsMessage); 

    if ($error==0) 
    { 
     echo "Notification was sent successfully to ".$row['token']."<br/>"; 
    } 
    else 
    { 
     echo "Notification failure to ".$row['token']."<br/>"; 
    } 
} 

socket_close($apns); 
fclose($apns); 

結果我收到「通知發送成功」爲數據庫中的所有記錄,但現在看來似乎不發送消息,因爲我沒有看到它我的設備。當我使用相同的代碼將消息發送到2個令牌時,它運行良好。可能是什麼問題呢?使用一個連接可以發送的設備數量是否有上限?

+0

難道我的回答幫助?任何跟進? – 2011-03-31 11:03:39

+0

@andre謝謝你的回答。問題出在我數據庫中的前3個標記。我不知道爲什麼,但如果我試圖發送給他們,它不會發送給任何人。如果我嘗試發送到所有其他令牌,它的工作。這些令牌似乎是有效的(如長度和格式),但我不會再嘗試再發送它們。 – Mircea 2011-03-31 12:55:19

回答

1

不知道是否有限制,但我相信它不會低,因爲我已經成功向過去數千個設備發送通知(儘管目前我正在拍攝它們大約250- 500一次)。

嘗試更換此:

$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload; 

有了這個:

$apnsMessage = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload; 

此外,您可能有興趣嘗試了這一點:http://code.google.com/p/apns-php/