苹果pns推送和唤醒

使用的是苹果自己的推送服务器

certificatePath 推送证书

VoipcertificatePath 唤醒证书

certificatePassword 证书密码

以上三项都是需要使用上架了APP store的项目去申请证书,证书申请的步骤找度娘

需要的包

maven

<!-- 苹果推送包 -->
  <dependency>
       <groupId>com.github.fernandospr</groupId>
       <artifactId>javapns-jdk16</artifactId>
       <version>2.4.0</version>
  </dependency>

private static  String certificatePath="E:/apache-tomcat-7.0.37/webapps/EstateService/IOSApp推送证书.p12";   //iOS开发者证书路径,证书有发布证书和测试证书
 private static  String VoipcertificatePath="E:/apache-tomcat-7.0.37/webapps/EstateService/Voip推送证书.p12";   //iOS唤醒证书
 private static  String certificatePassword="123456"; //证书密码
 private static  boolean production=false;  //表示的是产品发布推送服务 false:表示的是产品测试推送服务
 private static  String VoipAppleUrl="gateway.sandbox.push.apple.com";  //唤醒服务器地址 测试服务器路径:gateway.push.apple.com  发布产品服务器路径:gateway.sandbox.push.apple.com
 private static  int port=2195;  //唤醒服务器地址ip

/**
  * 推送一个简单消息
  * @param msg
  * @param devices
  * @throws CommunicationException
  * @throws KeystoreException
  */
 public void pushMsgNotification(String msg,List<String> tokens) throws CommunicationException, KeystoreException{
  List<Device> devices = new ArrayList<Device>();
      for (String token : tokens){
         try {
    devices.add(new BasicDevice(token));
   } catch (InvalidDeviceTokenFormatException e) {
    e.printStackTrace();
   }
      }
  //推送返回结果集
  List<PushedNotification> notifications = new ArrayList<PushedNotification>();
        notifications= Push.alert(msg, certificatePath, certificatePassword, production, devices);
        //获取失败结果集
  List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);
  //获取成功结果集
        List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);
        int failed = failedNotifications.size(); //推送失败数
        int successful = successfulNotifications.size(); //推送成功数
        System.err.println("tokens:"+tokens);
        System.err.println("失败:"+failedNotifications);
        System.err.println("苹果推送失败:"+failed+"条");
        System.err.println("苹果推送成功:"+successful+"条");
 }
 
 /**
  * 推送一个alert+badge+sound通知或设备唤醒推送
  * @param tokens IOS tokens集合
  * @param msg 推送消息
  * @param badge 图标小红圈的数值
  * @param sound 铃音
  * @param isVoip  1:true唤醒推送  2:false消息推送
  */
 public void iOSpush(List<String> tokens,String msg,Integer badge,String sound,boolean isVoip){
  try
      {
          PushNotificationBigPayload payLoad = new PushNotificationBigPayload();
          payLoad.addAlert(msg); // 消息内容
          payLoad.addBadge(badge); // iphone应用图标上小红圈上的数值
          payLoad.addSound(StringUtils.defaultIfEmpty(sound, "default"));//铃音
          PushNotificationManager pushManager = new PushNotificationManager();
          //true:表示的是产品发布推送服务 false:表示的是产品测试推送服务
          if(isVoip){
           pushManager.initializeConnection(new AppleNotificationServerBasicImpl(VoipcertificatePath, certificatePassword, ConnectionToAppleServer.KEYSTORE_TYPE_PKCS12, VoipAppleUrl, port));
          }else{
           pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificatePath, certificatePassword, production));
          }
          List<PushedNotification> notifications = new ArrayList<PushedNotification>();
          // 发送push消息
          if (tokens.size()==1&&tokens.size()>0){
              Device device = new BasicDevice();
              device.setToken(tokens.get(0));
              PushedNotification notification = pushManager.sendNotification(device, payLoad, true);
              notifications.add(notification);
          }else{
              List<Device> device = new ArrayList<Device>();
              for (String token : tokens){
                  device.add(new BasicDevice(token));
              }
              notifications = pushManager.sendNotifications(payLoad, device);
          }
          List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);
          List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);
          int failed = failedNotifications.size(); //推送失败数
          int successful = successfulNotifications.size(); //推送成功数
          System.err.println("tokens:"+tokens);
          System.err.println("失败:"+failedNotifications);
          System.err.println("苹果推送失败:"+failed+"条");
          System.err.println("苹果推送成功:"+successful+"条");
          pushManager.stopConnection();
      }
      catch (Exception e)
      {
          e.printStackTrace();
      }
 }
 
  /**
     * 推送自定义负载
     * @param tokens集合
     * @param msg 推送消息
     * @param badge 图标小红圈的数值
     * @param sound 声音
     * @param map 扩展消息
     * @throws JSONException
     * @throws CommunicationException
     * @throws KeystoreException
     */
    public  void pushPayload(List<String> tokens, String msg,Integer badge,String sound,Map<String,String> map) throws JSONException, CommunicationException, KeystoreException{
     PushNotificationBigPayload payload = customPayload(msg, badge, sound, map);
        List<Device> devices = new ArrayList<Device>();
        for (String token : tokens){
            try {
    devices.add(new BasicDevice(token));
   } catch (InvalidDeviceTokenFormatException e) {
    e.printStackTrace();
   }
        }
        List<PushedNotification> notifications = new ArrayList<PushedNotification>();
        notifications= Push.payload(payload, certificatePath, certificatePassword, production, devices);
        List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);
        List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);
        int failed = failedNotifications.size(); //推送失败数
        int successful = successfulNotifications.size(); //推送成功数
        System.err.println("tokens:"+tokens);
        System.err.println("失败:"+failedNotifications);
        System.err.println("苹果推送失败:"+failed+"条");
        System.err.println("苹果推送成功:"+successful+"条");
    }
    /**
     * 推送自定义唤醒负载
     * @param tokens集合
     * @param msg 推送消息
     * @param badge 图标小红圈的数值
     * @param sound 声音
     * @param map 扩展消息
     * @throws JSONException
     * @throws CommunicationException
     * @throws KeystoreException
     */
    public  void voippushPayload(List<String> tokens, String msg,Integer badge,String sound,Map<String,String> map) throws JSONException, CommunicationException, KeystoreException{
     try {
       //封装扩张消息
       PushNotificationBigPayload payload = customPayload(msg, badge, sound, map);
       //创建Devices集合存放,设备
       List<Device> devices = new ArrayList<Device>();
       for (String token : tokens){
       devices.add(new BasicDevice(token));
       }
       //iOS推送
       PushNotificationManager pushManager = new PushNotificationManager();
         //推送方式
         pushManager.initializeConnection(new AppleNotificationServerBasicImpl(VoipcertificatePath, certificatePassword, ConnectionToAppleServer.KEYSTORE_TYPE_PKCS12, VoipAppleUrl, port));
         //存放推送放回对象集合
         List<PushedNotification> notifications = new ArrayList<PushedNotification>();
         // 发送push消息
          notifications = pushManager.sendNotifications(payload, devices);
       List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);
       List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);
       int failed = failedNotifications.size(); //推送失败数
       int successful = successfulNotifications.size(); //推送成功数
       System.err.println("tokens:"+tokens);
       System.err.println("失败:"+failedNotifications);
       System.err.println("苹果推送失败:"+failed+"条");
       System.err.println("苹果推送成功:"+successful+"条");
      } catch (InvalidDeviceTokenFormatException e) {
    e.printStackTrace();
   }
    }
 
  /**
     * 自定义负载
     * @param msg
     * @param badge
     * @param sound
     * @param map 自定义字典
     * @return
     * @throws JSONException
     */
    private  PushNotificationBigPayload customPayload(String msg,Integer badge,String sound,Map<String,String> map) throws JSONException{
     PushNotificationBigPayload payload = PushNotificationBigPayload.complex();
        if(StringUtils.isNotEmpty(msg)){
            payload.addAlert(msg);        
        }
        if(badge != null){        
            payload.addBadge(badge);
        }
        payload.addSound(StringUtils.defaultIfEmpty(sound, "default"));
        if(map!=null && !map.isEmpty()){
            Object[] keys = map.keySet().toArray();   
            Object[] vals = map.values().toArray();
            if(keys!= null && vals != null && keys.length == vals.length){
                for (int i = 0; i < map.size(); i++) {                 
                    payload.addCustomDictionary(String.valueOf(keys[i]),String.valueOf(vals[i]));
                }
            }
        }
        return payload;
    }

时间: 2024-10-11 20:54:51

苹果pns推送和唤醒的相关文章

.net C# 苹果消息推送 工具类

public class AppleAPNSMessage { /// <summary> /// 苹果信息推送 证书 路径(注意测试版跟正式发布版证书上不一样) /// </summary> private static string cerPath = ConfigurationManager.AppSettings["CerPath"]; /// <summary> /// 苹果推送服务 密码 /// </summary> priv

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

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

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

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

手把手教你配置苹果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 检验证书是否正确的方法:

苹果通知推送服务(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

PHP 苹果消息推送

/* * 苹果消息推送方法 * $deviceToken 苹果设备token * $message 消息内容 */ function iosmsg_send($deviceToken,$message){ $message = strlen($message)>40?mb_substr($message,0,40,'utf-8'):$message; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'l

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

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

最新苹果相册推送短信

最新苹果相册推送短信[电薇:132-4684-7730][Q群682789101]德国今夏现罕见热浪 专家:酷暑30年后将成为常态攀上×××妻子的女副市长被判刑 给自己立耻辱碑韦德深情发文致敬科比 讲了一段二十年的故事韩前总理出书:全盘推翻朴槿惠政府政策不合适美国国家安全顾问:不让伊朗有核武是最重要任务1651万女得主被人暴揍住院 中奖后厄运没停过深圳最严知识产权保护制度 失信违法者将寸步难行自如甲醛超标还想"封口" 这样的套路很没底线一言不合就离婚?以后可能没那么容易了日自民党通过防

苹果日历推送短信设备价格

苹果日历推送短信设备价格[电薇:132乄8688乄4109][Q群780516296]王毅:共建"一带一路"是坚持多边主义的重要标志权健因高速堵车没赶上赴日本的飞机 滞留首都机场美媒称美国正在犯战争罪:别再支持沙特对也门轰炸美国正式重启第二舰队剑指巴伦支海 封锁俄潜艇力量摩根士丹利:若欧元反弹持续 欧洲银行股应该会跟上来统计局摸底二孩政策效果 多地建议强化鼓励政策兰州机场回应"天价牛肉面":最贵78元是套餐高通:新款旗舰芯片将支持5G 7nm工艺日防卫省证实在研电磁