把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);

参考

https://developer.apple.com/library/IOs/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

一步一步实现iOS应用PUSH功能

http://www.dapps.net/dev/code/apple-push-notification-services-tutorial-part-1.html

一步一步教你做ios推送

http://www.cnblogs.com/gpwzw/archive/2012/03/31/apple_push_notification_services_tutorial_part_1-2.html

http://www.cnblogs.com/gugupluto/p/3534118.html

http://blog.csdn.net/kylinbl/article/details/6729369

苹果推送机制APNs(一)

苹果推送机制APNs(二)

http://docs.jpush.cn/pages/viewpage.action?pageId=1343727

http://saeapns.sinaapp.com/doc.html

苹果推送(APNs)ios push小结的更多相关文章

  1. 苹果推送通知服务Push Notification探究总结(序)

    刚才发了两篇几个月前写的文档,觉得太敷衍了,想了想,还是来一发实在的. 再者,刚好上周研究了苹果的推送通知服务Push Notification,还是很有心得的,赶紧趁热打铁,记录一下,望与大家谈论下 ...

  2. 苹果推送APNS自己总结

    开发状态服务器地址 gateway.sandbox.push.apple.com 2195 产品状态服务器地址 gateway.push.apple.com         2195 Developm ...

  3. 苹果推送APNS总结 (

    开发状态服务器地址 gateway.sandbox.push.apple.com 2195产品状态服务器地址 gateway.push.apple.com         2195 Developme ...

  4. IOS学习笔记—苹果推送机制APNs

    转自:唐韧_Ryan http://blog.csdn.net/ryantang03/article/details/8482259 推送是解决轮询所造成的流量消耗和 电量消耗的一个比较好的解决方案, ...

  5. (转)苹果推送通知服务教程 Apple Push Notification Services Tutorial

    本文译自http://www.raywenderlich.com/.原文由iOS教程团队 Matthijs Hollemans 撰写,经原网站管理员授权本博翻译. 在iOS系统,考虑到手机电池电量,应 ...

  6. 苹果推送通知服务APNs编程(转)

    add by zhj: 下面的几篇文章也非常好, http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios- ...

  7. iOS上简单推送通知(Push Notification)的实现

    iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification ...

  8. iOS苹果推送功能实现步骤

    1.在钥匙串里 导出推送证书Apple Push notification Services 的 certificate, 命名为cer.p12,放在电脑桌面 ,期间密码设为123456 2.在钥匙串 ...

  9. 李洪强iOS之集成极光推送二iOS 证书 设置指南

    李洪强iOS之集成极光推送二iOS 证书 设置指南 创建应用程序ID 登陆 iOS Dev Center 选择进入iOS Provisioning Portal. 在 iOS Provisioning ...

随机推荐

  1. ABAP 内表的行列转换-发货通知单-打印到Excel里-NEW-(以运单号为单位显示ALV然后保存输出)

    *********************************************************************** * Title           : ZSDF003  ...

  2. Effective C++ -----条款44:将与参数无关的代码抽离templates

    Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系. 因非类型模板参数(non-type template para ...

  3. 微信支付官方.net版之坑你没商量

    最近开始弄支付这块,先是支付宝手机网站支付,也是坑了我许久,不过还好,问题不大. 让我们看看微信支付有多少坑 微信商户平台,你们知道么(我前天才知道,别笑我) 登录地址:https://mch.wei ...

  4. [Android Pro] InputStream.skip方法的思考

    参考 : http://blog.csdn.net/gsyzhu/article/details/8102286 在java.io.InputStream类中定义了skip这个方法.在API中的描述如 ...

  5. September 17th 2016 Week 38th Saturday

    Our eyes do not show a lack of beauty, but a lack of observation. 世上不是缺少美,而是缺少发现美的眼睛. Don't pay too ...

  6. LTS学习

    下载 例子 安装部署zookeeper 运行根目录下的sh build.sh或build.cmd脚本 --> 会在dist目录下生成lts-{version}-bin文件夹(bin里有启动命令) ...

  7. sql语句的join用法

    sql的join分为三种,内连接.外连接.交叉连接. 以下先建2张表,插入一些数据,后续理解起来更方便一些. create table emp(empno int, name char(20),dep ...

  8. Android android:gravity属性介绍及效果图

    转自: http://blog.csdn.net/aminfo/article/details/7784229 Android:gravity的属性官方说明如下: public static fina ...

  9. HTML5学习之文档结构和语义(一)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. MVC4 遇到问题总结

    1.路径编写: 举例1.<img  src="../Login/VailCode" width="108" height="40"&g ...