3,push服务器端
目前服务器端有很多工具也有第三方的,但为了自己用的方便
就自己写一个服务器端,这样以后的所有使用都可以调用。
我这边是用php来实现,至于java /.net 我也不会,就不说了网络上有很多大家可以去研究
1首先需要见一个表 “devices”
– 表的结构 `devices`
—CREATE TABLE `devices` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`devices_name` varchar(255) DEFAULT NULL,
`devices_version` varchar(25) DEFAULT NULL,
`devices_token` varchar(64) DEFAULT NULL,
`devices_type` varchar(100) DEFAULT NULL,
`mode` char(40) DEFAULT NULL,
`badge_number` int(11) DEFAULT ‘0’,
`status` int(11) DEFAULT ‘1’,
`create_time` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;—
— 转存表中的数据 `devices`
—INSERT INTO `devices` (`id`, `devices_name`, `devices_version`, `devices_token`, `devices_type`, `mode`, `badge_number`, `status`, `create_time`) VALUES
(1, ‘“WuWeibin”? iPhone’, ‘5.0.1’, ’60b69ddf954235b7bcfae1867da073d2e46c7a48affd0f2f2035d7dc74fa93bd’, ‘iPhone’, ‘Development’, 1, 1, ‘2012-10-24 17:13:22’);
2 建立php脚本 这里我就不说了
给大家分享我的代码
config.inc.php
<?php
define(‘DB_HOST’, ‘localhost’);
define(‘DB_USER’, ‘root’);
define(‘DB_PWD’, ‘****’);
define(‘DB_NAME’, ‘ios_push’);
define(‘DB_CODE’,’utf8′);
define(‘passphrase’,’123456′);
define(‘DevelopmentCer’, ‘apns_dev.pem’); //推送开发证书
define(‘ProductionCer’, ‘apns_dev.pem’); //推送发布证书
define(‘DevelopmentSSL’, ‘ssl://gateway.sandbox.push.apple.com:2195’);
define(‘ProductionSSL’, ‘ssl://gateway.push.apple.com:2195’);?>
db.class.php [数据库处理程序,太长就不贴了]
apns.php [处理程序]
<?php
require_once(‘apns.class.php’);
require_once(‘db.class.php’);
$db = new DB();
if(isset($_REQUEST[‘mode’]) && $_REQUEST[‘mode’] != “”){
$mode = $_REQUEST[‘mode’];
}else{
$mode = ‘Development’;
}
$apns = new APNS($db,$mode);switch ($_REQUEST[‘action’]){
case ‘registerDevices’:
$args = array();
$args[‘devices_token’] = $_REQUEST[‘devices_token’];
$args[‘devices_name’] = $_REQUEST[‘devices_name’];
$args[‘devices_version’] = $_REQUEST[‘devices_version’];
$args[‘devices_type’] = $_REQUEST[‘devices_type’];
//$args[‘badge_number’] = $_REQUEST[‘badge_number’];
$args[‘mode’] = $mode;
//unset($args[‘action’]);
$apns->registerDrevice($args);
break;
case ‘pushMessageToALL’:
$apns->createSSLConnect();
$message = $_REQUEST[‘message’];
$apns->sendALLMessage($message);
$apns->closeSSLConnect();
echo “推送消息发布完毕!”;
break;
case ‘pushMessageToone’:
$apns->createSSLConnect();
$message = $_REQUEST[‘message’];
$id = $_REQUEST[‘id’];
$apns->pushMessageToone($message,$id);
$apns->closeSSLConnect();
echo “推送消息发布完毕!”;
break;
case ‘cleanBadgeNumber’:
$apns->cleanBadgeNumberById($_REQUEST[‘id’], $_REQUEST[‘badge’]);
break;
}?>
apns.class.php [这个文件是处理信息的库文件,我这里就不贴了,我后面回给大家下载]
index.hp [最后有一个index文件是个界面文件 用来展现和发送推送信息的]
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js”></script>
<script type=”text/javascript”>
$(document).ready(function(){});
function sendPushNotification(id){
var data = $(‘form#’+id).serialize();
$(‘form#’+id).unbind(‘submit’);
var div = ‘.id’+id;
$.ajax({
url: “apns.php?action=pushMessageToone”,
type: ‘GET’,
data: data,
beforeSend: function() {
html = “<b>请等待,正在发送中……</b>”;
$(div).html(html);},
success: function(data, textStatus, xhr) {
$(‘.txt_message’).val(“”);
$(div).html(data);},
error: function(xhr, textStatus, errorThrown) {}
});
return false;
}
function sendPushall(){
var data = $(‘form#all’).serialize();
$(‘form#all’).unbind(‘submit’);$.ajax({
url: “apns.php?action=pushMessageToALL”,
type: ‘GET’,
data: data,
beforeSend: function() {html = “<b>请等待,正在发送中……</b>”;
$(‘.info’).html(html);},
success: function(data, textStatus, xhr) {
$(‘.txt_message’).val(“”);
$(‘.info’).html(data);
},
error: function(xhr, textStatus, errorThrown) {}
});
return false;
}
function add(){
var data = $(‘form#add’).serialize();
$(‘form#add’).unbind(‘submit’);
$.ajax({
url: “apns.php?action=registerDevices”,
type: ‘GET’,
data: data,
beforeSend: function() {html = “<b>请等待,正在提交……</b>”;
$(‘.add’).html(html);},
success: function(data, textStatus, xhr) {
$(‘.txt_message’).val(“”);
$(‘.add’).html(data);
},
error: function(xhr, textStatus, errorThrown) {}
});
return false;
}
</script></head>
<body>
<div class=”head”>
<h1>ios 消息推送管理</h1>
<span><a href=”index.php”>发送推送消息</a></span>
<span><a href=”index.php?action=add”>增加客户端设备</a></span>
<span><a href=”index.php?action=del”>删除客户设备</a></span>
<span><a href=”index.php?action=update”>修改客户设备</a></span>
<hr/>
</div>
<?php
include_once ‘config.inc.php’;
require_once(‘db.class.php’);
$db = new DB();
$sql = “SELECT * FROM `devices` ORDER BY `devices`.`id` ASC “;
$users = mysql_query($sql);
//$info1 = mysql_fetch_row($users);
//print_r($info1);if ($users != false)
$no_of_users = mysql_num_rows($users);
else
$no_of_users = 0;switch ($_REQUEST[‘action’]){
case ‘add’:
?>
<div class=”container”>
<ul class=”devices”>
<li>
<form id=”add” name=”” method=”post” onsubmit=”return add()”><p><label>姓名: </label> <span><input type=”text” name=”devices_name”/></span></p>
<p><label>设备: </label> <span><input type=”text” name=”devices_type”/></span></p>
<p><label>设备版本:</label><span><input type=”text” name=”devices_version”/></span></p>
<div class=”clear”></div>
<p><label>devices_token:</label> <span><input type=”text” name=”devices_token”/></span></p> <div class=”clear”></div>
<p><input type=”submit” class=”send_btn” value=”Send” onclick=””/></p>
<p>回馈信息:<br><span style=”float:none; color:#F00;” class=”add”></span></p>
</form>
</li>
</ul>
</span>
<?php
break;
case ‘del’:
echo “del”;
break;
case ‘update’:
echo “update”;
break;
default:
?>
<div class=”container”>
<h2>IOS消息推送:可推送用户为<?php echo $no_of_users; ?>个</h2>
<hr/>
<h2>全部发送推送消息</h2>
<ul class=”devices”>
<?php
if ($no_of_users > 0) {?>
<li>
<form id=”all” method=”post” onsubmit=”return sendPushall()”>
<p><label>消息内容:</label>
<textarea rows=”3″ name=”message” cols=”105″ class=”txt_message” placeholder=”Type message here”></textarea><p>
<p><input type=”submit” class=”send_btn” value=”Send” onclick=””/></p>
</form>
</li>
<li>
<h3>回馈信息:</h3>
<div class=”info”>
</div>
</li>
<?php } else { ?>
<li>
No Users Registered Yet!
</li>
<?php } ?>
</ul>
<hr/>
<h2>单独发送推送消息</h2>
<p>请选择相应的用户,点对点发送推送消息。</p>
<hr/>
<ul class=”devices”>
<?php
if ($no_of_users > 0) {
?>
<?php
while ($row = mysql_fetch_array($users)) {
?>
<li>
<form id=”<?php echo $row[“id”] ?>” name=”” method=”post” onsubmit=”return sendPushNotification(‘<?php echo $row[“id”] ?>’)”>
<p><label>编号: </label> <span><?php echo $row[“id”] ?></span></p>
<p><label>姓名: </label> <span><?php echo $row[“devices_name”] ?></span></p><p><label>设备: </label> <span><?php echo $row[“devices_type”] ?></span></p>
<p><label>设备版本:</label><span><?php echo $row[“devices_version”] ?></span></p><p><label>已发送数:</label><span><?php echo $row[“badge_number”] ?></span></p>
<p><label>是否活跃:</label><span><?php if($row[“status”] == 1)echo(‘是’);else echo(‘否’); ?></span></p>
<div class=”clear”></div>
<p><label>devices_token:</label> <span><?php echo $row[“devices_token”] ?></span></p> <div class=”clear”></div>
<p><label>消息内容:</label>
<textarea rows=”3″ name=”message” cols=”55″ class=”txt_message” placeholder=”Type message here”></textarea><p>
<input type=”hidden” name=”id” value=”<?php echo $row[“id”] ?>”/>
<p><input type=”submit” class=”send_btn” value=”Send” onclick=””/></p>
<p>回馈信息:<br><span style=”float:none; color:#F00;” class=”id<?php echo $row[“id”] ?>”</span></p>
</form>
</li>
<?php }
} else { ?>
<li>
No Users Registered Yet!
</li>
<?php } ?>
</ul></div>
<?php } ?>
<style type=”text/css”>.head,
.container{
width: 950px;
margin: 0 auto;
padding: 0;
}.head span a{
color:#F00;
font-size:16px;
border:1px #FF0 solid;}
h1{
font-family: ‘Helvetica Neue’, Helvetica, Arial, sans-serif;
font-size: 24px;
color:#900;
}
h2{
font-size: 16px;
color:#00F;}
div.clear{
clear: both;
}
ul.devices{
margin: 0;
padding: 0;
}
ul.devices li{
list-style: none;
border: 1px solid #dedede;
padding: 10px;
margin: 0 15px 25px 0;
border-radius: 3px;
-webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
-moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
font-family: ‘Helvetica Neue’, Helvetica, Arial, sans-serif;
color: #555;
}
ul.devices li label, ul.devices li span{
font-family: ‘Helvetica Neue’, Helvetica, Arial, sans-serif;
font-size: 12px;
font-style: normal;
font-variant: normal;
font-weight: bold;
color: #393939;
display: block;
float: left;
}
ul.devices li span{
margin-right:10px;
font-weight:300;
}ul.devices li p{
display:block;
margin-right:10px;
}
ul.devices li label{
color:#06F;
margin-right:10px;}
ul.devices li textarea{resize: none;
}
ul.devices li .send_btn{
background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#0096FF), to(#005DFF));
background: -webkit-linear-gradient(0% 0%, 0% 100%, from(#0096FF), to(#005DFF));
background: -moz-linear-gradient(center top, #0096FF, #005DFF);
background: linear-gradient(#0096FF, #005DFF);
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.3);
border-radius: 3px;
color: #fff;
}b{
color:#F00;
}
.info{
color:#F00;
}
</style>
</body>
</html>
至此服务器端就完成了,当你的应用被安装就能看到有机器的相应信息被写入库里面。
然后就可以通过index这个文件来发送信息了。
最后我把服务器端的代码发出来给大家测试。由于网上提高的代码多有问题而且 需要自己在开发
我这里把已经修改好并测试过的代码给大家。
下载:php-push-server
注意:
AppStore 与 App AdHoc两种发布方式的设置:
1、以上第1、2步生成的PushNotification.certSigningRequest与apns_dev_key.pem继续使用。
2、登录Provisioning Portal 把 AppID 的 Production Push SSL Certificate启用,用到PushNotification.certSigningRequest。启用后生成:aps_production.cer,下载本地
3、与开发时的设置一样,把aps_production.cert转成apns_production_cert.pem,然后将apns_production_cert.pem与apns_dev_key.pem结合生成apns_production.pem
4、PHP发送脚本需要修改
4.1 APNS服务器地址改为:ssl://gateway.push.apple.com:2195’,开发时是:ssl://gateway.sandbox.push.apple.com:2195′
4.2 发送的证书要使用apns_production.pem。
4.3 最关键一步,同一个iphone,开发与发布两种状态的token是不一样的,所以这里需要修改token。(用发布的程序抓取)
转载请注明:夜阑小雨 » phonegap -ios -push 消息推送实践(三)