/** * push * @param Hook\Model\PushMessage $message */ public function push($message) { $status = array('success' => 0, 'failure' => 0); foreach (static::getPlatformServices() as $platform => $service_klass) { $service = new $service_klass(); $query = App::collection('push_registrations')->where('platform', $platform); $query->chunk(self::MAX_RECIPIENTS_PER_REQUEST, function ($registrations) use(&$platform, &$service, &$status, $message) { try { $chunk_status = $service->push($registrations, $message); $status['success'] += $chunk_status['success']; $status['failure'] += $chunk_status['failure']; } catch (\Exception $e) { Logger::debug("PushNotification: platform: {$platform} -> {$e->getMessage()}"); } }); } return $status; }
/** * push * @param mixed $registrations * @param mixed $data */ public function push($registrations, $data) { $apns_environment = Config::get('push.apns.environment', 'sandbox'); $apns_certificate_file = Config::get('push.apns.cert.file', false); $apns_certificate_pass = Config::get('push.apns.cert.pass', false); if (!$apns_certificate_file) { throw new \Exception("APNS config error: 'push.apns.cert.file' not set."); } $total_failure = 0; // Instantiate a new ApnsPHP_Push object $push = new \ApnsPHP_Push($apns_environment == 'sandbox' ? \ApnsPHP_Abstract::ENVIRONMENT_SANDBOX : \ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION, $this->getCertificateFile($apns_certificate_file)); // set custom logger $push->setLogger(new APNSLogger()); // Set the Provider Certificate passphrase if ($apns_certificate_pass) { $push->setProviderCertificatePassphrase($apns_certificate_pass); } // Set the Root Certificate Autority to verify the Apple remote peer $push->setRootCertificationAuthority($this->getRootCertificationAuthority()); // Connect to the Apple Push Notification Service $push->connect(); $message = new \ApnsPHP_Message(); // Add all registrations as message recipient foreach ($registrations as $registration) { try { $message->addRecipient($registration->device_id); } catch (\ApnsPHP_Message_Exception $e) { Logger::error($e->getMessage()); $total_failure += 1; } } Logger::debug("Recipients => " . json_encode($message->getRecipients())); // Set a custom identifier. To get back this identifier use the getCustomIdentifier() method // over a ApnsPHP_Message object retrieved with the getErrors() message. if (isset($data['custom_identifier'])) { $message->setCustomIdentifier($data['custom_identifier']); } // Set badge icon to "3" if (isset($data['badge']) && is_int($data['badge'])) { $message->setBadge((int) $data['badge']); } // Set text $message->setText($data['message']); // Play the default sound if (!isset($data['sound']) || empty($data['sound'])) { $data['sound'] = 'default'; } $message->setSound($data['sound']); // Set the expiry value to 30 seconds if (isset($data['expiry']) && $data['expiry'] > 0) { $message->setExpiry($data['expiry']); } // Set custom properties $invalid_properties = array('_id', 'app_id', 'created_at', 'updated_at', 'sound', 'text', 'badge', 'expiry', 'custom_identifier'); $custom_properties = array_diff_key($data, array_flip($invalid_properties)); foreach ($custom_properties as $property => $value) { $message->setCustomProperty($property, $value); } // Add the message to the message queue $push->add($message); // Send all messages in the message queue $stats = $push->send(); // Disconnect from the Apple Push Notification Service $push->disconnect(); // Examine the error message container $error_list = $push->getErrors(); // Log delivery status $errors = $push->getErrors(); $total_failure += count($errors); if ($total_failure > 0) { foreach ($errors as $error) { Logger::error($error); } } return array('success' => $registrations->count() - $total_failure, 'failure' => $total_failure); }