我正在开发一个PHP网站+ iPhone应用程序和iPhone应用程序API,具有一个面向学生和医生的消息传递系统,当任何一个人(从网站或iPhone)发送消息时,另一个用户应在其iPhone上获得推送通知。例如,如果学生为老师添加了一个新问题,则老师iPhone / iPad上的推送通知将发送给老师,并且当老师回复学生的答案时,学生会收到推送通知。
由于对在网站上注册的师生人数没有限制,我的问题是如何将推送消息发送到注册用户的iPhone?我想在有人回复或添加问题后立即发送推送消息。请向我提供用于发送多个推送消息的PHP代码。我在注册时为每个用户保存设备令牌。
当老师回答问题时,我也要向学生发送邮件,我也想向学生发送推送通知,反之亦然,因此请指定能够管理错误情况的代码。
这是我终于做到的方式
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("Y-m-d 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("Y-m-d 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("Y-m-d H:i:s").' Message successfully delivered' . PHP_EOL; } } // Close the connection to the server fclose($fp); echo '<br>'.date("Y-m-d H:i:s").' Connection closed to APNS' . PHP_EOL; } else { echo '<br>'.date("Y-m-d H:i:s").' Queue is empty!'; }