tuisong

1.推送过程简介

(1)App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请。若注册成功,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 会被触发,App可以得到deviceToken,该token就是一个与设备相关的字符串.
     (2)App获取到DeviceToken后,将DeviceToken发送给自己的服务端。
     (3)服务端拿到DeviceToken以后,使用证书文件,向苹果的APNS服务器发起一个SSL连接。连接成功之后,发送一段JSON串,该JSON串包含推送消息的类型及内容。
    (4)苹果的APNS服务器得到JSON串以后,向App发送通知消息,使得App的回调函数application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo被调用,App从userInfo中即可得到推送消息的内容。

2. 用到的证书文件及生成过程

(1)certSigningRequest文件,该文件在MAC系统中生成,用于在Apple网站上申请推送证书文件。
         生成过程:
         打开应用程序中的“钥匙串访问”软件,从菜单中选择 “钥匙串访问”-》“证书助理”-》“从证书颁发机构请求证书”,邮箱和名称随便填写,然后选择保存到磁盘,就可以在本地生成一个CertificateSigningRequest.certSigningRequest文件。

(2)注册一个支持push的app id,后面会用到。
        生成过程:
       进入developer.apple.com,选择member center - Certificates, Identifiers & Profiles  -  Identifiers- App Ids,然后选择注册app id,设置appid名称,同时,app id suffix一栏必须选择explicit app id,然后设置bundle id,最后勾选 App Services中的 Push Notifications,这样就可以注册一个支持push的aphid。

(3) 推送证书cer文件,该文件在developer.apple.com中生成,用于生成服务端需要的文件。
        生成过程:
        进入developer.apple.com,选择member center - Certificates, Identifiers & Profiles  -  Certificates,然后选择创建certificate,类型分为Development和Product。这里以Development为例,选择Apple Push Notification service SSL (Sandbox) ,然后下一步,选择之前生成的支持push的AppId,然后下一步,提交之前创建的CSR文件,再下一步就可以生成cer文件,然后保存到本地。

(4)生成服务端使用的证书文件。如果是使用网上的mac 版PushMeBaby工具,在mac机器上进行推送消息的发送,那么有上面的cer文件就够了。如果是使用PHP、java/c#开发自己的服务端,那么还需要将上面的cer文件做一个转换,生成pem文件或者p12文件。

生成php用的pem文件过程为
        首先双击前面保存的cer文件,此时会打开“钥匙串访问”软件,里面会出现一个Apple Development  IOS push services证书,一个公用密钥和一个专用秘钥,秘钥的名称与证书助理中填写的名称一致。
      选中证书,导出为 apns-dev-cert.p12 文件
      选中专有秘钥,导出为apns-dev-key.p12文件
      通过终端命令将这些文件转换为PEM格式:
      openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
      openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
      最后, 需要将两个pem文件合并成一个apns-dev.pem文件,此文件在连接到APNS时需要使用:
      cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

生成java/c#用的p12文件过程为

openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
       openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
       openssl pkcs12 -export -in apns-dev-cert.pem -inkey apns-dev-key.pem -certfile CertificateSigningRequest.certSigningRequest -name "push" -out push.p12

(5)生成XCODE使用的provisioning文件,该文件用于真机调试。
         生成过程:
         进入developer.apple.com,选择member center - Certificates, Identifiers & Profiles  -  Provisioning Profiles,然后选择创建Provisioning  file,接着选择iOS App Development ,下一步选择AppId,选中之前建立的支持push的appid,接着下一步选择支持push的certificate,下一步勾选需要支持的device id,最后一步设置provisioning文件的文件名,这样provisioning文件就生成了。

3. 服务端的开发
     (1)如果只是希望在mac电脑上测试一下消息的推送,可以使用PushMeBaby工具,使用起来比较简单。该工具是开源的,可以从https://github.com/stefanhafeneger/PushMeBaby 下载,代码的执行过程实际上就是设置一下SSL证书,然后连接APNS,接着发送JSON数据。由于要处理SSL逻辑,因此代码稍微多点。在使用工具时,将工程资源中的cer文件替换成自己的cer文件,然后将代码中的deviceToken替换成自己设备的deviceToken即可。

(2)使用php开发服务端
       由于php已经内置了ssl模块,因此使用php连接APNS服务器来发送json的过程实际上是很简单的,代码如下:

该文件可以放到服务器中通过浏览器来访问,也可以通过命令行的方式来解释执行,代码为:$ php -f Pusher.php

<?php $deviceToken= ‘自己的deviceToken‘; //没有空格$body = array("aps" => array("alert" => ‘message‘,"badge" => 2,"sound"=>‘default‘));  //推送方式,包含内容和声音$$ctx = stream_context_create();

//如果在Windows的服务器上,寻找pem路径会有问题,路径修改成这样的方法://$pem = dirname(__FILE__) . ‘/‘ . ‘apns-dev.pem‘;//linux 的服务器直接写pem的路径即可stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");$pass = "xxxxxx";stream_context_set_option($ctx, ‘ssl‘, ‘passphrase‘, $pass);//
//此处有两个服务器需要选择,如果是开发测试用,选择第二名sandbox的服务器并使用Dev的pem证书,如果是正式发布,使用Product的pem并选用正式的服务器$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);
?>

4. 客户端的开发
     (1)下载前面建立的cer文件和provisioning文件,双击,导入到xcode中,在build setting中code signing一栏里选择这两个文件的名称,这样就可以将支持push的app部署到真机中。

(2)处理推送消息
           客户端对推送消息的处理分两种情况:
          一. 在App没有运行的情况下,系统收到推送消息,用户点击推送消息,启动App。此时,不会执行前面提到的          didReceiveRemoteNotification函数,而是在App的applicationDidFinishLaunching函数中处理推送,通过以下代码可以获取推送消息中的数据: NSDictionary *userInfo =[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

二 . 当APP处于前台时,系统收到推送消息,此时系统不会弹出消息提示,会直接触发application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo函数,推送数据在userInfo字典中。

当App处于后台时,如果系统收到推送消息,当用户点击推送消息时,会执行application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo函数,
          此时AppDelegate中函数执行的顺序为:
          applicationWillEnterForeground 
          application:didReceiveRemoteNotification

applicationDidBecomeActiveI

POSTED ON 2014-06-18 16:53 小马歌 阅读(3099) 评论(0)  编辑  收藏 所属分类: JAVA GROOVY

时间: 2024-10-07 10:34:37

tuisong的相关文章

Viewpager实现图片轮播

//-------------主布局文件------------------------------------- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"   

百度链接提交-主动推送Python版

百度目前提供自动提交链接和手动提交链接两种方式,其中自动提交又分为主动推送.自动推送和sitemap三种形式,按百度的说法,主动推送的效果最好,百度站长平台后台也提供了curl.php.ruby的推送示例代码但没有提供python代码,网上很少有现成的python版本主动推送代码(仅有的也有点小问题,需要修改一下),现将目前我正在使用的主动推送python代码贴出. #encoding:utf-8 import httplib def tuisong(): filecontents = open

极光推送 使用实例 (一)服务端

最近一直在做后台开发,但心里还是总惦记着Android,感觉还是Android有意思.正好项目中要用到极光推送,今天抽空来记录下这两天的研究成果. 我们知道iOS有自己的推送服务,但很遗憾Android没有原生的推送服务,现在有很多第三方的推送服务,比如个推.极光.亚马逊.百度云.聚能等.今天我们就来研究下极光推送的后台服务器如何实现. 关键点: 1.首先最好是把极光官网Java后台服务器的demo下载下来,里面有我们需要的jar包,以及example. 2.极光推送的关键jpushClient

20150728

var sg_price_limit; // 报价限制 var selectPicArray = new Array(); //已选择图片列表 /** * 促销车型-图片弹窗车系列表 * @param manufacturerId 页面存放厂商的select标签的ID * @param serialGroupId 页面存放车系的select标签的ID */ //检测字数 function countTxt(val) { var len = val.length; var count = 0; f

百度自动推送js

<!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> <meta charset="UTF-8"> <meta name="Keywords" content="私募.私募基金.阳光私募.私募股权.天玑私募基金.信托.天玑金服.天玑.天玑财富.前海天玑.天玑在线理财"/> <

《友盟推送调到指定界面》

给大家讲一点常识,友盟推送分生产环境和开发环境.用手机刷上去的就是开发环境, 发布到苹果商店就是生产环境,没发布前怎么模拟呢, 用普通账号打的ad hoc 包, 用企业账号打的ad hoc 包或者enterprise包都可以测试生产环境. 开发环境下, 你把APP删掉,重新调试上来,就会生成一个新的device_token了! 收到通知的时候APP的状态可能是未启动.前台活跃(任何界面).后台等三种. 未启动时,点击通知栏启动App, 会在didFinishLaunchingWithOption

JAVA web 使用有盟推送总结

仔细阅读文档,下边的都是废话. 为了省事,iOS和Android 提供了所有了参数,需要那个了修改传参. //ios actionURL为自定义参数 $.ajax({ type : "POST", url:_basePath + "/------.html", data:{"testing":"1","type":"groupcast","title":"推

快递企业如何完成运单订阅消息的推送

原文:快递企业如何完成运单订阅消息的推送 经常网购的朋友,会实时收到运单状态的提醒信息,这些提醒信息包括微信推送,短信推送,邮件推送,支付宝生活窗推送,QQ推送等,信息内容主要包括快件到哪里,签收等信息的提醒,这些友好的提醒信息会极大的增强购物者的体验. 笔者目前正在一家快递企业做这类消费消息的推送功能开发(大部分快递企业都有实现在客户寄完快件后可以主动接收到快递企业的运单状态推送信息),对这部分有一些体会,现分享给大家(大部分功能可能只能通过代码才方便体现出来). 订阅和推送的流程图 一.订阅

电商网站物流快递单号查询api接口申请案例

[场景需求描述] 电商平台及ISV商家对物流api接口的需求有很多,今天我们主要分享的就是快递鸟快递单号查询接口的对接指南,快递单号查询接口对接的应用场景有很多,很多场景会遇到,最主要的就是电商网站用户打开"我的订单"时调用此API显示物流信息详情,电商管理后台的物流系统,客服在对账前查询所有运单的签收状态,并追踪问题,电商平台对商家物流管控,要求必须在多久快递必须发出要看到揽件状态,多久必须收到货物看到签收状态,根据这些状态对商家管控从而提升用户的整体满意度.[对接使用流程] 1.注