setDevices($devicesToken); * $response = $an->send($message); * */ namespace ProcessMaker\BusinessModel\Light; class PushMessageIOS { var $url = 'ssl://gateway.sandbox.push.apple.com:2195'; var $passphrase = "sample"; var $pemFile; var $devices = array(); var $response = array(); /** * @param $url string the url server */ function setUrl($url){ $this->url = $url; } /** * Constructor * @param $passphrase update your private key's */ function setKey($passphrase){ $this->passphrase = $passphrase; } /** * Set the devices token to send to * @param $deviceIds array of device tokens to send to */ function setDevices($devicesToken) { if(is_array($devicesToken)){ $this->devices = $devicesToken; } else { $this->devices = array($devicesToken); } } /** * Set the setting value config */ public function setSettingNotification() { $conf = \System::getSystemConfiguration( PATH_CONFIG . 'mobile.ini' ); $this->setUrl($conf['apple']['url']); $this->setKey($conf['apple']['passphrase']); } /** * Send the message to the device * @param $message the message to send * @return mixed */ function send($message, $data) { if(!is_array($this->devices) || count($this->devices) == 0){ $this->error("No devices set"); } if(strlen($this->passphrase) < 8){ $this->error("Server API Key not set"); } $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', PATH_CONFIG . 'mobileios.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $this->passphrase); // Open a connection to the APNS server // $fp = stream_socket_client( // $this->url, $err, // $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); // if (!$fp) // exit("Failed to connect: $err $errstr" . PHP_EOL); // Create the payload body if (!is_null($data)) { $body['aps'] = array( 'alert' => $message, 'sound' => 'default', 'data' => $data ); } else { $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*', $this->devices) . pack('n', strlen($payload)) . $payload; // // // Send it to the server // $result = fwrite($fp, $msg, strlen($msg)); // fclose($fp); foreach ($this->devices as $item) { // Open a connection to the APNS server $fp = stream_socket_client($this->url, $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) { throw (new \Exception( \G::LoadTranslation( 'ID_FAILED' ).': ' ."$err $errstr")); } else { //echo 'Apple service is online. ' . '
'; } // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $item) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) { $this->response['undelivered'][] = 'Undelivered message count: ' . $item; } else { $this->response['delivered'][] = 'Delivered message count: ' . $item; } if ($fp) { fclose($fp); //echo 'The connection has been closed by the client' . '
'; } } return $this->response; } function error($msg){ echo "Android send notification failed with error:"; echo "\t" . $msg; } }