ZPush--基于netty4实现的苹果通知推送服务(APNs)Java客户端

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

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

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

  • 对于一台设备,APNs服务器只存储一条Notification,所以如果设备不在线,连续发送多条消息的话,后面的会覆盖前面的;
  • Apple的文档里有提到可以设置Notification的Priority = 5,具体是什么意思不太明白。实际测试是当屏幕关闭,在省电时才会接收到的。如果是屏幕亮着,是不会接收到消息的。而且这种消息是没有声音提示的。貌似意义不大。

特点:

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

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

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

代码地址:

https://github.com/hengyunabc/zpush

例子:

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)Java客户端

时间: 2024-10-13 22:56:44

ZPush--基于netty4实现的苹果通知推送服务(APNs)Java客户端的相关文章

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

1. If APNs attempts to deliver a notification but the device is offline, the notification is stored for a limited period of time, and delivered to the device when it becomes available. 假如用户手机不在线,可能没有信号或者关机吧,APNs会存储转发,等用户在线时再发送 2.Only one recent notif

ZPush--基于netty4实现的苹果通知推送服务(APNs)Javaclient

简单说下实现苹果通知推送服务(APNs)client的一些要注意的地方: 使用长连接: sanboxserver是无用的,调试时直接用"gateway.push.apple.com"域名: 对于错误的Notification.苹果会回应一个Error response.里面有个identifier,在这个identifier之后的Notification全都失败. 因此发送者要缓存已经发送的Notification,最好设置Notification identifier为增长的整数序列

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

前段时间,仔细研究了APNS的文档,把一些关键的地方记录了下来,弄懂这些对于理解APNS的规则,至关重要. 1. If APNs attempts to deliver a notification but the device is offline, the notification is stored for a limited period of time, and delivered to the device when it becomes available. 假如用户手机不在线,可

企业自建的苹果通知推送系统的架构演进与探索

企业的APP开发中,对于苹果设备有个独特的通知推送功能要解决,尤其是在做移动IM时,对APNS(Apple Push Notification Service)的要求比较高,虽然有专门的第三方提供此类服务,但出于安全的考滤,有能力的公司宁愿自建推送服务系统.本人结合工作中的开发经验,在这探讨一下其架构的演进与探索,希望能使此类系统更加完美. IM系统自建苹果通知推送服务系统的层级关系如下: 图1 层级关系 首先说明一下在我工作中APNS的使用场景: 对于最初的解决方案是我入项目组时就已经定好的,

基于Qt移动应用的消息推送服务原理与应用

说到移动应用,大家都觉得移动嘛,当然是Java和Object-c来做啦,什么推送啊,各种系统调用啊,其实不然?如果你了解Qt, 你就知道我说的不然,也有所道理. 说道几点 一.目前Android的移动的消息.通知推送 1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等.而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池. 2)SMS(Push)方式:在Android平

远程通知推送(带java端后台代码)

IOS 基于APNS消息推送原理与实现(JAVA后台) 转自: http://ytwhw.iteye.com/blog/1744148 Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 上图可以分为三个阶段. 第一阶段:Push服务器应用程序把要发

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

http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. 推送流程 3.1 获取设备device_token阶段 3.2 消息推送过程 3.3 完整流程介绍 4. Push机制类型 5. 正式开工 5.1 准备工作 5.2 证书生成 6. 客户端制作 7. php服务器端配置 8. 测试 8. 附录: 8.1 JSON示例 8.2 检验证书是否正确的方法:

苹果pns推送和唤醒

使用的是苹果自己的推送服务器 certificatePath 推送证书 VoipcertificatePath 唤醒证书 certificatePassword 证书密码 以上三项都是需要使用上架了APP store的项目去申请证书,证书申请的步骤找度娘 需要的包 maven <!-- 苹果推送包 -->  <dependency>       <groupId>com.github.fernandospr</groupId>       <artif

基于微信的邮箱新邮件推送

基于微信的邮箱新邮件推送 最近主要做了2个东西: 合肥医保口罩购买预约网站分析 通过微信推送邮箱新邮件来信提醒 第一个因为网站已经下线,当时也没截图,导致想写过程,没素材.所以来写写通过微信推送邮箱的来信提醒. 一.背景 估计有人会问我在手机上登录邮箱账号,邮箱来信不自然能收到提醒吗? 主要是最近小丸子同学的公司邮箱在苹果手机上新邮件推送延迟.经常收到2天前的邮件提醒,如果不进入邮箱app主动收取邮件,根本不知道有邮件过来.对此小丸子同学也是跟我抱怨和很久,一直以为是手机坏了.最后分析了一下,确