当前时间:Friday 2016年12月09日 欢迎访问 夜阑小雨 我的学习碎片档案,这里记录了我的学习内容和工作中经验,希望给您带去帮助。

当前位置: 首页 >> ios,phonegap开发,网络分享 >> 正文

phonegap -ios -push 消息推送实践(三)

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 消息推送实践(三)
夜阑小雨版权所有,转载本网站文章时请保留此信息。

收藏和分享: 转贴到开心网 转贴到校内网 分享到 Twitter Delicious 分享到 Google Reader 分享到 百度收藏 分享到 QQ收藏

评论信息

6 条评论 发表评论
  1. php-push-server 下载不了。

  2. 你好,我按照你的教程修改了所有的代码,在xcode种用iphone运行的时候程序中断, 控制台输入如下信息:
    2013-08-12 15:37:13.905 StenaSteerV1[2935:907] Multi-tasking -> Device: YES, App: YES
    2013-08-12 15:37:13.920 StenaSteerV1[2935:907] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x1d55bc00
    2013-08-12 15:37:13.922 StenaSteerV1[2935:907] *** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x1d55bc00’
    *** First throw call stack:
    (0x34c932a3 0x32fa397f 0x34c96e07 0x34c95531 0x34becf68 0x42333 0x41a03 0x45297 0x4442f 0x444cd 0x9057 0x44539 0x90a1 0x88c5 0x35fc4ad9 0x35fc4663 0x35fbc84b 0x35f64c41 0x35f646d5 0x35f64123 0x351175a3 0x351171d3 0x34c68173 0x34c68117 0x34c66f99 0x34bd9ebd 0x34bd9d49 0x35fbb485 0x35fb8301 0x85a7 0x8568)
    libc++abi.dylib: terminate called throwing an exception
    (lldb)

    你有任何线索这是什么问题吗? 非常感谢。

    夜阑小雨 回复:

    这个需要在好好研究哈,插件应该有最新版本的了 ,可以下载最新插件来实现。

    Helen于 回复:

    @夜阑小雨, 你好, 我用你的push notification 服务器实现了,但是现在有一个问题, 就是如果注册的用户一旦多一点,数据库里面的设备数量20个的时候,推送通知的时候, 有一些设备就收不到推送通知,另外一些可以。请问你有碰到过类似的问题吗?

    夜阑小雨 回复:

    您好,没有遇到过这个问题。不过如果你遇到这个问题 ,你可以通过延迟时间,后台处理来实现,
    因为服务器和网络的原因可能导致超时。。。

  3. 你好,我按照你的1-3的教程实践了,可是在运行的时候xcode报了三个错误: 第一个是PushRuntime.h, semantic Issue, cannot find interface declaration for ‘AppDelegate’; 第二个是 AppDelegate.m, Semantic Issue, property ‘pendingNotifications’ not found on object of type ‘PushNotification *’, 第三个错误和第二个一样。

    非常期待你的回复,多谢。

    夜阑小雨 回复:

    插件应该有最新版本的了 ,可以下载最新插件来实现。

发布评论

您必须登录才能发表评论。

网站客户端下载