2009-10-29 71 views
0

當我需要發送一個通知時,我的代碼工作正常,但每當我需要發送多個通知時,它只發送第一個通知。這裏是代碼:發送多個iPhone通知

<?php 
$device_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 

$apnsHost = 'gateway.sandbox.push.apple.com'; 
$apnsPort = 2195; 
$apnsCert = 'apns-dev.pem'; 

$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 

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

$payload['aps'] = array('alert' => 'some notification', 'badge' => 0, 'sound' => 'none'); 
$payload = json_encode($payload); 

for($i=0; $i<5; $i++) 
{ 
    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device_token)) . chr(0) . chr(strlen($payload)) . $payload; 

    fwrite($apns, $apnsMessage); 
}?> 

我在做什麼錯了?

Thx提前, Mladjo

回答

0

考慮在這裏瞎猜。看着你的循環。

它看起來像你打開連接並推送消息...但是,這種連接關閉自己?你是否需要爲每次推送啓動一個新的連接,從而在重新啓動另一個之前有必要關閉while循環結束時的第一個連接?

3

您應該只打開一次到apns的連接。現在你在循環中打開它是錯誤的。我也使用一個稍微不同的方案來構建我的消息。而應該做這樣:

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext); 
for($i=0; $i<5; $i++) 
{ 
     $apns_message = chr(0).pack('n', 32).pack('H*', $device_token).pack('n', strlen($payload)).$payload; 

     fwrite($apns, $apnsMessage); 
}?> 

另外請注意,蘋果建議使用相同的連接來發送所有推送通知,請在每一次有一個推送通知發送時間無法連接。

+0

我已經注意到了。這是複製和粘貼錯誤。在我的代碼中,我只打開一次連接。這不是我的問題的解決方案 – Mladen 2009-10-29 09:16:16

+0

您是否嘗試過使用此代碼構建消息: $ apns_message = chr(0).pack('n',32).pack('H *',$ device_token).pack ('n',strlen($ payload))。$ payload; 另外,你是否將所有這些推送通知發送到同一設備?如果是這樣,那麼只有一個將出現在設備上。 – 2009-10-29 09:55:11

+0

我的消息是用該代碼構建的。我將它們全部發送到相同的iPod touch。有了這個循環,我得到了2而不是5。即使我嘗試使用不同的標記,它只會發送到第一個。 – Mladen 2009-10-29 10:33:57

1

看一看下列文件: http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW3

它說,多個通知應在單一的傳輸使用TCP/IP Nagle算法來發送。你可以找出Nagle算法是在這裏什麼: http://en.wikipedia.org/wiki/Nagle%27s_algorithm

所以,我相信創造該消息的代碼應該是這樣的:

// Create the payload body 
$body['aps'] = array(
'alert' => "My App Message", 
'badge' => 1); 

// Encode the payload as JSON 
$payload = json_encode($body); 

// Loop through the token file and create the message 
$msg = ""; 
$token_file = fopen("mytokens.txt","r"); 
if ($token_file) { 
    while ($line = fgets($token_file)) { 
     if (preg_match("/,/",$line)) { 
      list ($deviceToken,$active) = explode (",",$line); 
      if (strlen($deviceToken) == 64 && intval($active) == 1) { 
       // Build the binary notification 
       $msg .= chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 
      } 
     } 
    } 
    fclose ($token_file); 
} 


if ($msg == "") { 
    echo "No phone registered for push notification"; 
    exit; 
} 

現在打開TCP連接併發送消息...