简单说下实现苹果通知推送服务(APNs)client的一些要注意的地方:

  • 使用长连接;
  • sanboxserver是无用的,调试时直接用“gateway.push.apple.com”域名;
  • 对于错误的Notification。苹果会回应一个Error response。里面有个identifier,在这个identifier之后的Notification全都失败。

因此发送者要缓存已经发送的Notification,最好设置Notification identifier为增长的整数序列,当收到Error response里,从缓存里取出比Error response的identifier要大的Notification,再次又一次发送。

  • 对于一台设备,APNsserver仅仅存储一条Notification。所以假设设备不在线。连续发送多条消息的话。后面的会覆盖前面的;
  • Apple的文档里有提到能够设置Notification的Priority = 5,详细是什么意思不太明确。实际測试是当屏幕关闭,在省电时才会接收到的。假设是屏幕亮着,是不会接收到消息的。并且这样的消息是没有声音提示的。貌似意义不大。

特点:

  • 支持第三版通知推送,即command = 2。眼下的绝大部分Javaclient都仅仅支持command = 1,即第二版。
  • 支持SSL握手成功才返回,能够调用 pushManager.start().sync(); 等待握手成功。
  • 最大限度重试发送,内部自己主动处理重连,错误重发机制;
  • 支持配置RejectListener,即通知被Appleserver拒绝之后的回调接口;
  • 支持配置ShutdownListener,即当shutdown时,没有发送完的消息处理的回调接口。
  • 支持发送统计信息;
  • 实现组件分离,能够利用PushClient。FeedbackClient来写一些灵活的代码。
  • Notification发送者能够自定义设置发送的Queue,自己灵活处理堵塞。超时等问题。

把Queue暴露给发送者,这严格来说是一个不好的设计。由于在shutdown里,有可能别的线程还在put notification到queue里。

可是由于APNs协议本身,包含消息推送机制本身就是一个不全然靠谱的东东。考虑到发送者处理堵塞,消息积压的便利性,因此把Queue暴露给发送者。


代码地址:
样例:
public class MainExample {
public static void main(String[] args) throws InterruptedException {
Environment environment = Environment.Product;
String password = "123456";
String keystore = "/home/hengyunabc/test/apptype/app_type_1/productAPNS.p12";
PushManager pushManager = new PushManagerImpl(keystore, password, environment); //set a push queue
BlockingQueue<Notification> queue = new LinkedBlockingQueue<Notification>(8192);
pushManager.setQueue(queue ); //waiting for SSL handshake success
pushManager.start().sync(); //build a notification
String token = "5f6aa01d8e3358949b7c25d461bb78ad740f4707462c7eafbebcf74fa5ddb387";
Notification notification = new NotificationBuilder()
.setToken(token)
.setBadge(1)
.setPriority(5)
.setAlertBody("xxxxx").build(); //put notification into the queue
queue.put(notification); TimeUnit.SECONDS.sleep(10); //get statistic info
Statistic statistic = pushManager.getStatistic();
System.out.println(statistic);
}
}

ZPush--基于netty4实现的苹果通知推送服务(APNs)Javaclient的更多相关文章

  1. 苹果通知推送服务(APNS)一些关键特性摘要

    http://ramosli.iteye.com/blog/1940843 前段时间,仔细研究了APNS的文档,把一些关键的地方记录了下来,弄懂这些对于理解APNS的规则,至关重要. 1. If AP ...

  2. 苹果通知推送服务(APNS)关键特性摘要

    1. If APNs attempts to deliver a notification but the device is offline, the notification is stored ...

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

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

  4. 手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客

    http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. ...

  5. 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

    1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...

  6. 消息推送之APNS

    利用APNS进行消息推送 原理 APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. APNS推送可以分为三个阶段: 第一阶 ...

  7. Android推送服务——百度云推送

    一.推送服务简介 消息推送,顾名思义,是由一方主动发起,而另一方与发起方以某一种方式建立连接并接收消息.在Android开发中,这里的发起方我们把它叫做推送服务器(Push Server),接收方叫做 ...

  8. .NET向APNS苹果消息推送通知

    一.Apns简介: Apns是苹果推送通知服务. 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备):然后,将服务器的信息接收并且 ...

  9. iOS - Push 通知推送

    1.UserNotifications 通知是 App 用来和用户交流的一种方式,特别是当 App 并没有在前台运行的时候.通知,正如它的名称所强调的,被用作向用户'通知'一个事件,或者仅仅向用户提示 ...

随机推荐

  1. GoLang 编译exe添加ICO图标

    我们在做Go开发的时候在Window平台下编译出来的exe后大部分都是没有图标,看起来很难看.下面我们说下如何添加一个图标. 1.首先在根目录下,exe的同级目录下创建.rc文件, IDI_ICON1 ...

  2. POJ 1873 计算几何

    思路: 二进制枚举一下要删哪些点 求个凸包,算一下贡献 //By SiriusRen #include <cmath> #include <cstdio> #include & ...

  3. 【BZOJ4241】历史研究(回滚莫队)

    题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本 ...

  4. Wannafly挑战赛19 A-队列Q

    题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi 表示.Q1 表示队头元素,QN 表示队尾元素.队列中的元素是 N 的一个全排列. ZZT 需要在这个队 ...

  5. Unity学习-鼠标的常用操作(八)

    本次主要介绍5个鼠标事件 void OnMouseEnter():鼠标进入 void OnMouseExit():鼠标移出 void OnMouseDown():鼠标点击 void OnMouseUp ...

  6. 6.11---swagger文件上传的写法【照着写就行了,主要是需要声明contentType未mutilpart---如果不设置这个,就无法识别文件的】

    MultipartFile 是直接接收前台传过来的文件,File是抽象出来的文件对象,用来表示文件,一般操作都是操作的File,所以需要将MultipartFile转为File controller写 ...

  7. JVM之旅------jvm内存模型

    JVM内存管理机制 Java与C++之间有一堆由内存动态分配与垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. —— <深入理解Java虚拟机:JVM高级特性与最佳实践> ...

  8. js加减乘除在线计算器代码

    js加减乘除在线计算器代码 在线演示本地下载

  9. JS——思维拓展

    1.阶乘求和:4的阶乘是1*2*3*4 <script> function jiechen(value) { var n = 1; for (var i = 1; i <= valu ...

  10. windows ping 某个网段,不能运行指定的软件

    windows ping 某个网段,不能运行指定的软件 :begin @echo OFF color 0a Title Net Test Tool by:HRuinger Mode con cols= ...