【PHP】iOS推送通知以及反馈服务
近来项目是完成一个PHP的推送服务器,无论是PHP,APNs还是GCM基本上都是从零开始。
写下一点见解,方便以后继续做代码的搬运工。
因为对PHP跟iOS都不熟悉,可能有错漏。。。穷孩子没有用过iOS的东西。。。
设备如果希望能够及时收到服务器的消息,大概有三种方式:
1)轮询(Pull)方式:客户端与服务器主动连接查询。因为及时性以及耗电量等要求不可得兼,一般不考虑。
2)SMS(Push)方式:在Android平台,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。但是这个方案的成本相对较高,需向移动公司缴纳费用
3)持久连接(Push)方式:在Android上有GCM,设置可以跑自己的后台程序链接自己的服务器。在iOS上就限定了只能使用苹果自身的APNs(Apple Push Notification Service)
【PHP实现APNs的推送通知】
准备好pem文件之后,php方面发送推送通知的代码如下:
private static function pushIOS($deviceToken='',$message=''){ $body = array("aps" => array("alert" => $message,"badge" => 2,"sound"=>'default')); //推送方式,包含内容和声音 $ctx = stream_context_create();
//如果在Windows的服务器上,寻找pem路径会有问题,路径修改成这样的方法:
$pem = dirname(__FILE__) . '/' . 'apns-dev.pem';
stream_context_set_option($ctx,"ssl","local_cert",$pem);
//linux 的服务器直接写pem的路径即可
//stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");
$pass = "1234";
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
//must select between two servers:if for testing,select sandbox server and Dev pem file ; if for relese,use Product pem and server
//$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
$fp = stream_socket_client("ssl://gateway.sandbox.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp)
{
echo "Failed to connect $err $errstrn";
return;
}
print "Connection OK\n";
$payload = json_encode($body);
$msg = chr(0) . pack("n",32) . pack("H*", str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
echo "sending message :" . $payload ."\n";
fwrite($fp, $msg);
fclose($fp);
}
【PHP实现APNs的Feedback Service】
function send_feedback_request() {
//connect to the APNS feedback servers
//make sure you're using the right dev/production server & cert combo!
$stream_context = stream_context_create();
stream_context_set_option($stream_context, 'ssl', 'local_cert', '/path/to/my/cert.pem');
$pass = "1234";
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); $apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context);//如果是开发中的话,地址应该是:feedback.sandbox.push.apple.com:2196
if(!$apns) {
echo "ERROR $errcode: $errstr\n";
return;
} $feedback_tokens = array();
//and read the data on the connection:
while(!feof($apns)) {
$data = fread($apns, 38);
if(strlen($data)) {
$feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
}
}
fclose($apns);
return $feedback_tokens;
}
顺利的话,这个方法的返回值应该是如下形式:
Array
(
Array
(
[timestamp] => 1266604759
[length] => 32
[devtoken] => abc1234..............etcetc
),
Array
(
[timestamp] => 1266604922
[length] => 32
[devtoken] => def56789..............etcetc
),
)
苹果的尿性,一点都不人性化。Google的GCM每次推送过去都会返回每条消息的发送结果,如果设备已经卸载了应用导致id不再可用也马上可以看到,群发消息也支持一千条一千条地发送。
苹果的只能一条条发送,并且调用这个不知所谓的反馈服务。
果粉看到这里可以能骂人,不过我是果黑,不管。
【PHP】iOS推送通知以及反馈服务的更多相关文章
- iOS推送通知
推送通知 此通知非彼通知. NSNotification是抽象的,看不见的,但是可以监听,属于观察者模式的一种设计模式. 推送通知是可见的,能用肉眼看见的,是真正的和用户打交道的通知. 推送通知分为两 ...
- “iOS 推送通知”详解:从创建到设置到运行
这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...
- iOS推送通知的实现步骤
一.关于推送通知 来源:http://blog.csdn.net/enuola/article/details/8627283 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序 ...
- iOS推送通知流程
①注册推送通知使用方法:registerUserNotificationSettings, registerForRemoteNotifications ④APP发送deviceToken到第三方: ...
- Clojure:两步发送iOS推送通知(apns)
首先在project.clj中,添加对notnoop 类库的引用:[com.notnoop.apns/apns "0.2.3"] 然后使用如下方法就可以发送推送消息了: (ns d ...
- iOS 推送通知处理
//这是程序杀死后再通过点击通知进入时调用的方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOpti ...
- IOS推送通知測试工具PushMeBaby
下载了PushMeBaby在xcode5里中不能使用.类库变了.须要加入Carbon.framework库.在引用的地方改成: #include <Carbon/Carbon.h>.程序就 ...
- 转:向IOS设备发送推送通知
背景 SMS 和 MMS 消息是由无线运营商通过设备的电话号码向特定设备提供的.实现 SMS/MMS 的服务器端应用程序的开发人员必须费大量精力才能与现有的封闭电信基础架构进行交互(其中包括获取电话号 ...
- iOS 远程推送通知 详解
1: ios本地通知和远程通知 http://wangjun.easymorse.com/?p=1482 2: 苹果远程通知服务申请激活例图 (外国佬写的.) http://mobiforge.com ...
随机推荐
- CSS 之 Opacity多浏览器透明度兼容处理
用来设定元素透明度的 Opacity 是CSS 3里的一个属性.当然现在还只有少部分浏览器支持. 不过各个浏览器都有自己的私有属性来支持,其中包括老版本的Mozilla和Safari: IE: fil ...
- JS常用的设计模式(15)—— 职责链模式
职责链模式是一个对象A向另一个对象B发起请求,如果B不处理,可以把请求转给C,如果C不处理,又可以把请求转给D.一直到有一个对象愿意处理这个请求为止. 打个比方,客户让老板写个php程序.老板肯定不写 ...
- 002vim常用命令
1.命令行模式:刚进入vim时的模式,该模式下可以移动光标进行浏览,可以进行整行删除等操作,但无法编辑文字,该模式下的功能键有: (1)yy:复制当前光标所在行 (2)[n]yy:n为数字,复制当前光 ...
- shell脚本中的特殊符号
1.{} 大括号:用法一:通配符扩展eg: ls my_{finger,toe}s这条命令相当于如下命令的组合:ls my_fingers my_toeseg: mkdir {userA,userB, ...
- Mysql 自定义随机字符串
前几天在开发一个系统,需要用到随机字符串,但是mysql的库函数有没有直接提供,就简单的利用现有的函数东拼西凑出随机字符串来.下面简单的说下实现当时. 1.简单粗暴. select ..., subs ...
- C puzzles详解【46-50题】
第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http:// ...
- Openvz特点和分析
OpenVZ是开源软件,是基于Linux平台的操作系统级服务器虚拟化解决方案.OpenVZ采用SWsoft的Virutozzo虚拟化服务器软件产品的内核,Virutozzo是SWsoft公司提供的商业 ...
- 自己实现的一款在线Javascript正则表达式测试器——JRE-Parser
本文最初发布于我的个人博客:http://jerryzou.com/posts/jreparser/ 昨天在看<正则表达式30分钟入门教程>的时候,看到博主自己实现了一个C#写的正则测试器 ...
- kettle教程(1) 简单入门、kettle简单插入与更新。打开kettle
本文要点:Kettle的建立数据库连接.使用kettle进行简单的全量对比插入更新:kettle会自动对比用户设置的对比字段,若目标表不存在该字段,则新插入该条记录.若存在,则更新. Kettle ...
- Spark自定义分区(Partitioner)
我们都知道Spark内部提供了HashPartitioner和RangePartitioner两种分区策略,这两种分区策略在很多情况下都适合我们的场景.但是有些情况下,Spark内部不能符合咱们的需求 ...