极光推送

Posted 咩咩文

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了极光推送相关的知识,希望对你有一定的参考价值。

  1. 引入maven依赖
      <!--引入jpush核心依赖-->
            <dependency>
                <groupId>cn.jpush.api</groupId>
                <artifactId>jpush-client</artifactId>
                <version>3.3.4</version>
            </dependency>
            <dependency>
                <groupId>cn.jpush.api</groupId>
                <artifactId>jiguang-common</artifactId>
                <version>1.1.1</version>
            </dependency>
            <dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-all</artifactId>
                <version>4.1.6.Final</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.3</version>
            </dependency>
    
    2.创建消息推送接口
    package component.invoker.manager.push;
    
    import cn.jpush.api.push.model.PushPayload;
    import component.invoker.domain.wrapper.message.PushMessage;
    /**
     * @author wangbowen
     * @description 个推消息接口 https://www.cnblogs.com/shena/p/6594091.html
     * @Date 2018/5/14
     * @since 1.0.0
     */
    public interface PushMessageExecutor 
        /**
         * 推送给设备标识参数的用户
         * @param message 消息对象
         * @return int 0 推送失败 1 推送成功
         */
        int sendToRegistrationId(PushMessage message);
    
        /**
         * 推送给所有的安卓用户
         * @param message 消息对象
         * @return int 0 推送失败 1 推送成功
         */
        int sendToAllandroid(PushMessage message);
    
        /**
         * 推送给所有的ios用户
         * @param message 消息对象
         * @return int 0 推送失败 1 推送成功
         */
        int sendToAllIos(PushMessage  message);
    
        /**
         * 推送给安卓和IOS用户
         * @param message 消息对象
         * @return int 0 推送失败 1 推送成功
         */
        int sendToAll(PushMessage message);
    
        /**
         *推送通知消息给安卓和IOS
         * @param message 消息对象
         * @return PushPayload
         */
        PushPayload buildPushObjectAndroidAndIos(PushMessage message);
    
        /**
         *推送消息通知给所有设备标识参数的用户
         * @param message
         * @return PushPayload
         */
        PushPayload buildPushObjectAllRegistrationIdAlertWithTitle(PushMessage message);
    
        /**
         * 推送通知消息给Android
         * @param pushMessage 消息对象
         * @return
         */
        PushPayload  buildPushObjectAndroidAllAlertWithTitle(PushMessage pushMessage);
        /**
         *推送通知消息给IOS
         * @param message
         * @return PushPayload
         */
        PushPayload buildPushObjectIosAllAlertWithTitle(PushMessage message);
    
    
    3.消息推送实现接口
    package component.invoker.manager.push.support;
    
    import cn.jiguang.common.resp.APIConnectionException;
    import cn.jiguang.common.resp.APIRequestException;
    import cn.jpush.api.JPushClient;
    import cn.jpush.api.push.PushResult;
    import cn.jpush.api.push.model.Message;
    import cn.jpush.api.push.model.Options;
    import cn.jpush.api.push.model.Platform;
    import cn.jpush.api.push.model.PushPayload;
    import cn.jpush.api.push.model.audience.Audience;
    import cn.jpush.api.push.model.notification.AndroidNotification;
    import cn.jpush.api.push.model.notification.IosNotification;
    import cn.jpush.api.push.model.notification.Notification;
    import component.invoker.domain.wrapper.message.PushMessage;
    import component.invoker.manager.push.PushMessageExecutor;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    
    
    /**
     * @author wangbowen
     * @description 推送实现接口
     * @Date 2018/5/14
     * @since 1.0.0
     */
    @Component
    @EnableConfigurationProperties(MessageProperties.class)
    public class PushMessageExecutorSupport implements PushMessageExecutor 
        private Logger logger = LoggerFactory.getLogger(PushMessageExecutorSupport.class);
        @Resource
        private MessageProperties messageProperties;
    
    
        @Override
        public int sendToRegistrationId(PushMessage message) 
            int result = 0;
            try 
                PushPayload pushPayload= this.buildPushObjectAllRegistrationIdAlertWithTitle(message);
                logger.info("服务器返回推送对象:"+pushPayload);
                PushResult pushResult=this.pushClient().sendPush(pushPayload);
                logger.info("服务端推送结果:"+pushResult);
                if(pushResult.getResponseCode()==200)
                    result=1;
                
             catch (APIConnectionException e) 
                e.printStackTrace();
    
             catch (APIRequestException e) 
                e.printStackTrace();
            
    
            return result;
        
    
        @Override
        public int sendToAllAndroid(PushMessage message) 
            int result = 0;
            try 
                PushPayload pushPayload= this.buildPushObjectAndroidAllAlertWithTitle(message);
                logger.info("服务器返回推送对象:"+pushPayload);
                PushResult pushResult=this.pushClient().sendPush(pushPayload);
                logger.info("服务端推送结果:"+pushResult);
                if(pushResult.getResponseCode()==200)
                    result=1;
                
             catch (Exception e) 
    
                e.printStackTrace();
            
    
            return result;
        
    
        @Override
        public int sendToAllIos(PushMessage message) 
            int result = 0;
            try 
                PushPayload pushPayload= this.buildPushObjectIosAllAlertWithTitle(message);
                logger.info("服务器返回推送对象:"+pushPayload);
                PushResult pushResult=this.pushClient().sendPush(pushPayload);
                logger.info("服务端推送结果:"+pushResult);
                if(pushResult.getResponseCode()==200)
                    result=1;
                
             catch (Exception e) 
    
                e.printStackTrace();
            
    
            return result;
        
    
        @Override
        public int sendToAll(PushMessage message) 
            int result = 0;
            try 
                PushPayload pushPayload= this.buildPushObjectAndroidAndIos(message);
                logger.info("服务器返回推送对象:"+pushPayload);
                PushResult pushResult=this.pushClient().sendPush(pushPayload);
                logger.info("服务端推送结果:"+pushResult);
                if(pushResult.getResponseCode()==200)
                    result=1;
                
             catch (Exception e) 
                e.printStackTrace();
            
    
            return result;
        
    
        @Override
        public PushPayload buildPushObjectAndroidAndIos(PushMessage message) 
            logger.info("---------------buildPushObjectAndroidAndIos--------");
            return PushPayload.newBuilder()
                    .setPlatform(Platform.android_ios())
                    .setAudience(Audience.all())
                    .setNotification(Notification.newBuilder()
                            .setAlert(message.getNotificationTitle())
                            .addPlatformNotification(AndroidNotification.newBuilder()
                                    .setAlert(message.getNotificationTitle())
                                    .setTitle(message.getNotificationTitle())
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("androidNotification extras key",message.getExtrasParam())
                                    .build()
                            )
                            .addPlatformNotification(IosNotification.newBuilder()
                                    //传一个IosAlert对象,指定apns title、title、subtitle等
                                    .setAlert(message.getNotificationTitle())
                                    //直接传alert
                                    //此项是指定此推送的badge自动加1
                                    .incrBadge(1)
                                    //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                                    // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                                    .setSound("sound.caf")
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("iosNotification extras key",message.getExtrasParam())
                                    //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
                                    // .setContentAvailable(true)
    
                                    .build()
                            )
                            .build()
                    )
                    //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
                    // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                    // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                    .setMessage(Message.newBuilder()
                            .setMsgContent(message.getMsgContent())
                            .setTitle(message.getMsgTitle())
                            .addExtra("message extras key",message.getExtrasParam())
                            .build())
    
                    .setOptions(Options.newBuilder()
                            //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                            .setApnsProduction(false)
                            //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                            .setSendno(1)
                            //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                            .setTimeToLive(86400)
                            .build()
                    )
                    .build();
        
    
        @Override
        public PushPayload buildPushObjectAllRegistrationIdAlertWithTitle(PushMessage message) 
            logger.info("----------buildPushObjectAllRegistrationIdAlertWithTitle---");
            //创建一个IosAlert对象,可指定APNs的alert、title等字段
            //IosAlert iosAlert =  IosAlert.newBuilder().setTitleAndBody("title", "alert body").build();
            return PushPayload.newBuilder()
                    //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
                    .setPlatform(Platform.all())
                    //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
                    .setAudience(Audience.registrationId(message.getRegistrationId()))
                    //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
                    .setNotification(Notification.newBuilder()
                            //指定当前推送的android通知
                            .addPlatformNotification(AndroidNotification.newBuilder()
    
                                    .setAlert(message.getNotificationTitle())
                                    .setTitle(message.getNotificationTitle())
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("androidNotification extras key",message.getExtrasParam())
    
                                    .build())
                            //指定当前推送的iOS通知
                            .addPlatformNotification(IosNotification.newBuilder()
                                    //传一个IosAlert对象,指定apns title、title、subtitle等
                                    .setAlert(message.getNotificationTitle())
                                    //直接传alert
                                    //此项是指定此推送的badge自动加1
                                    .incrBadge(1)
                                    //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                                    // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                                    .setSound("sound.caf")
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("iosNotification extras key",message.getExtrasParam())
                                    //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
                                    //取消此注释,消息推送时ios将无法在锁屏情况接收
                                    // .setContentAvailable(true)
    
                                    .build())
    
    
                            .build())
                    //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
                    // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                    // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                    .setMessage(Message.newBuilder()
    
                            .setMsgContent(message.getMsgContent())
    
                            .setTitle(message.getMsgTitle())
    
                            .addExtra("message extras key",message.getExtrasParam())
    
                            .build())
    
                    .setOptions(Options.newBuilder()
                            //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                            .setApnsProduction(false)
                            //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                            .setSendno(1)
                            //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天;
                            .setTimeToLive(86400)
    
                            .build())
    
                    .build();
        
    
        @Override
        public PushPayload buildPushObjectAndroidAllAlertWithTitle(PushMessage pushMessage) 
            logger.info("----------buildPushObject_android_registrationId_alertWithTitle");
            return PushPayload.newBuilder()
                    //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
                    .setPlatform(Platform.android())
                    //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
                    .setAudience(Audience.all())
                    //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
                    .setNotification(Notification.newBuilder()
                            //指定当前推送的android通知
                            .addPlatformNotification(AndroidNotification.newBuilder()
                                    .setAlert(pushMessage.getNotificationTitle())
                                    .setTitle(pushMessage.getNotificationTitle())
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("androidNotification extras key",pushMessage.getExtrasParam())
                                    .build())
                            .build()
                    )
                    //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
                    // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                    // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                    .setMessage(Message.newBuilder()
                            .setMsgContent(pushMessage.getMsgContent())
                            .setTitle(pushMessage.getMsgTitle())
                            .addExtra("message extras key",pushMessage.getExtrasParam())
                            .build())
    
                    .setOptions(Options.newBuilder()
                            //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                            .setApnsProduction(false)
                            //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                            .setSendno(1)
                            //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                            .setTimeToLive(86400)
                            .build())
                    .build();
        
    
        @Override
        public PushPayload buildPushObjectIosAllAlertWithTitle(PushMessage message) 
            logger.info("----------buildPushObjectIosAllAlertWithTitle");
            return PushPayload.newBuilder()
                    //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
                    .setPlatform(Platform.ios())
                    //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
                    .setAudience(Audience.all())
                    //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
                    .setNotification(Notification.newBuilder()
                            //指定当前推送的android通知
                            .addPlatformNotification(IosNotification.newBuilder()
                                    //传一个IosAlert对象,指定apns title、title、subtitle等
                                    .setAlert(message.getNotificationTitle())
                                    //直接传alert
                                    //此项是指定此推送的badge自动加1
                                    .incrBadge(1)
                                    //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                                    // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                                    .setSound("sound.caf")
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("iosNotification extras key",message.getExtrasParam())
                                    //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
                                    // .setContentAvailable(true)
    
                                    .build())
                            .build()
                    )
                    //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
                    // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                    // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                    .setMessage(Message.newBuilder()
                            .setMsgContent(message.getMsgContent())
                            .setTitle(message.getMsgTitle())
                            .addExtra("message extras key",message.getExtrasParam())
                            .build())
    
                    .setOptions(Options.newBuilder()
                            //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                            .setApnsProduction(false)
                            //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                            .setSendno(1)
                            //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                            .setTimeToLive(86400)
                            .build())
                    .build();
        
        /**
         * 获取JPushClient
         * @return
         */
        private JPushClient pushClient()
            String appKey = messageProperties.getAppKey();
            String masterSecret = messageProperties.getMasterSecret();
            JPushClient jPushClient = new JPushClient(appKey,masterSecret);
            return jPushClient;
        
    
    
    4.推送配置项
    package component.invoker.manager.push.support;
    
    import cn.jiguang.common.resp.APIConnectionException;
    import cn.jiguang.common.resp.APIRequestException;
    import cn.jpush.api.JPushClient;
    import cn.jpush.api.push.PushResult;
    import cn.jpush.api.push.model.Message;
    import cn.jpush.api.push.model.Options;
    import cn.jpush.api.push.model.Platform;
    import cn.jpush.api.push.model.PushPayload;
    import cn.jpush.api.push.model.audience.Audience;
    import cn.jpush.api.push.model.notification.AndroidNotification;
    import cn.jpush.api.push.model.notification.IosNotification;
    import cn.jpush.api.push.model.notification.Notification;
    import component.invoker.domain.wrapper.message.PushMessage;
    import component.invoker.manager.push.PushMessageExecutor;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    
    
    /**
     * @author wangbowen
     * @description 推送实现接口
     * @Date 2018/5/14
     * @since 1.0.0
     */
    @Component
    @EnableConfigurationProperties(MessageProperties.class)
    public class PushMessageExecutorSupport implements PushMessageExecutor 
        private Logger logger = LoggerFactory.getLogger(PushMessageExecutorSupport.class);
        @Resource
        private MessageProperties messageProperties;
    
    
        @Override
        public int sendToRegistrationId(PushMessage message) 
            int result = 0;
            try 
                PushPayload pushPayload= this.buildPushObjectAllRegistrationIdAlertWithTitle(message);
                logger.info("服务器返回推送对象:"+pushPayload);
                PushResult pushResult=this.pushClient().sendPush(pushPayload);
                logger.info("服务端推送结果:"+pushResult);
                if(pushResult.getResponseCode()==200)
                    result=1;
                
             catch (APIConnectionException e) 
                e.printStackTrace();
    
             catch (APIRequestException e) 
                e.printStackTrace();
            
    
            return result;
        
    
        @Override
        public int sendToAllAndroid(PushMessage message) 
            int result = 0;
            try 
                PushPayload pushPayload= this.buildPushObjectAndroidAllAlertWithTitle(message);
                logger.info("服务器返回推送对象:"+pushPayload);
                PushResult pushResult=this.pushClient().sendPush(pushPayload);
                logger.info("服务端推送结果:"+pushResult);
                if(pushResult.getResponseCode()==200)
                    result=1;
                
             catch (Exception e) 
    
                e.printStackTrace();
            
    
            return result;
        
    
        @Override
        public int sendToAllIos(PushMessage message) 
            int result = 0;
            try 
                PushPayload pushPayload= this.buildPushObjectIosAllAlertWithTitle(message);
                logger.info("服务器返回推送对象:"+pushPayload);
                PushResult pushResult=this.pushClient().sendPush(pushPayload);
                logger.info("服务端推送结果:"+pushResult);
                if(pushResult.getResponseCode()==200)
                    result=1;
                
             catch (Exception e) 
    
                e.printStackTrace();
            
    
            return result;
        
    
        @Override
        public int sendToAll(PushMessage message) 
            int result = 0;
            try 
                PushPayload pushPayload= this.buildPushObjectAndroidAndIos(message);
                logger.info("服务器返回推送对象:"+pushPayload);
                PushResult pushResult=this.pushClient().sendPush(pushPayload);
                logger.info("服务端推送结果:"+pushResult);
                if(pushResult.getResponseCode()==200)
                    result=1;
                
             catch (Exception e) 
                e.printStackTrace();
            
    
            return result;
        
    
        @Override
        public PushPayload buildPushObjectAndroidAndIos(PushMessage message) 
            logger.info("---------------buildPushObjectAndroidAndIos--------");
            return PushPayload.newBuilder()
                    .setPlatform(Platform.android_ios())
                    .setAudience(Audience.all())
                    .setNotification(Notification.newBuilder()
                            .setAlert(message.getNotificationTitle())
                            .addPlatformNotification(AndroidNotification.newBuilder()
                                    .setAlert(message.getNotificationTitle())
                                    .setTitle(message.getNotificationTitle())
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("androidNotification extras key",message.getExtrasParam())
                                    .build()
                            )
                            .addPlatformNotification(IosNotification.newBuilder()
                                    //传一个IosAlert对象,指定apns title、title、subtitle等
                                    .setAlert(message.getNotificationTitle())
                                    //直接传alert
                                    //此项是指定此推送的badge自动加1
                                    .incrBadge(1)
                                    //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                                    // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                                    .setSound("sound.caf")
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("iosNotification extras key",message.getExtrasParam())
                                    //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
                                    // .setContentAvailable(true)
    
                                    .build()
                            )
                            .build()
                    )
                    //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
                    // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                    // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                    .setMessage(Message.newBuilder()
                            .setMsgContent(message.getMsgContent())
                            .setTitle(message.getMsgTitle())
                            .addExtra("message extras key",message.getExtrasParam())
                            .build())
    
                    .setOptions(Options.newBuilder()
                            //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                            .setApnsProduction(false)
                            //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                            .setSendno(1)
                            //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                            .setTimeToLive(86400)
                            .build()
                    )
                    .build();
        
    
        @Override
        public PushPayload buildPushObjectAllRegistrationIdAlertWithTitle(PushMessage message) 
            logger.info("----------buildPushObjectAllRegistrationIdAlertWithTitle---");
            //创建一个IosAlert对象,可指定APNs的alert、title等字段
            //IosAlert iosAlert =  IosAlert.newBuilder().setTitleAndBody("title", "alert body").build();
            return PushPayload.newBuilder()
                    //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
                    .setPlatform(Platform.all())
                    //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
                    .setAudience(Audience.registrationId(message.getRegistrationId()))
                    //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
                    .setNotification(Notification.newBuilder()
                            //指定当前推送的android通知
                            .addPlatformNotification(AndroidNotification.newBuilder()
    
                                    .setAlert(message.getNotificationTitle())
                                    .setTitle(message.getNotificationTitle())
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("androidNotification extras key",message.getExtrasParam())
    
                                    .build())
                            //指定当前推送的iOS通知
                            .addPlatformNotification(IosNotification.newBuilder()
                                    //传一个IosAlert对象,指定apns title、title、subtitle等
                                    .setAlert(message.getNotificationTitle())
                                    //直接传alert
                                    //此项是指定此推送的badge自动加1
                                    .incrBadge(1)
                                    //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                                    // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                                    .setSound("sound.caf")
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("iosNotification extras key",message.getExtrasParam())
                                    //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
                                    //取消此注释,消息推送时ios将无法在锁屏情况接收
                                    // .setContentAvailable(true)
    
                                    .build())
    
    
                            .build())
                    //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
                    // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                    // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                    .setMessage(Message.newBuilder()
    
                            .setMsgContent(message.getMsgContent())
    
                            .setTitle(message.getMsgTitle())
    
                            .addExtra("message extras key",message.getExtrasParam())
    
                            .build())
    
                    .setOptions(Options.newBuilder()
                            //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                            .setApnsProduction(false)
                            //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                            .setSendno(1)
                            //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天;
                            .setTimeToLive(86400)
    
                            .build())
    
                    .build();
        
    
        @Override
        public PushPayload buildPushObjectAndroidAllAlertWithTitle(PushMessage pushMessage) 
            logger.info("----------buildPushObject_android_registrationId_alertWithTitle");
            return PushPayload.newBuilder()
                    //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
                    .setPlatform(Platform.android())
                    //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
                    .setAudience(Audience.all())
                    //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
                    .setNotification(Notification.newBuilder()
                            //指定当前推送的android通知
                            .addPlatformNotification(AndroidNotification.newBuilder()
                                    .setAlert(pushMessage.getNotificationTitle())
                                    .setTitle(pushMessage.getNotificationTitle())
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("androidNotification extras key",pushMessage.getExtrasParam())
                                    .build())
                            .build()
                    )
                    //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
                    // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                    // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                    .setMessage(Message.newBuilder()
                            .setMsgContent(pushMessage.getMsgContent())
                            .setTitle(pushMessage.getMsgTitle())
                            .addExtra("message extras key",pushMessage.getExtrasParam())
                            .build())
    
                    .setOptions(Options.newBuilder()
                            //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                            .setApnsProduction(false)
                            //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                            .setSendno(1)
                            //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                            .setTimeToLive(86400)
                            .build())
                    .build();
        
    
        @Override
        public PushPayload buildPushObjectIosAllAlertWithTitle(PushMessage message) 
            logger.info("----------buildPushObjectIosAllAlertWithTitle");
            return PushPayload.newBuilder()
                    //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
                    .setPlatform(Platform.ios())
                    //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
                    .setAudience(Audience.all())
                    //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
                    .setNotification(Notification.newBuilder()
                            //指定当前推送的android通知
                            .addPlatformNotification(IosNotification.newBuilder()
                                    //传一个IosAlert对象,指定apns title、title、subtitle等
                                    .setAlert(message.getNotificationTitle())
                                    //直接传alert
                                    //此项是指定此推送的badge自动加1
                                    .incrBadge(1)
                                    //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                                    // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                                    .setSound("sound.caf")
                                    //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                    .addExtra("iosNotification extras key",message.getExtrasParam())
                                    //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
                                    // .setContentAvailable(true)
    
                                    .build())
                            .build()
                    )
                    //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
                    // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                    // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                    .setMessage(Message.newBuilder()
                            .setMsgContent(message.getMsgContent())
                            .setTitle(message.getMsgTitle())
                            .addExtra("message extras key",message.getExtrasParam())
                            .build())
    
                    .setOptions(Options.newBuilder()
                            //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                            .setApnsProduction(false)
                            //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                            .setSendno(1)
                            //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                            .setTimeToLive(86400)
                            .build())
                    .build();
        
        /**
         * 获取JPushClient
         * @return
         */
        private JPushClient pushClient()
            String appKey = messageProperties.getAppKey();
            String masterSecret = messageProperties.getMasterSecret();
            JPushClient jPushClient = new JPushClient(appKey,masterSecret);
            return jPushClient;
        
    
    
    4.推送配置项
    package component.invoker.manager.push.support;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    /**
     * @author wangbowen
     * @description 推送配置
     * @Date 2018/5/14
     * @since 1.0.0
     */
    @ConfigurationProperties("invoker.jpush")
    public class MessageProperties 
    
        private String appKey;
    
        private String masterSecret;
    
        public String getAppKey() 
            return appKey;
        
    
        public void setAppKey(String appKey) 
            this.appKey = appKey;
        
    
        public String getMasterSecret() 
            return masterSecret;
        
    
        public void setMasterSecret(String masterSecret) 
            this.masterSecret = masterSecret;
        
    
    
    
    

以上是关于极光推送的主要内容,如果未能解决你的问题,请参考以下文章

极光推送

使用极光推送实现分组发送和服务端集成

使用极光/友盟推送,APP进程杀死后为啥收不到推送

极光推送知识点2

android推送保活实验到结论

极光推送,在推送之前,是不是能够查询,极光推送服务器是不是存在该别名