在ios系统中,app应用程序无法在后台完成较多的任务,仅仅允许程序做一些有限的任务(如音视频播放、地理位置信息、voip)。然而,如果你想做 一些有趣的事情,并且告知用户,甚至用户没有使用你的app应用程序,如收到一条微博信息,自己心爱的球队夺冠又或者晚餐已经准备好了等信息时,由于你的 app应用程序没有运行(或者程序进入后台,进程被挂起),因此,可能无法接收到相关的消息。

        然而,苹果提供了这类情况的解决方案,替代你的app应用程序定时获取事件或者在后台去处理这些事件,你需要搭建服务器端来处理这类事情。当感兴趣的事 情发生时,服务器端会发送一条推送通知到你的app应用程序。推送通知可以做三件事情,1文字信息,2一种声音,3一个徽章的标记号。你可以将以上三种情 况任意组合,这取决于你的app应用程序。比如推送通知时,只显示声音和标记,不显示消息等。
1、推送通知流程简述
    (1) 首先用户必须确认需要接收到这些消息;
    (2)app程序接收到令牌信息;
    (3)将令牌信息发送到服务器端;
    (4)当感兴趣的事情发生时,你的服务器将向苹果的推送通知服务器(Apple Push Notification Service,以下简称APNS)发送通知;
    (5)APNS会向你的设备发送消息,即通知;
2、推送通知基本要求
    (1)首先需要iphone或者ipad设备,模拟器上无法对“推送通知”进行测试。因此,你必须在真机上进行测试;
    (2)需要加入ios开发者计划(99美金/年);
    (3)一台连接互联网的服务器,因为推送通知的发起者是你的服务器(provider);
3、推送通知内容解析
        服务器端(provider)负责创建消息推送通知,一个推送服务 通知主要包含“设备令牌”和“负载”(定义的json信息的属性列表,负载最大运行值为256字节)。对于每个推送通知,服务器端(provider)必 须构建一个严格遵守 RFC 4627 的 JSON 字典。 该字典必须包含一个键名为 aps 的字典。而 aps 的字典包含一个或多个属性,这些属性指定如下动作:
    (1)提示用户的警告信息(ios5后有所改变,但大体一致);
    (2)一个提示声音;
    (3)显示app应用程序的数字(徽章);
4、推送通知的局限性
        它们是不可靠的!不同的设备之间,他们的推送消息的时间可能存在不一致。
推送通知也可能不会被送达到指定设备。原因是可能所在wifi环境下端口被封、设备处于关机状态,又或者网络环境较差,以至无法正确送达。APNS会尽量与设备“握手”以此建立连接,但它只会尝试在有限的时间,一旦超时,推送通知将永远消失。
5、推送通知步骤详述
      消息推送通知步骤与真机调试应用程序(包括发布程序流程)流程基本相同。只是在创建App ID时,与后者有所差别。此外,还需要向服务器端提供pem文件(该文件用于服务器与APNS服务器建立TSL点对点连接)。
5.1、请求CSR 文件
      单击“钥匙串访问”,选择“证书助理”一项,单击下拉菜单中“从证书颁发机构请求证书”项(如若没有该选择项,则需要下载“WWDR Intermediate Certificate”),此外需要确保没有选中“钥匙访问串”中任何密钥。如下图所示:
图5-1  请求CSR文件
5.2、制作CSR文件
    填写用户邮件地址以及给钥匙命名,选择CSR文件存储路径(全称Certificate Signing Request,用于向苹果请求开发证书和push证书),如下图所示:
图5-2  生成CSR文件
5.3、导出私钥
        单击新生成的密钥(共含公钥和私钥),将私钥导出,输入导出密码,并牢记此密码,如下图所示:
图5-3  导出私钥
5.4、制作开发证书
        进入苹果IDP(ios Developer Program)页面,选择certificates一栏,请求开发证书。选择已生成好CSR文件,单击submit按钮,生成开发证书。(刷新页面后,可下载该证书)如下图所示:
图5-4  生成开发者证书
5.5、安装开发证书
       下载完成证书后(.cer文件),双击证书将开发证书添加至钥匙串访问中,如下图所示:
图5-5   安装开发者证书
5.6、创建App  ID
       添加完成开发证书后,选择App
 IDs一栏,创建一个新的应用程序ID。在“Bundle
Identifier”项中,将绑定标识符设置为“com.yourcompany.pushApp”(固定写法
)而不是“com.yourcompany.*”(每一个带有推送应用程序,需要拥有自己独特的ID,因为推送通知需要被发送到一个特定的应用中,因此,
不可以使用通配符“*”)如下图所示:
5.7、制作push SSL证书
       App ID生成后,下一步将配置App
ID。单击“configure”,选中“Enable for Apple Push Notification service”,“push
SSL certificate”项即可被激活。选择配置“Development Push SSL
Certificate”项(“production Push SSL certificate ”证书用于该产品发布时,“Development
Push SSL Certificate”用于程序测试),单击“configure”根据向导生成“push SSL”证书。进入到“submit
certificate signing request”页时,再次选择已生成CSR文件,单击submit按钮生成push
SSL证书。点击“download”按钮下载该证书,双击后添加至“钥匙串访问中”,如下图所示:
5.8、制作provisioning文件
       填写该文件名称,选择签发证书机构,再选择已生成App ID,最后一步选择需要测试的设备。单击“submit”生成provisioning文件,下载后,双击安装。如下图所示:
5.9、制作PEM文件
 PEM文件由私钥和push SSL证书合成的文件。当服务器端(provider)与APNS服务器建立连接时,需要对该文件进行验证。
    (1)准备私钥和push SSL证书
          私钥是在5.3步骤中获得到,push SSL证书是在步骤5.7中得到。
    (2)将证书制作成.pem文件
          打开终端应用程序,访问到push
SSL目录下(如访问到桌面APNS文件夹下,在终端输入“cd
/Users/userName/Desktop/APNS”),输入命令“openssl x509 -in
aps_developer_identity.cer -inform der
    -out
push_developer_cer.pem”(将.cer文件“aps_developer_identity”转换成.pem文件
“push_developer_cer”)。运行命令后,在该文件夹产生一个新的文件“push_developer_cer.pem”。
    (3)将私钥制作成.pem文件
         在终端程序中输入“openssl pkcs12 -nocerts
-out pushKey.pem –in
TestPushKey.p12”命令,输入该命令后,终端程序提示输入密钥密码,键入密码后,终端继续提示输入新密码以及确认密码步骤。成功验证后产生
新的文件“pushKey.pem”。
    (4)合并证书和私钥
          将上述新产生的文件合并,在终端输入命令“cat push_developer_cer.pem pushKey.pem > ck.pem”,完成后生成“ck.pem”文件。该文件在服务器与APNS服务器建立连接时,用于验证。
    (5)测试证书是否有效
          测试证书是否有效,在终端中输入“openssl s_client -connect gateway.sandbox.push.apple.com:2195
    -cert push_developer_cer.pem -key pushKey.pem”命令。如若测试成功,会显示大量openssl消息。当你任意键入几个字符时,服务器会提示断开。
 
附:
服务器端测试用例(PHP)
<?php
// Put your device token here (without spaces):
$deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78';
 
// Put your private key's passphrase here:
$passphrase = 'pushchat';
 
// Put your alert message here:
$message = 'My first push notification!';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.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,
       '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;
else
       echo 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);
mac苹果系统测试用例
地址:https://github.com/stefanhafeneger/PushMeBaby (直接将工程中aps_developer_identity文件替换成自己的push SSL证书,将设备令牌写入初始化方法)
 
参考文章:
http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG
/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1
 
http://www.cocoachina.com/bbs/read.php?tid=20723&keyword=apns
 
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12
 
http://www.cocoachina.com/newbie/basic/2010/0401/900.html
 
http://linwwwei.iteye.com/blog/1433189

转:IOS远程推送通知的更多相关文章

  1. iOS 远程推送通知

    1.什么是推送通知 在某些特殊情况下,应用程序被动收到的以不同种界面形式出现的提醒信息 推送通知的作用:可以让不在前台运行的app通知app发生了改变 iOS中得推送通知种类 远程推送通知(Remot ...

  2. IOS 远程推送通知(UIRemoteNotification)

    ●  什么是远程推送通知 ●  顾名思义,就是从远程服务器推送给客户端的通知(需要联网) ●  远程推送服务,又称为APNs(Apple Push Notification Services) ●   ...

  3. iOS 远程推送通知 详解

    1: ios本地通知和远程通知 http://wangjun.easymorse.com/?p=1482 2: 苹果远程通知服务申请激活例图 (外国佬写的.) http://mobiforge.com ...

  4. IOS之推送通知(本地推送和远程推送)

    推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...

  5. IOS远程推送

    IOS远程推送 一.关于推送通知 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的.一般说 ...

  6. iOS远程推送原理及实现过程

    ➠更多技术干货请戳:听云博客 推送通知,是现在的应用必不可少的功能.那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题 ...

  7. iOS远程推送1

    一.APNS 远程推送 1.所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接. 2.长连接:就是只要联网了,就一直建立连接. 3.长连接的作用:时间校准,系统升级,查找我的iPhone. 4. ...

  8. iOS 10推送通知开发

    原文地址:Developing Push Notifications for iOS 10,译者:李剑飞 虽然通知经常被过度使用,但是通知确实是一种获得用户关注和通知他们需要更新或行动的有效方式.iO ...

  9. (七十三)iOS本地推送通知的实现

    iOS的推送通知分为本地推送和网络推送两种,如果App处于挂起状态,是可以发送本地通知的,如果已经被杀掉,则只有定时通知可以被执行,而类似于QQ的那种网络消息推送就无法实现了,因为App的网络模块在被 ...

随机推荐

  1. 阿里云 linux centos 常用解压命令

    格式:  tar  选项  文件目录列表     功能:  对文件目录进行打包备份     选项: -c 建立新的归档文件 -r 向归档文件末尾追加文件 -x 从归档文件中解出文件 -O 将文件解开到 ...

  2. Npgsql使用入门(二)【实用助手类】

    数据库映射的实体类: public class Test { public long TestID { get; set; } public string Name { get; set; } pub ...

  3. JS中数组的一些笔记

    今天工作时碰到一个需求,有两个数组arrayChild, arrayFather, 要求: 1.往数组arrayChild中放入一个元素: 2.将当前的数组arrayChild放入arrayFathe ...

  4. RocketMQ之基本信息

    1.Producer 即消息生产者,负责产生消息,一般由业务系统负责产生消息. 2.Consumer 即消息消费者,负责消费消息,一般是后台系统负责异步消费. 3.Push Consumer Cons ...

  5. RocketMQ之消息中间件需要解决的问题

    消息中间件需要解决哪些问题 1.Publish/Subscribe(发布订阅) 发布订阅是消息中间件最基本的功能 2.Message Priority(消息优先级) 在消息队列中,每条消息都有不同的优 ...

  6. Java基础11一常用类

    1.包装类 byte---java.lang.Byte char---java.lang.Character short—java.lang.Short int---java.lang.Integer ...

  7. 【MFC】虚拟键代码

    一:首先介绍键盘消息 系统消息: ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键. WM_SYSKEYDOWN WM_SYSKEYUP WM_SYSCHAR 非系统消 ...

  8. 写给VC++ Windows开发的初学者 一片不错的博文

    不知不觉2010年都过了半年了,想来我学C语言已经12个年头了(从1998年开始),用VC++也有11年了,最早使用Turbo C2.0 ,也学过汇编,后来使用Borland C++3.0 .Micr ...

  9. window窗口操作

    打开新窗口 window.open([url],[窗口名称],[参数字符串]) window.open("http://baidu.com","_balnk", ...

  10. 分层、链式分析、url、联系的长度

    分层.链式分析.url.联系的长度. 分层结构符合软件处理的工具链性和步骤性: 分层的每一次都是一个节点或步骤: 链式结构普遍存在于自然界,比如食物链: 联系是普遍存在的,不只是两个事物间的联系,而且 ...