2013-06-21 142 views
3

我需要幫助實現PHP APNS推送通知。我在將通知發送到多個設備令牌時遇到了問題。對於單個設備令牌,它工作良好。 以下是我的代碼。任何幫助將非常感謝發送APNS推送通知到PHP中的多個設備令牌的問題

// password: 
    $passphrase = '1234'; 

    // Put your alert message here: 
    $message = 'New Message'; 
     //////////////////////////////////////////////////////////////////////////////// 

    $ctx = stream_context_create(); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsDir.'server_certificates_bundle_sandbox.pem'); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

    // Open a connection to the APNS server 
    $fp = stream_socket_client(
           'ssl://gateway.sandbox.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 APNS' . PHP_EOL; 


    $activeGames = $this->Game_model->fnAllUserActiveGameCnt(); 

    if($activeGames) { 

     foreach($activeGames as $gameCntList) { 
      $gameCnt = $gameCntList['game_cnt']; 
      $deviceToken = trim($gameCntList['device_token']); 

      // Create the payload body 
      $body['aps'] = array(
         'alert'  => $message, 
         'badge'  => $gameCnt, 
         'sound'  => 'default' 
       ); 

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

      // Build the binary notification 
      $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 

      // Send it to the server 
      $result = fwrite($fp, $msg, strlen($msg)); 

      if (!$result) 
      echo 'Message not delivered' . PHP_EOL; 
      else 
      echo 'Message successfully delivered' . PHP_EOL; 
     } // end foreach 
    } 


    // Close the connection to the server 
    fclose($fp); 

回答

4

試試這個它的工作對我來說。

while($res = mysql_fetch_assoc($sql_device_token)) 
      {  
       $deviceToken = $res['devicetoken']; 
       //Pushnotification($deviceToken,$message); 

       /*#################################### Push Notification ####################*/ 


       $ctx = stream_context_create(); 
           stream_context_set_option($ctx, 'ssl', 'local_cert', 'ckipad.pem'); 
           stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

           $fp = stream_socket_client(
            'ssl://gateway.sandbox.push.apple.com:2195', $err, 
            $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

           //if (!$fp) 
            //exit("Failed to connect amarnew: $err $errstr" . PHP_EOL); 

           //echo 'Connected to APNS' . PHP_EOL; 

           // Create the payload body 
           $body['aps'] = array(
            'badge' => +1, 
            'alert' => $message, 
            'sound' => 'default' 
            ); 

            $payload = json_encode($body); 
            // Build the binary notification 
            $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 
            // Send it to the server 
            $result = fwrite($fp, $msg, strlen($msg)); 

           if (!$result) 
            echo 'Message not delivered' . PHP_EOL; 
           else 
            echo 'Message successfully delivered amar'.$message. PHP_EOL; 

           // Close the connection to the server 
           fclose($fp); 




           $ctx = stream_context_create(); 
           stream_context_set_option($ctx, 'ssl', 'local_cert', 'ckiphone.pem'); 
           stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

           $fp = stream_socket_client(
            'ssl://gateway.sandbox.push.apple.com:2195', $err, 
            $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

           //if (!$fp) 
            //exit("Failed to connect amarnew: $err $errstr" . PHP_EOL); 

           //echo 'Connected to APNS' . PHP_EOL; 

           // Create the payload body 
           $body['aps'] = array(
            'badge' => +1, 
            'alert' => $message, 
            'sound' => 'default' 
            ); 

            $payload = json_encode($body); 
            // Build the binary notification 
            $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 
            // Send it to the server 
            $result = fwrite($fp, $msg, strlen($msg)); 

           if (!$result) 
            echo 'Message not delivered' . PHP_EOL; 
           else 
            echo 'Message successfully delivered amar'.$message. PHP_EOL; 

           // Close the connection to the server 
           fclose($fp); 


         /*############################# ##############################################*/ 

       $sql_notification = " INSERT INTO push_notification set `primary_physician_id` = '".$res['clientid']."',`devicetoken`='".$deviceToken."', `push_purpose`='Charge Note', `sned_time`='".time()."' "; 
       mysql_query($sql_notification); 
      } 

在這裏你可以看到我正在循環中保存這個東西。

$ctx = stream_context_create(); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsDir.'server_certificates_bundle_sandbox.pem'); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

    // Open a connection to the APNS server 
    $fp = stream_socket_client(
           'ssl://gateway.sandbox.push.apple.com:2195', $err, 
           $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

因此,讓你保持在循環內。

+0

非常感謝阿馬爾..這對我有效... – user2509333

+0

你爲什麼重複代碼? – StinkyCat

+1

我不重複我只是更好地解釋它的代碼。 –