2015-10-01 17 views
23

Sto utilizzando RMSPushNotificationsBundle per gestire le notifiche push. Sto inviando pushNotifications a più app da un server. Sto usando il metodo setAPNSPemAsString che seleziona il certificato giusto. Ma la notifica push viene inviata solo la prima volta. Qualcuno può dirmi perché? Grazie!Notifiche push per più app da un server

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

hai qualcosa nei log? Inoltre, dove viene impostato '$ appName'? – tftd

+0

con appName è solo una variabile che usiamo per decidere quale certificato utilizziamo per le notifiche push. Con appName sappiamo quale versione del nostro utente dell'applicazione utilizza sul suo telefono. L'uso della funzione setAPNSPemAsString funziona una sola volta con la notifica del primo push su altri, la funzione send ci restituisce false .. – Gasper

+0

Per IOS il pacchetto include un servizio di feedback. Forse puoi trovare una risposta qui. L'hai visto? https://github.com/richsage/RMSPushNotificationsBundle#ios-feedback-service –

risposta

1

Non sono sicuro di quale sia il problema, ma il seguente codice funzionante ha funzionato per me. Almeno puoi usarlo per testare la connessione al server 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); 

?> 

Nota: ha scritto questo piccolo codice molto tempo fa e ha funzionato correttamente. Non ricordo la fonte ora ma c'era un tutorial. Non sono stati testati di recente, quindi potrebbe essere necessario rivederlo. Alcuni suggerimenti:

  1. Aprire la connessione e scrivere sul server tutte le notifiche quindi chiuderlo.
  2. La risposta del server di lettura riduce la funzionalità ma è utile per la risoluzione dei problemi e per l'avvio. Quindi usa quella parte se necessario.
  3. Date un'occhiata a questa documentazione per più errori spiegazione APNs Provider API