I am working on a php website + iphone application and API for iphone application, has a messaging system for students and doctors, when any one sends message(from website or iphone) the other user should get push notification on his iphone. For example if student adds a new question for teacher, a push notification on teachers iphone/ipad will be send to teacher andwhen teacher reply to student's answer, student will get a push notification. Since there is no restriction on number of teachers and student registering to website. So my question is how to send push messages to registered users iphone, I want to send push message as soon as some one reply or add question. Please provide me php code for sending multiple push messages. I am saving device token for each user while registration.
我正在开发一个php网站+ iphone应用程序和iphone应用程序API,有一个学生和医生的消息传递系统,当任何一个人发送消息(来自网站或iphone)时,另一个用户应该在他的iphone上得到推送通知。例如,如果学生给老师添加了一个新问题,老师将会向老师发送一个推送通知,当老师回复学生的答案时,学生将会得到推送通知。由于对教师和学生注册网站的数量没有限制。所以我的问题是如何向注册用户iphone发送推送消息,我想在有人回复或添加问题后马上发送推送消息。请提供我的php代码发送多个推送消息。我在注册时为每个用户保存设备令牌。
When teacher reply to question I am sending mail to student, I want to send a push notification too to student and vice versa so please specify code able to manage error conditions.
当老师回复我给学生发邮件的时候,我也想发送一个推送通知给学生,反之亦然,所以请指定能够管理错误条件的代码。
Please suggest any tutorial for sending push notifications on iOS.
请建议任何在iOS上发送推送通知的教程。
4 个解决方案
#1
34
Simple way to do it without use any file. You can call it multiple times with different tokeid.
不使用任何文件的简单方法。您可以使用不同的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);
#2
15
You should better use APNS library for PHP. You can find it here. Look through samples that developers provide.
您应该更好地为PHP使用APNS库。你可以在这里找到。查看开发人员提供的示例。
I also had problems with certificates. My actions were:
我的证书也有问题。我的行动是:
- locate file
ApnsPHP/Abstract.php
- 定位文件ApnsPHP / Abstract.php
-
make some changes to
_connect()
method, paste this lines对_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);
instead of original listed there
而不是原来列在那里
-
now you can use *.pem certificates without need of entrust_root_certification_authority.
现在你可以用*了。不需要entrust_root_certification_authority的pem证书。
This worked fine for me.
这对我很有效。
#3
12
This is the way I have done it finally
这是我最后的做法。
- Downloaded apns-php
- 下载apns-php
- PHP Code
- 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!';
}
#4
2
This is a pretty good tutorial on all that. Helped me setup my server and demo app http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
这是一个很好的教程。帮助我设置我的服务器和演示应用http://www.raywenderlich.com/32960/apple-push- notificationservices-inios-6-tutorialpart1
#1
34
Simple way to do it without use any file. You can call it multiple times with different tokeid.
不使用任何文件的简单方法。您可以使用不同的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);
#2
15
You should better use APNS library for PHP. You can find it here. Look through samples that developers provide.
您应该更好地为PHP使用APNS库。你可以在这里找到。查看开发人员提供的示例。
I also had problems with certificates. My actions were:
我的证书也有问题。我的行动是:
- locate file
ApnsPHP/Abstract.php
- 定位文件ApnsPHP / Abstract.php
-
make some changes to
_connect()
method, paste this lines对_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);
instead of original listed there
而不是原来列在那里
-
now you can use *.pem certificates without need of entrust_root_certification_authority.
现在你可以用*了。不需要entrust_root_certification_authority的pem证书。
This worked fine for me.
这对我很有效。
#3
12
This is the way I have done it finally
这是我最后的做法。
- Downloaded apns-php
- 下载apns-php
- PHP Code
- 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!';
}
#4
2
This is a pretty good tutorial on all that. Helped me setup my server and demo app http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
这是一个很好的教程。帮助我设置我的服务器和演示应用http://www.raywenderlich.com/32960/apple-push- notificationservices-inios-6-tutorialpart1