1.推送过程简介
1.1、App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请。若注册成功,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 会被触发,App可以得到deviceToken,该token就是一个与设备相关的字符串.
1.2、App获取到DeviceToken后,将DeviceToken发送给自己的服务端。
1.3、服务端拿到DeviceToken以后,使用证书文件,向苹果的APNS服务器发起一个SSL连接。连接成功之后,发送一段JSON串,该JSON串包含推送消息的类型及内容。
1.4、苹果的APNS服务器得到JSON串以后,向App发送通知消息,使得App的回调函数application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo被调用,App从userInfo中即可得到推送消息的内容。
2. 用到的证书文件及生成过程
2.1、
certSigningRequest文件,该文件在MAC系统中生成,用于在Apple网站上申请推送证书文件。
生成过程:
打开应用程序中的“钥匙串访问”软件,从菜单中选择 “钥匙串访问”-》“证书助理”-》“从证书颁发机构请求证书”,邮箱和名称随便填写,然后选择保存到磁盘,就可以在本地生成一个CertificateSigningRequest.certSigningRequest文件。
2.2、
生成过程:
进入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。
2.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文件,然后保存到本地。
2.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
2.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即可。
由于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. 客户端的开发
4.1、下载前面建立的cer文件和provisioning文件,双击,导入到xcode中,在build setting中code signing一栏里选择这两个文件的名称,这样就可以将支持push的app部署到真机中。
4.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
applicationDidBecomeActive
- iOS推送证书转pem文件
iOS推送证书转 .pem文件. 推送证书转pem文件openssl x509 -in apns_miaobozhibo.cer -inform der -out apns_miaobozhibo.p ...
- 极光推送小结 - iOS
此次即友盟分享小结(友盟分享小结 - iOS)之后对推送也进行了一版优化.此次分享内容依然基于已经成功集成 SDK 后 code 层级部分. 注:此次分享基于 SDK 3.1.0,若版本相差较大,仅供 ...
- ios 推送 证书配置
S的推送证书,有有效期限制,一般为一年.当我们证书过期的时候,就需要重新生成证书了.有一段时间没有上苹果网站了,昨天上去一看,此奥,改版了,下边我们将重新生成一个正式环境的push推送的证书. 1.先 ...
- iOS 推送证书的制作
关于iOS推送证书的P12文件,并非直接从KeyChain导出来的证书文件.而是须要经过openSSL工具制作的.(好在Mac OS 默认就有openSSL命令) 针对不同的Server平台,须要的证 ...
- iOS推送证书上传(转)
iOS 推送证书制作(JAVA/PHP) 在使用Java或者PHP制作iOS推送服务器的时候,需要自己从开发者网站上导出的aps_developer_identity证书和Apple Developm ...
- IOS 推送-客户端处理推送消息
IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...
- iOS——关于创建真机调试证书(发布证书,测试(调试)证书,推送调试证书)、iOS开发者账号申请 请用开发者账号去iTunes connect 查看状态
- iOS推送证书从申请到使用
关于这个话题,已经有非常多写的非常好的文章了.可是,在自己做的过程中,即使别人写的已经非常好了,还是会遇到这样那样的问题. 自己还是再写一遍吧. 本文记录了从无到有申请证书,到最后可以发出通知.当然, ...
- IOS 推送消息 php做推送服务端
IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPh ...
随机推荐
- 【BZOJ-2597】剪刀石头布 最小费用最大流
2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1016 Solved: ...
- vs中使用beyondcompare比较
开启 Visual Studio 的 [工具] /[选项] / [源代码管理] /[Visual Studio Team Foundation],并开启「配置用户工具」 如下图单击「添加」按钮 接着 ...
- python gettitle.py
#!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...
- windows多线程编程实现 简单(1)
内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...
- Struts2之开山篇
①Struts2是什么? Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图 ...
- iPhone屏幕尺寸/launch尺寸/icon尺寸
屏幕尺寸 6p/6sp 414 X 736 6/6s 375 X 667 5/5s 320 X 568 4/4s 320 X 480 la ...
- Eclipse MySQL Hibernate 中文乱码问题
如果是Eclipse的问题,那就对以下各项进行设置,即可排除问题. 设置eclipse相关编码为UTF-8: 修改工作区默认编码,位置:windows--perferences--general--w ...
- lcov和gcov的使用错误
编译使用的gcc版本和gcov的版本对不上的话,使用lcov和gcov的时候会报错 lcov的错误: [xx@localhost XXX]$ lcov --capture --directory co ...
- C# Async, Await and using statements
Async, Await 是基于 .NEt 4.5架构的, 用于处理异步,防止死锁的方法的开始和结束, 提高程序的响应能力.比如: Application area Support ...
- 各大浏览器内核介绍(Rendering Engine)
在介绍各大浏览器的内核之前,我们先来了解一下什么是浏览器内核. 所谓浏览器内核就是指浏览器最重要或者说核心的部分"Rendering Engine",译为"渲染引擎&qu ...