Я работаю над php-сайтом + приложение iphone и API для приложения iphone, имеет систему обмена сообщениями для студентов и врачей, когда кто-то отправляет сообщение (с веб-сайта или iphone), другой пользователь должен получить push-уведомление на своем iphone. Например, если ученик добавляет новый вопрос для учителя, то push-уведомление о преподавателях iphone / ipad будет отправлено учителю, и когда учитель ответит на ответ ученика, студент получит push-уведомление. Поскольку нет ограничений на количество учителей и студентов, регистрирующихся на веб-сайте. Поэтому мой вопрос заключается в том, как отправлять push-сообщения зарегистрированным пользователям iphone, я хочу отправить push-сообщение сразу после ответа или добавить вопрос. Пожалуйста, предоставьте мне php-код для отправки нескольких push-сообщений. Я сохраняю токен устройства для каждого пользователя во время регистрации.
Когда учитель отвечает на вопрос, я отправляю письмо ученику, я хочу отправить уведомление о начале обучения и наоборот, поэтому, пожалуйста, укажите код, способный управлять условиями ошибки.
Пожалуйста, предложите любой учебник для отправки push-уведомлений на iOS.
Простой способ сделать это без использования каких-либо файлов. Вы можете вызвать его несколько раз с помощью другого tokeid.
$ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ckipad.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); $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 amarnew: $err $errstr" . PHP_EOL); //echo 'Connected to APNS' . PHP_EOL; // Create the payload body $body['aps'] = array( 'badge' => +1, 'alert' => $message, 'sound' => 'default' ); $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered amar'.$message. PHP_EOL; // Close the connection to the server fclose($fp);
Вам лучше использовать APNS-библиотеку для PHP. Вы можете найти его здесь . Просмотрите образцы, которые предоставляют разработчики.
У меня также были проблемы с сертификатами. Мои действия:
ApnsPHP/Abstract.php
внесите некоторые изменения в _connect()
, вставьте эти строки
$streamContext = stream_context_create( array( 'ssl' => array( 'local_cert' => $this->_sProviderCertificateFile, 'passphrase' => '' ) ) ); $this->_hSocket = @stream_socket_client( $sURL, $nError, $sError, $this->_nConnectTimeout, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);
вместо оригинала, указанного там
теперь вы можете использовать сертификаты * .pem без необходимости entrust_root_certification_authority.
Это сработало для меня.
Так я и сделал это окончательно
set_time_limit(0); $root_path = "add your root path here"; require_once($root_path."webroot\cron\library\config.php"); require_once($root_path."Vendor\ApnsPHP\Autoload.php"); global $obj_basic; // Basic settings $timezone = new DateTimeZone('America/New_York'); $date = new DateTime(); $date->setTimezone($timezone); $time = $date->format('H:i:s'); //Get notifications data to send push notifications $queueQuery = " SELECT `notifications`.*, `messages`.`mes_message`, `messages`.`user_id`, `messages`.`mes_originated_from` FROM `notifications` INNER JOIN `messages` ON `notifications`.`message_id` = `messages`.`mes_id` WHERE `notifications`.`created` <= NOW()"; $queueData = $obj_basic->get_query_data($queueQuery); if(!empty($queueData)) { // Put your private key's passphrase here: $passphrase = 'Push'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'server_certificates_bundle_sandbox.pem'); 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 '<br>'.date("Ymd H:i:s").' Connected to APNS' . PHP_EOL; foreach($queueData as $val) { // Put your device token here (without spaces): $deviceToken = $val['device_token']; // Create message // Get senders name $sql = "SELECT `name` FROM `users` WHERE id =".$val['user_id']; $name = $obj_basic->get_query_data($sql); $name = $name[0]['name']; $message = $name." : "; // Get total unread messaged for receiver $query = "SELECT COUNT(*) as count FROM `messages` WHERE mes_parent = 0 AND user_id = ".$val['user_id']." AND mes_readstatus_doc != 0 AND mes_status = 1"; $totalUnread = $obj_basic->get_query_data($query); $totalUnread = $totalUnread[0]['count']; $message .= " This is a test message."; // Create the payload body $body['aps'] = array( 'alert' => $message, 'badge' => $totalUnread, '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; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) { echo '<br>'.date("Ymd H:i:s").' Message not delivered' . PHP_EOL; } else { $sqlDelete = "DELETE FROM `notifications` WHERE id = ".$val['id']; $query_delete = $obj_basic->run_query($sqlDelete,'DELETE'); echo '<br>'.date("Ymd H:i:s").' Message successfully delivered' . PHP_EOL; } } // Close the connection to the server fclose($fp); echo '<br>'.date("Ymd H:i:s").' Connection closed to APNS' . PHP_EOL; } else { echo '<br>'.date("Ymd H:i:s").' Queue is empty!'; }
-set_time_limit(0); $root_path = "add your root path here"; require_once($root_path."webroot\cron\library\config.php"); require_once($root_path."Vendor\ApnsPHP\Autoload.php"); global $obj_basic; // Basic settings $timezone = new DateTimeZone('America/New_York'); $date = new DateTime(); $date->setTimezone($timezone); $time = $date->format('H:i:s'); //Get notifications data to send push notifications $queueQuery = " SELECT `notifications`.*, `messages`.`mes_message`, `messages`.`user_id`, `messages`.`mes_originated_from` FROM `notifications` INNER JOIN `messages` ON `notifications`.`message_id` = `messages`.`mes_id` WHERE `notifications`.`created` <= NOW()"; $queueData = $obj_basic->get_query_data($queueQuery); if(!empty($queueData)) { // Put your private key's passphrase here: $passphrase = 'Push'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'server_certificates_bundle_sandbox.pem'); 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 '<br>'.date("Ymd H:i:s").' Connected to APNS' . PHP_EOL; foreach($queueData as $val) { // Put your device token here (without spaces): $deviceToken = $val['device_token']; // Create message // Get senders name $sql = "SELECT `name` FROM `users` WHERE id =".$val['user_id']; $name = $obj_basic->get_query_data($sql); $name = $name[0]['name']; $message = $name." : "; // Get total unread messaged for receiver $query = "SELECT COUNT(*) as count FROM `messages` WHERE mes_parent = 0 AND user_id = ".$val['user_id']." AND mes_readstatus_doc != 0 AND mes_status = 1"; $totalUnread = $obj_basic->get_query_data($query); $totalUnread = $totalUnread[0]['count']; $message .= " This is a test message."; // Create the payload body $body['aps'] = array( 'alert' => $message, 'badge' => $totalUnread, '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; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) { echo '<br>'.date("Ymd H:i:s").' Message not delivered' . PHP_EOL; } else { $sqlDelete = "DELETE FROM `notifications` WHERE id = ".$val['id']; $query_delete = $obj_basic->run_query($sqlDelete,'DELETE'); echo '<br>'.date("Ymd H:i:s").' Message successfully delivered' . PHP_EOL; } } // Close the connection to the server fclose($fp); echo '<br>'.date("Ymd H:i:s").' Connection closed to APNS' . PHP_EOL; } else { echo '<br>'.date("Ymd H:i:s").' Queue is empty!'; }
Это довольно хороший учебник по всему этому. Помогли настроить мое серверное и демонстрационное приложение http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1