苹果推送(APNs)ios push小结
把app删除后就推送不成功了,可以看出deviceToken应该是设备+app来一起识别的,重新安装后仍然为同一个
简介
推送服务APNs(Apple Push Notification services)
苹果的推送服务APNs基本原理简单来说就是:苹果利用自己专门的推送服务器(APNs)接收来自我们自己的应用服务器的需要被推送的信息,然后推送到指定的iOS设备上,然后由设备通知到我们的应用程序,设备以通知或者声音的形式通知用户有新的消息。推送的前提是装有我们应用的设备需要向APNs服务器注册,注册成功后APNs服务器会返给我们一个device_token,拿到这个token后我们将这个token发给我们自己的应用服务器,当有需要被推送的消息时,我们的应用服务器会将消息按指定的格式打包,然后结合设备的device_token一并发给APNs服务器,由于我们的应用和APNs维持一个基于TCP的长连接,APNs将新消息推送到我们设备上,然后在屏幕上显示出新消息来。
1.Device连接APNs服务器并携带设备序列号
2.连接成功,APNs产生device_token并返回给Device
3.Device携带获取的device_token向我们自己的应用服务器注册,一定要将device_token发送给我们的应用服务器,因为在推送过程中,首先是由我们的应用服务器将需要推送的消息结合device_token按指定格式(后面会提到)打包然后发送给APNS服务器,然后由APNS服务器推送给我们的设备。
推送消息是个JSON结构体,最大值是 256 字节。alert标签的内容就是会显示在用户手机上的推送信息,badge显示的数量(注意是整型)是会在应用Icon右上角显示的数量,提示有多少条未读消息等,sound就是当推送信息送达是手机播放的声音,传defalut就标明使用系统默认声音,如果传比如“beep.wav”就会播放在我们应用工程目录下名称为beep.wav的音频文件。
要在这个结构中新增自定义数据,请加在aps空间之外。比如后台推送消息给应用同时要求应用打开某个页面:
{"aps":{"alert":"张三:国庆回家吗?","sound":"default"},"msg":"这里是额外消息,不显示在通知界面上。"}
具体步骤
打开“钥匙串”程序,(证书助理->从证书颁发机构请求证书),只填邮箱和常用名称,ca不用填,然后保存.certSigningRequest文件到磁盘。
在iOS Dev Center 点击App IDs进入App ID列表。
为 App 开启 Push Notification 功能。(推送证书分为两个版本,一个是Development版,一个是Production版,分别对应开发证书和发布证书。)
上传刚才生成的.certSigningRequest文件,生成aps_development.cer推送证书,双击安装。
打开“钥匙串”程序,(选择登录与我的证书选项后)找到IOS Push Services那条。
右键导出,存储为cert.p12,(输入密码P*d),然后将该证书的折叠打开,导出“专用密钥”。存储为key.p12
接下来打开终端生成cert.pem
openssl pkcs12 -clcerts-nokeys-out cert.pem -in cert.p12 生成key.pem(先输入导出key.p12时设置的密码P*d, 然后设置一个新的密码,如pushpwd,这个密码后面php推送时要设置) openssl pkcs12 -nocerts-out key.pem -in key.p12 合并成ck.pem cat cert.pem key.pem > ck.pem
将这个ck.pem放在服务器上,与发送脚本放在同一个目录下。 测试这个key
openssl s_client -connect gateway.sandbox.push.apple.com:2195-cert cert.pem -key ck.pem
iOS程序处理
应用如何获取deviceToken。应用必须先注册使用push功能。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {//Let teh device know we want to receive push notifications[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; returnYES; } -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { NSLog(@"My token is:%@", deviceToken); }-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error { NSLog(@"Failed tp get token, error:%@", error); }
客户端接收push消息
如果应用已经启动,将调用AppDelegate的方法: -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary*)userInfo {// userInfo 就是push消息的Payload} 如果应用还没有启动,通过push冷启动后,仍然能在启动后获取Payload: -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {NSDictionary* userInfo =[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; NSLog(@"Payload: %@", userInfo); }
php推送程序
<?php/* ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT); */ // Put your device token here (without spaces):$deviceToken='af93167751347b0909a05b97fefa1c7525dbbad0608cd63d19b11cbeb4a7878c';// Put your private key's passwd here:$passphrase='这时填你生成key.pem时设置的密码'; // Put your alert message here:$message='Welcome to www.elesos.com'; //////////////////////////////////////////////////////////////////////////////// $ctx=stream_context_create();stream_context_set_option($ctx,'ssl','local_cert','client.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'Connected to APNS'. PHP_EOL; // Create the payload body$body['aps']=array('alert'=>$message,'badge'=>1,'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'Message not delivered'. PHP_EOL;elseecho'Message successfully delivered'. PHP_EOL; // Close the connection to the serverfclose($fp);
参考
http://www.dapps.net/dev/code/apple-push-notification-services-tutorial-part-1.html
http://www.cnblogs.com/gugupluto/p/3534118.html
http://blog.csdn.net/kylinbl/article/details/6729369
http://docs.jpush.cn/pages/viewpage.action?pageId=1343727
http://saeapns.sinaapp.com/doc.html
苹果推送(APNs)ios push小结的更多相关文章
- 苹果推送通知服务Push Notification探究总结(序)
刚才发了两篇几个月前写的文档,觉得太敷衍了,想了想,还是来一发实在的. 再者,刚好上周研究了苹果的推送通知服务Push Notification,还是很有心得的,赶紧趁热打铁,记录一下,望与大家谈论下 ...
- 苹果推送APNS自己总结
开发状态服务器地址 gateway.sandbox.push.apple.com 2195 产品状态服务器地址 gateway.push.apple.com 2195 Developm ...
- 苹果推送APNS总结 (
开发状态服务器地址 gateway.sandbox.push.apple.com 2195产品状态服务器地址 gateway.push.apple.com 2195 Developme ...
- IOS学习笔记—苹果推送机制APNs
转自:唐韧_Ryan http://blog.csdn.net/ryantang03/article/details/8482259 推送是解决轮询所造成的流量消耗和 电量消耗的一个比较好的解决方案, ...
- (转)苹果推送通知服务教程 Apple Push Notification Services Tutorial
本文译自http://www.raywenderlich.com/.原文由iOS教程团队 Matthijs Hollemans 撰写,经原网站管理员授权本博翻译. 在iOS系统,考虑到手机电池电量,应 ...
- 苹果推送通知服务APNs编程(转)
add by zhj: 下面的几篇文章也非常好, http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios- ...
- iOS上简单推送通知(Push Notification)的实现
iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification ...
- iOS苹果推送功能实现步骤
1.在钥匙串里 导出推送证书Apple Push notification Services 的 certificate, 命名为cer.p12,放在电脑桌面 ,期间密码设为123456 2.在钥匙串 ...
- 李洪强iOS之集成极光推送二iOS 证书 设置指南
李洪强iOS之集成极光推送二iOS 证书 设置指南 创建应用程序ID 登陆 iOS Dev Center 选择进入iOS Provisioning Portal. 在 iOS Provisioning ...
随机推荐
- Greedy:Physics Experiment(弹性碰撞模型)(POJ 3848)
物理实验 题目大意:有一个与地面垂直的管子,管口与地面相距H,管子里面有很多弹性球,从t=0时,第一个球从管口求开始下落,然后每1s就会又有球从球当前位置开始下落,球碰到地面原速返回,球与球之间相碰会 ...
- 51 NOD 1384 全排列(STL 搜索)
1384 全排列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个字符串S(可能又重复的字符),按照字典序 ...
- CSS命名格式
CSS样式命名整理页面结构 容器: container/wrap整体宽度:wrapper页头:header内容:content页面主体:main页尾:footer导航:nav侧栏:sidebar栏目: ...
- bat批量删.svn
==================1======================= Bat代码 收藏代码 @echo off :start ::启动过程,切换目录 set pwd=%cd% cd % ...
- AngularJS 控制器 ng-controller
AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的 JavaScript 对象. AngularJS 应用程序被控制器控制. ng-contro ...
- 三、jQuery--jQuery实践--搜索框制作
input标签讲解 <input/>作为按钮的type属性:button.submit(后面会有二者对比分析)
- NotePad ++的妙用:添加代码行数和格式不变复制代码
NotePad ++ 不仅安装包小而且功能强大,可以支持很多语言.这里简单阐述下两个功能: 一.在代码前添加行数: 1.用NotePad ++打开一个文件,一般NotePad ++会自动识别这是什么语 ...
- 浅谈 switch和if
1.所有的switch 都可以用if 替换,但所有的if不一定能被switch替换 2.:switch case直接跳到对应的case值里面执行相应代码.而if语句会执行一条一条判断语句,直到匹配到对 ...
- 从数据库导出数为生成excel表
mysql -umaster -hxx.xx.xx.xx -p -e "set names utf8; use xxxdb;select * from t_order where t_ord ...
- javascript - DOM对象控制HTML元素详解
1.方法 getElementsByName() -- 获取name getElementByTagName() -- 获取 getAttribute() --获取元素属性 se ...