public function onUserLogout($event)
 {
     if ($device_token = trim($event->getRequest()->get('device_token'))) {
         $devices = $this->pushDeviceService->findDeviceBy(['deviceToken' => $device_token, 'userId' => $event->getUser()->getId()]);
         foreach ($devices as $device) {
             $this->pushDeviceService->remove($device);
         }
     }
 }
 public function onOAuthServerTokenIssued(OAuthServerEvent $event)
 {
     if ($device_token = $event->getRequest()->get('device_token')) {
         $deviceOS = null;
         if ($this->pushDeviceService->detect->match("iOS")) {
             $deviceOS = "iOS";
         } elseif ($this->pushDeviceService->detect->match("AndroidOS")) {
             $deviceOS = "AndroidOS";
         }
         if (null === $deviceOS) {
             $this->logger->error('Cannot detect device OS', ['PushNotification']);
             return;
         }
         $response = json_decode($event->getResponse()->getContent(), true);
         $token = $this->accessTokenManager->findTokenByToken($response['access_token']);
         $this->pushDeviceService->upsert($device_token, $deviceOS, $token->getUser()->getId());
     }
 }
 /**
  * @param $message
  * @param $users
  * @param null $extra
  * @return bool|int     Return TRUE if all users get messages, otherwise number of user not received message
  */
 public function send($message, $users, $extra = null, $badge = 0)
 {
     if (!is_array($users)) {
         $users = [$users];
     }
     $sentNum = 0;
     foreach ($users as $user) {
         $devices = $this->pushDeviceService->findDevicesByUser($user);
         $atLeastOneSent = false;
         if (count($devices) > 0) {
             foreach ($devices as $device) {
                 // TODO: save to DB sent notifications
                 if ($device->isiOS()) {
                     if ($this->container->has('push_apns.service')) {
                         $res = $this->container->get('push_apns.service')->push($message, $device, $extra, $badge);
                         $devicesToLog = $device->getDeviceToken();
                         if (true === $res) {
                             $this->logger->info('Message: ' . $message . ', was sent to device#: ' . $devicesToLog, ['PushNotification']);
                             $atLeastOneSent = true;
                         } else {
                             $this->logger->warn('Error occurred while sending message: ' . $message . ', to device#: ' . $devicesToLog, ['PushNotification']);
                         }
                     } else {
                         $this->logger->error('Notification cannot be send as service push_apns.service is not available', ['PushNotification']);
                     }
                 } elseif ($device->isAndroidOS()) {
                     // TODO: TBD
                 }
             }
         } else {
             $this->logger->warn('User #' . $user . ' has no registered devices', ['PushNotification']);
         }
         if ($atLeastOneSent) {
             ++$sentNum;
         }
     }
     if (count($users) == $sentNum) {
         return true;
     } else {
         return count($users) - $sentNum;
     }
 }
 /**
  * @param $message
  * @param $recipients
  * @return bool|int   if TRUE - all messages are sent, otherwise number of not delivered messages
  */
 public function push($text, $recipients, array $extra = null, $badge = 0)
 {
     $this->openStream();
     if (is_bool($recipients) || is_array($recipients) && count($recipients) == 0) {
         $this->logger->error('Recipient is not a string, integer or array. Or empty array. Message will not be delivered', [$this->loggerContext]);
         return false;
     }
     if (!is_array($recipients)) {
         $recipients = [$recipients];
     }
     foreach ($recipients as $recipient) {
         $deviceToken = $recipient->getDeviceToken();
         $message = new ApnsMessage($deviceToken);
         $message->setText($text);
         //            $message->setCustomIdentifier(sprintf("Message-Badge-%03d", $i));
         $message->setBadge($badge);
         $message->setSound();
         if (is_array($extra) && count($extra) > 0) {
             foreach ($extra as $key => $value) {
                 $message->setCustomProperty($key, $value);
             }
         }
         $this->eventDispatcher->dispatch(PushMessageEvents::AFTER_CREATED, new PushMessageEvent($message, $deviceToken));
         $this->service->add($message);
     }
     $this->service->send();
     $this->closeStream();
     $aErrorQueue = $this->service->getErrors();
     if (!empty($aErrorQueue)) {
         $this->logger->error(var_export($aErrorQueue, true));
         foreach ($aErrorQueue as $errorQuery) {
             foreach ($errorQuery['ERRORS'] as $error) {
                 if ($error['statusCode'] == 8) {
                     // token not found
                     $invalidDeviceToken = $errorQuery['MESSAGE']->getRecipient();
                     $this->deviceService->remove($invalidDeviceToken);
                     $this->logger->info('Removing invalid token #' . $invalidDeviceToken);
                 }
             }
         }
         return count($aErrorQueue);
     }
     return true;
 }