2013-07-16 71 views
1

這是我寫的發送蘋果推送通知的代碼。 device_tokens中的 我發送了一個包含所有想要發送消息的令牌的數組。 出於某種原因,我停止接收來自此係統的消息。Apple推送通知系統未收到消息! (PHP)

它曾經工作過!

private function send_iphone_notification($device_tokens, $message) 
{ 
    define("PRODUCTION_MODE", true); 

    $apnsPort = 2195; 

    // Choose dev or production apns host and certificate 
    if(PRODUCTION_MODE) { 
     $apnsHost = 'gateway.push.apple.com'; 
     $apnsCert = $_SERVER['DOCUMENT_ROOT'].'/ant/www/apns/PushIphone.pem'; 
    } else { 
     $apnsHost = 'gateway.sandbox.push.apple.com'; 
     $apnsCert = $_SERVER['DOCUMENT_ROOT'].'/ant/www/apns/CertificatesDev.pem'; 
    } 
    // Notification content 
    $payload = json_encode(array('notification_from_panel' => 1, 'aps' => array('alert' => $message, 'badge' => 1, 'sound' => 'default'))); 

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

    // loop all devices tokens 
    foreach ($device_tokens as $device_token) 
    {      
     try { 
      $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 
     } catch(Exception $e) { 
      echo $e->getMessage(); 
      continue; 
     } 
     $deviceToken = str_replace(" ","",substr($device_token,1,-1)); 
     //echo $deviceToken; 
     $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(mb_strlen($payload)) . $payload; 
     fwrite($apns, $apnsMessage); 

     //socket_close($apns); 
     fclose($apns); 
    } 

} 

回答

0

我對蘋果的推送服務有一些經驗,我不得不說,蘋果似乎有soem限制。

首先,您不需要關閉並打開每個消息的套接字連接。這會爲你節省很多時間。另一方面,在發送下一條消息之前,您必須檢查連接是否中斷。

無論如何,當你每秒連接100次併發送消息時,蘋果似乎並不喜歡它。蘋果已經阻止了我的傳球。

但是,當您使用已建立的連接發送消息時,並且在某個連接正在返回錯誤/斷開連接時,您不知道他停止了哪條消息。但是您可以爲每條消息定義一個標識符,並檢查連接斷開時返回的錯誤。

我注意到蘋果服務器以幾秒鐘的延遲返回錯誤。這使得它很難處理它簡單的方法。

我已經寫了一個類來處理所有這些,但沒有噴射器有時間發佈它!如果您對此感興趣,請查看github項目https://github.com/tinned-software/PHP-Tinned-MobilePush

我希望儘快完成文檔。