/** * Envia a notificação * * @param Notification $notification * Notificação a ser enviada * @return NotificationResult Resultado do envio da notificação */ public function send($notification) { // verifica a notificação if (!$notification) { throw new \InvalidArgumentException("A notificação não foi informada ou é inválida."); } $iosDevices = new DeviceCollection(); $androidDevices = new DeviceCollection(); $data = $notification->getData(); if ($data) { $message = new Message($notification->getMessage(), $notification->getData()); } else { $message = new Message($notification->getMessage()); } // separa os dispositivos por tipo foreach ($notification->getDevices() as $device) { switch ($device->getDeviceType()) { case Device::ANDROID: $androidDevices->add(new PusherDevice($device->getToken())); break; case Device::IOS: $iosDevices->add(new PusherDevice($device->getToken())); break; } } $notificationResult = new NotificationResponse(); // envia as notificações AndroidPushController::send($androidDevices, $message, $notificationResult, $this->pushManager); IosPushController::send($iosDevices, $message, $notificationResult, $this->pushManager); return $notificationResult; }
/** * Envia a notificação para dispositivos Android * * @param Device[] $devices * Dispositivos * @param Message $message * Notificação * @param NotificationResult $notificationResult * Resultado do envio da notificação * @param PushManager $pushManager * Gerenciador de push */ public static function send($devices, $message, $notificationResult, $pushManager) { if (iterator_count($devices->getIterator()) > 0) { try { $gcmAdapter = new GcmAdapter(array('apiKey' => ANDROID_API_KEY)); // envia as notificações $push = new Push($gcmAdapter, $devices, $message); $pushManager->add($push); $pushManager->push(); // obtém a resposta do envio do envio $response = $gcmAdapter->getResponse(); // dispositivo que não receberam as notificações e motivo $failureResults = $response->getResult(Response::RESULT_ERROR); $failureDevices = AndroidPushController::handleFailureResult($failureResults); // dispositivo que tiveram seus identificadores modificados $canonicalResults = $response->getResult(Response::RESULT_CANONICAL); AndroidPushController::handleCanonicalResult($canonicalResults); $notificationResult->addDevicesNotNotified($failureDevices); } catch (\Exception $e) { global $log; $log->Error($e); $notificationResult->setAndroidFailed(true); $notificationResult->setAndroidFailureReason($e->getMessage()); } } }