2015-10-01 34 views
23

Push bildirimlerini işlemek için RMSPushNotificationsBundle kullanıyorum. Bir sunucudan birden fazla uygulamaya pushNotifications gönderiyorum. Doğru sertifikayı seçen setAPNSPemAsString yöntemini kullanıyorum. Ancak itme bildirimi sadece ilk kez gönderilir. Birisi bana nedenini söyleyebilir mi? Teşekkür ederim!Bir sunucudan birden çok Uygulama için Push Bildirimleri

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

Günlüklerde şey var mı daha fazla hata açıklaması için bu belgelere bir göz atın? Ayrıca, "$ appName" ayarlandı? – tftd

+0

with appName, push bildirimleri için hangi sertifikayı kullandığımıza karar vermek için kullandığımız yalnızca bir değişken. AppName ile, uygulama kullanıcımızın hangi sürümünün telefonunda kullandığını biliyoruz. SetAPNSPemAsString işlevinin kullanılması, yalnızca başkalarının ilk push bildirimi ile işlev gönderir, işlev bize false döndürür .. – Gasper

+0

IOS için paket bir Geri Bildirim hizmeti içerir. Belki bir cevap bulabilirsin. Bunu gördün mü? https://github.com/richsage/RMSPushNotificationsBundle#ios-feedback-service –

cevap

1

Sorun nedir ama küçük kodun benim için çalıştığından emin değilim. En azından APNS sunucusuna bağlantıyı test etmek için bunu kullanabilirsiniz.

<?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); 

?> 

Not: Bu küçük kodu uzun süre önce yazdı ve iyi çalıştı. Kaynağını şimdi hatırlamıyorum ama bir öğretici vardı. Son zamanlarda test etmediniz, bu yüzden gözden geçirmeniz gerekebilir. Bazı öneriler:

  1. Bağlantıyı açın ve tüm bildirimlerinize yazın, ardından kapatın.
  2. Sunucu yanıtının okunması işlevselliği azaltır, ancak sorun giderme ve başlangıç ​​için iyidir. Bu kısmı gerektiği gibi kullanın.
  3. APNs Provider API
İlgili konular