我試圖爲多個設備發送通知。所以我將令牌傳給數組,打開連接,在循環中發送通知,關閉連接。向多個設備發送推送通知:APNS響應在一段時間後爲負
但是,9-10設備後,它停止發送。我相信蘋果以某種方式放棄了連接。
這裏是我的代碼:
$message = 'Push';
$passphrase = 'mypass';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'MyPemFile.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to Apple service. ' . PHP_EOL;
// Encode the payload as JSON
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
$payload = json_encode($body);
$result = 'Start'.PHP_EOL;
$tokenArray = array('mytoken');
foreach ($tokenArray as $item)
{
// Build the binary notification
$msg = chr(0).pack('n', 32).pack('H*', $item).pack('n', strlen($payload)).$payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Failed message'.PHP_EOL;
else
echo 'Successful message'.PHP_EOL;
}
// Close the connection to the server
fclose($fp);
有什麼錯我的代碼?我想我需要打開一次連接,然後發送通知關閉。我應該用多個標記來做fwrite()嗎?雖然我不知道。任何想法或解決方案都被接受。
順便說一句,答案是這樣的:
Successful message
Successful message
Successful message
Successful message
Successful message
Successful message
Successful message
Successful message
Successful message
Successful message
Failed message
Failed message
Failed message
Failed message
Failed message
...
Failed message
附:我有相同的代碼字符問題,但它解決了another question,這是另一個問題,而不是重複。
我不認爲它是關於一個無效的令牌,因爲我只能通過應用程序獲取令牌。儘管我也檢查過。我想知道的是,如果循環出現問題。如果我關閉連接並重新打開每個10令牌,它會改變嗎? – kubilay
Apple希望您儘可能長時間保持連接打開狀態(因爲在出現錯誤時會關閉連接)。您的通知有問題,導致蘋果關閉連接。爲什麼不嘗試增強的格式協議?或者更好的是,嘗試使用現有的庫,如APNS-PHP http://code.google.com/p/apns-php/並查看問題是什麼? – Redth
我認爲這是真實的,如果我把我的有效標記作爲第一個入口放在我的數據庫中,它會傳遞,但如果我將標記移動到第二個或任何其他帶有無效標記的位置作爲第一個入口,我永遠不會收到通知。 – emotality