关于消息推送的补充,主要介绍服务端的实现,包含object c 版本 c 版本 java 版本 php 版本 (转)
要实现消息推送功能,我们可以采用第三方(腾讯:信鸽;百度:云推送;极光推送;友盟);当然,因为各种原因,我们不能使用第三方的推送服务,那我们就需要自己编写服务端。在网上寻觅了很久,找到一篇很不错的讲解消息推送的文章,包含(object c 版本 c 版本 java 版本 php 版本)的后端实现,分享之。
原文地址:http://tanqisen.github.io/blog/2013/02/27/ios-push-apns/
一步一步实现iOS应用PUSH功能
FEB 27TH, 2013
1. push原理
iOS push 工作机制可以用下图简要概括
Provider
:应用自己的服务器;APNS
:Apple Push Notification Service的简称,苹果的PUSH服务器;
push的主要工作流程是:
- iOS设备连接网络后,会自动与APNS保持类似TCP的长链接,等待APNS推送消息的到来;
- 应用启动时注册消息推送,并获取设备的在APNS中注册的唯一设备标示deviceToken上传给应用服务器(即Provider);
- 在需要给应用推送消息时,Provider把push内容、接收push消息的deviceToken按APNS指定的格式打包好,发送给APNS;
- APNS收到Provider发送的消息后,查找deviceToken指定的设备,如果该设备已经和APNS建立了连接,则立即将消息推送给该设备,如果设备不在线,则在该设备下次连接到APNS后将消息推送到设备。请注意苹果并不保证推送一定成功;
- 设备收到push消息后,iOS系统会根据SSL证书判断这个push消息是发给那个应用的,进而启动相应客户端。
上述过程中,有两个关键步骤需要自己处理的是:1.客户端获取deviceToken,并上传到Provider;2.Provider发送push消息到APNS。这两个步骤中都需要苹果的push证书授权,下面就来介绍如何生成push证书,以及Provisioning Profile。
2. push证书及Provisioning Profile生成
生成push证书前要先生成开发证书
生成开发证书的过程不详细介绍,可以参考如何联机调试和发布程序。只是有一点需要注意的,生成开发证书过程中需要通过Keychain生成一个CSR文件,默认名为CertificateSigningRequest.certSigningRequest,这个文件将在生成push证书的时候用到。
创建一个App ID
- 创建过程中Description可以任意填写,比如叫
push_demo
; - Bundle Identifier一般用
com.company.appname
这样的格式,例如com.mycompany.demo
;
注意:要用push功能的Bundle Identifier一定不能出现通配符,比如
com.mycompany.*
,这样的名字是不能使用push的。- 创建过程中Description可以任意填写,比如叫
生成Push SSL Certificate
生成好App ID后点击
Configure
进入配置页。打开Enable for Apple Push Notification service
选项,该选项下有Development Push SSL Certificate
和Production Push SSL Certificate
两个SSL Certificate可以配置,前面一个是用来的开发的push证书,后面一个是用来发布的。我们以开发push证书为例,点击Development Push SSL Certificate
->Configure
,后面会要求选择CSR文件,这就是生成开发证书时的CertificateSigningRequest.certSigningRequest文件,选择好CSR后就生成好相应的SSL Certificate了。下载下来,保存名为aps_developer.cer
。从Keychain中导出私钥、设置好密码,命名为private_key.p12
生成push证书
这时我们一共得到3个文件:
- CertificateSigningRequest.certSigningRequest
- private_key.p12
- aps_developer.cer
将aps_developer.cer转成pem格式
openssl x509 -in aps_developer.cer -inform DER -out aps_developer.pem -outform PEM
将private_key.p12格式的私钥转换成private_key.pem
openssl pkcs12 -nocerts -out private_key.pem -in private_key.p12
这一步会要求输入p12私钥的密码,以及设置新生成的pem的密码。
创建用于服务端的SSL p12格式证书,命名为aps_developer.p12
openssl pkcs12 -export -in aps_developer.pem -inkey private_key.pem -certfile CertificateSigningRequest.certSigningRequest -name "aps_developer" -out aps_developer.p12
这一步会要求输入private_key.pem的密码,注意不是private_key.p12的密码。如果密码错误,或者CertificateSigningRequest.certSigningRequest文件不匹配都不能正常生成aps_developer.p12文件,如果生成的aps_developer.p12文件大小是0,说明生成过程中出了问题,请检查pem私钥、密码、以及CertificateSigningRequest.certSigningRequest是否正确。
aps_developer.p12就是Provider向APNS发送push消息需要的SSL证书。把这个证书和密码提供给服务端,服务端就可以发送push消息给APNS了。这时服务端已经可以工作了,但客户端还必须配置相应的Provisioning Profile才能启动应用的push功能。
服务器配置需注意的是,由于我们生成的是开发环境的push证书,所以服务器应该连接APNS的sandbox环境地址:
gateway.sandbox.push.apple.com:2195
,如果应用正式发布,就要连接正式环境,必须生成相应的发布证书,并连接APNS正式环境地址:gateway.push.apple.com:2195
。
生成Provisioning Profile
- 新建Profile,命名为push_dev;
- 选择相应证书;
- App ID选择push_demo;
- 选择设备;
- 下载并安装该Profile供开发使用;
3. Xcode证书设置、Info.plist设置
- 用Xcode打开客户端工程,设置Info.plist的Bundle identifier为
com.mycompany.demo
。 - 打开工程设置,必须将证书设置为与push_dev关联的证书。
4. 客户端获取deviceToken
服务端要发送push消息给某一设备还必须知道该设备的deviceToken。应用运行后获取到deviceToken,然后上传给服务器,下面介绍应用如何获取deviceToken。应用必须先注册使用push功能。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];
// do something
// ...
}
在AppDelegate中添加下面方法来获取deviceToken:
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
NSLog(@"%@", token);
} - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"%@", error);
}
应用获取到deviceToken后,上传给Provider,Provider就可以用这个deviceToken给这个设备push消息了。
5. Payload格式及自定义数据
服务器配置好证书并拿到deviceToken后就可以向APNS发送消息了。发送消息的格式如下图所示:
Payload就是push的消息负载,这就是应用需要关心的数据。 Payload是一个JSON字典,最大值是 256 字节,超过这个限制,APNS将拒绝转发。基本格式如下:
{
"aps": {
"alert":"Hello Push!",
"badge":,
"sound":"default"
},
"page":"home"
}
必须包含aps
键值。badge
表示应用程序图标显示的数字,sound
表示收到push的提示音。 Payload的具体结构参考Apple Push Notification Service
要在这个结构中新增自定义数据,请加在aps空间之外。比如后台推送消息给应用同时要求应用打开某个页面:
后台告诉客户端收到这个push后打开应用的主页,这里的page、home都是自己定义的。必须注意的是,Payload大小不能超过限制,所以可以把自定义数据更简化点,比如可以把home与编号1对应,page简写为p,这样"p":1
表示打开主页,可以缩小Payload的大小。
6. 客户端接收push消息
iOS系统收到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);
}
目前为止,push功能基本就完成了,可以开始push功能测试了,如果服务器还没开发完成,或者想快速测试是否能正常push,可以使用下面的代码实现后台push测试。发送push前要配置好SSL证书,以及deviceToken和Payload结构。
还有个小问题,当Payload设置了badge,应用图标上将一直显示一个数字提示,如果要清除数字提示,或者设置成其他数字,调用下面函数就可以完成。
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:number];
number为0就会清除数字提示。
关于消息推送的补充,主要介绍服务端的实现,包含object c 版本 c 版本 java 版本 php 版本 (转)的更多相关文章
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
- 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)
1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...
- android基于XMPP的消息推送机制
关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的 ...
- WinForm中 Asp.Net Signalr消息推送测试实例
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- C# BS消息推送 SignalR介绍(一)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...
- APNS IOS 消息推送JSON格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面积累了我在进行apns推送时候总结的 apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...
- 实现web消息推送的技术和采用长轮询corundumstudio介绍
实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推 ...
- Android 生态消息推送平台介绍
一.手机厂商平台 华为消息推送服务 华为推送(Push)是为开发者提供的消息推送平台,建立了从云端到手机端的消息推送通道,使应用可以将最新信息及时通知用户,从而构筑良好的用户关系,提升用户的感知和活跃 ...
- iOS 之消息推送(个推)---个人小结
前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...
随机推荐
- 微服务架构下分布式事务解决方案——阿里云GTS
https://blog.csdn.net/jiangyu_gts/article/details/79470240 1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这 ...
- 【spring】bean加载顺序
问题来源 有一个bean为A,一个bean为B.想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值. 如果只是在A里单纯的写着: private B b; private S ...
- Python之路番外:PYTHON基本数据类型和小知识点
Python之路番外:PYTHON基本数据类型和小知识点 一.基础小知识点 1.如果一行代码过长,可以用续行符 \换行书写 例子 if (signal == "red") and ...
- eclipse创建Java项目时提示Open Associated Perspective?
在eclipse中,原先使用python进行编程,需要新建java项目时,会提示如下信息: 消息框内翻译如下: Open Associated Perspective? --开放关联视角? This ...
- 基于python-opencv3的图像显示和保存操作
import cv2 as cv import numpy as np #导入库 print("------------------------ ...
- [集合]线程安全的HashMap
一.一般模式下线程安全的HashMap 默认情况常用的HashMap都是线程不安全的,在多线程的环境下使用,常常会造成不可预知的,莫名其妙的错误.那么,我们如何实现一个线程安全的HashMap呢?其中 ...
- postgress数据库 出现大写字母 字段名但是提示说不存在
select BSK001 from dbdata 报错: column "bsk001" of relation "dbdata" does not exis ...
- JAVA GET 和 POST 的区别
GET 和 POST 的区别 GET请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?name1=value1&name2=val ...
- javascript JSON. 转换 注意事项
JSON.stringify() 会舍弃 方法..只有属性才会转换成 json 字符串,所以 用 JSON.stringify()=='{}' 来判断对象是否为空 是错误的!!!! 正确的做法 是 ...
- Hero
Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Description When pl ...