1

我試圖爲多個設備發送通知。所以我將令牌傳給數組,打開連接,在循環中發送通知,關閉連接。向多個設備發送推送通知: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,這是另一個問題,而不是重複。

回答

1

第一個失敗的消息可能有問題,此時Apple將關閉連接以向您發出信號,說明存在問題。如果您使用增強的格式,您有機會在Apple關閉連接之前獲得一些反饋,以查看您發送的通知出了什麼問題。發生這種情況後,您必須重新建立連接以發送更多消息。

有很多原因可能會失敗。您可能已經發送一個無效的設備令牌,你的有效載荷可能是無效的或錯誤的長度等

最佳檢查出APNS的文檔:http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html

+0

我不認爲它是關於一個無效的令牌,因爲我只能通過應用程序獲取令牌。儘管我也檢查過。我想知道的是,如果循環出現問題。如果我關閉連接並重新打開每個10令牌,它會改變嗎? – kubilay

+3

Apple希望您儘可能長時間保持連接打開狀態(因爲在出現錯誤時會關閉連接)。您的通知有問題,導致蘋果關閉連接。爲什麼不嘗試增強的格式協議?或者更好的是,嘗試使用現有的庫,如APNS-PHP http://code.google.com/p/apns-php/並查看問題是什麼? – Redth

+1

我認爲這是真實的,如果我把我的有效標記作爲第一個入口放在我的數據庫中,它會傳遞,但如果我將標記移動到第二個或任何其他帶有無效標記的位置作爲第一個入口,我永遠不會收到通知。 – emotality

相關問題