2015-10-01 20 views
23

プッシュ通知の処理にはRMSPushNotificationsBundleを使用しています。私は1つのサーバーから複数のアプリケーションにpushNotificationsを送信しています。正しい証明書を選ぶsetAPNSPemAsStringメソッドを使用しています。しかし、プッシュ通知は初めて送信されます。なぜ誰かが私に言うことができますか?ありがとうございました!1台のサーバーからの複数のAppsのプッシュ通知

public function sendIOS($appName){ 
    $notifications = $this->container->get('rms_push_notifications'); 

    $message = new iOSMessage(); 
    $message->setMessage($this->message); 
    $message->setData($this->getData()); 
    $message->setAPSSound("default"); 
    $message->setDeviceIdentifier($this->pushToken); 

    if ($appName !="appName") { 
     $pemFile = $this->container->getParameter("rms_push_notifications.ios.".$appName.".pem"); 
     $passphrase = $this->container->getParameter("rms_push_notifications.ios.".$appName.".passphrase"); 

      $pemContent = file_get_contents($pemFile); 
      $notifications->setAPNSPemAsString($pemContent, $passphrase); 
    } 
    return $notifications->send($message); 
} 
+1

については、このドキュメントを見てみましょうか?また、 '$ appName'はどこに設定されていますか? appNameを持つ – tftd

+0

は、プッシュ通知に使用する証明書を決定するために使用する1つの変数です。 appNameを使用すると、携帯電話で使用しているアプリケーションユーザーのバージョンを知ることができます。 setAPNSPemAsString関数を使用すると、他のファーストプッシュ通知で1回だけ動作します。send関数は私たちにfalseを返します。 – Gasper

+0

IOSの場合、バンドルにはフィードバックサービスが含まれています。多分あなたはここで答えを見つけることができます。あなたはそれを見ましたか? https://github.com/richsage/RMSPushNotificationsBundle#ios-feedback-service –

答えて

1

私は何が問題なのかはっきりしませんが、小規模なコードは私のために働いています。少なくとも、これを使用してAPNSサーバーへの接続をテストできます。

<?php 
// your private key's passphrase 
$passphrase = $_POST('passphrase'); 

$pemFilesPath = 'path/to/pem/folder/'; 

// path to pem file 
$appCert = $_POST('pemfile'); 

$pemFile = $pemFilePath.$appCert; 

$notifications = $_POST('notifications'); 

//////////////////////////////////////////////////////////////////////////////// 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', $pemFile); 
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; 

$records = 0; 

foreach ($notifications as $deviceToken => $message) 
{ 
    // Create the payload body 
    $body['aps'] = array(
     'alert' => $message, 
     '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; 

    if (!$fp) { 
     exit("Connection intruptted " . E_USER_ERROR . PHP_EOL); 
    } 
    // Send it to the server 
    $result = fwrite($fp, $msg, strlen($msg)); 
    if(!$result) { 

           print_r("Failed writing to stream.", E_USER_ERROR); 
           fclose($fp); 
           die; 
         } 
        /* uncomment this part for troubleshooting 
         else { 
           $tv_sec = 1; 
           $tv_usec = null; // Timeout. 1 million micro seconds = 1 second 
           $read = array($fp); $we = null; // Temporaries. "Only variables can be passed as reference." 
           $numChanged = stream_select($read, $we, $we, $tv_sec, $tv_usec); 
           if(false===$numChanged) { 
             print_r("Failed selecting stream to read.", E_USER_ERROR); 
             fclose($fp); 
             die; 
           } 
           else if($numChanged>0) { 
             $command = ord(fread($fp, 1)); 
             $status = ord(fread($fp, 1)); 
             $identifier = implode('', unpack("N", fread($fp, 4))); 
             $statusDesc = array(
               0 => 'No errors encountered', 
               1 => 'Processing error', 
               2 => 'Missing device token', 
               3 => 'Missing topic', 
               4 => 'Missing payload', 
               5 => 'Invalid token size', 
               6 => 'Invalid topic size', 
               7 => 'Invalid payload size', 
               8 => 'Invalid token', 
               255 => 'None (unknown)', 
             ); 
             print_r("APNS responded with command($command) status($status) pid($identifier).", E_USER_NOTICE); 

             if($status>0) { 
               $desc = isset($statusDesc[$status])?$statusDesc[$status]: 'Unknown'; 
               print_r("APNS responded with error for pid($identifier). status($status: $desc)", E_USER_ERROR); 
               // The socket has also been closed. Cause reopening in the loop outside. 
               fclose($fp); 
               die; 
             } 
             else { 
               // Apple docs state that it doesn't return anything on success though 
               $records++; 
             } 
           } else { 
             $records++; 
           } 
         } 
         */ 
    $records++; 
    } 

echo "Send notifications to $records devices"; 
// Close the connection to the server 
fclose($fp); 

?> 

注:この小さなコードは長い時間前に書いてあり、うまくいきました。私はソースを覚えていませんが、チュートリアルがありました。最近テストしたことがないので、修正する必要があります。 ヒント:

  1. オープン接続して閉じ、サーバーへのすべての通知を書き込みます。
  2. サーバーの応答を読み取ると機能は低下しますが、トラブルシューティングや起動には効果的です。したがって、必要に応じてその部分を使用してください。
  3. あなたがログに何かを持っていますより多くのエラー説明APNs Provider API
関連する問題