一些关于springcloud项目 中 jpush(极光推送)的使用心的

首先,使用jpush需要先完成一下操作:
  • 到极光推送官方网站注册开发者帐号;
  • 登录进入管理控制台,创建应用程序,得到 Appkey(SDK与服务器端通过Appkey互相识别);
  • 下载SDK 集成到 App 里。

我们公司已经买过了极光推送的服务,拿过来直接用就可以了。

pom中添加依赖:


<dependency>
    <groupId>cn.jpush.apigroupId>
    <artifactId>jpush-clientartifactId>
    <version>3.3.3version>
dependency>
<dependency>
    <groupId>cn.jpush.apigroupId>
    <artifactId>jiguang-commonartifactId>
    <version>1.0.8version>
dependency>
<dependency>
    <groupId>io.nettygroupId>
    <artifactId>netty-allartifactId>
    <version>4.1.6.Finalversion>
    <scope>compilescope>
dependency>

yml文件属性配置

jPush:
 #极光推送
  appKey: 
  masterSecret: 

获取属性实体:

public class JPush {
    @Value("${jPush.appKey:''}")
    private String appKey;

    @Value("${jPush.masterSecret:''}")
    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;
    }
}

下面贴出jpush推送方式通用类,里面包含了大多数推送方法:

/**
 * 推送给设备标识参数的用户
 * @param registrationId 设备标识
 * @param notification_title 通知内容标题
 * @param msg_title 消息内容标题
 * @param msg_content 消息内容
 * @param id 扩展字段
 * @param type 扩展字段
 * @return 0推送失败,1推送成功
 */
public static int sendToRegistrationId( String registrationId,String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    int result = 0;
    try {
        PushPayload pushPayload= JpushClientUtil.buildPushObject_all_registrationId_alertWithTitle(registrationId,notification_title,msg_title,msg_content,id,type,days);
        //System.out.println(pushPayload);
        PushResult pushResult=jPushClient.sendPush(pushPayload);
        //System.out.println(pushResult);
        if(pushResult.getResponseCode()==200){
            result=1;
        }
    } catch (APIConnectionException e) {
        e.printStackTrace();

    } catch (APIRequestException e) {
        e.printStackTrace();
    }

    return result;
}

/**
 * 发送给所有安卓用户
 * @param notification_title 通知内容标题
 * @param msg_title 消息内容标题
 * @param msg_content 消息内容
 * @param id 扩展字段
 * @param type 扩展字段
 * @return 0推送失败,1推送成功
 */
public static int sendToAllAndroid( String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    int result = 0;
    try {
        PushPayload pushPayload= JpushClientUtil.buildPushObject_android_all_alertWithTitle(notification_title,msg_title,msg_content,id,type,days);
        //System.out.println(pushPayload);
        PushResult pushResult=jPushClient.sendPush(pushPayload);
        //System.out.println(pushResult);
        if(pushResult.getResponseCode()==200){
            result=1;
        }
    } catch (Exception e) {

        e.printStackTrace();
    }

    return result;
}

/**
 * 发送给所有IOS用户
 * @param notification_title 通知内容标题
 * @param msg_title 消息内容标题
 * @param msg_content 消息内容
 * @param id 扩展字段
 * @param type 扩展字段
 * @return 0推送失败,1推送成功
 */
public static int sendToAllIos(String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    int result = 0;
    try {
        PushPayload pushPayload= JpushClientUtil.buildPushObject_ios_all_alertWithTitle(notification_title,msg_title,msg_content,id,type,days);
        //System.out.println(pushPayload);
        PushResult pushResult=jPushClient.sendPush(pushPayload);
        //System.out.println(pushResult);
        if(pushResult.getResponseCode()==200){
            result=1;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return result;
}
/**
 *用别名推送消息
 * @param list 通知对象集合
 * @param notification_title 通知内容标题
 * @param msg_title 消息内容标题
 * @param msg_content 消息内容
 * @param id 扩展字段
 * @param type 扩展字段
 * @return 0推送失败,1推送成功
 */
public static int sendToAllByAlias(List list, String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    int result = 0;
    try {
        PushPayload pushPayload= JpushClientUtil.buildPushObject_all_alias_alertWithTitle(list, notification_title,msg_title,msg_content,id,type,days);
        PushResult pushResult=jPushClient.sendPush(pushPayload);
        if(pushResult.getResponseCode()==200){
            result=1;
        }
    } catch (Exception e) {
        System.err.println("alias推送消息异常");
        //e.printStackTrace();
    }

    return result;
}

/**
 * 发送给所有用户
 * @param notification_title 通知内容标题
 * @param msg_title 消息内容标题
 * @param msg_content 消息内容
 * @param id 扩展字段
 * @param type 扩展字段
 * @return 0推送失败,1推送成功
 */
public static int sendToAll( String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    int result = 0;
    try {
        PushPayload pushPayload= JpushClientUtil.buildPushObject_android_and_ios(notification_title,msg_title,msg_content,id,type,days);
        //System.out.println(pushPayload);
        PushResult pushResult=jPushClient.sendPush(pushPayload);
        //System.out.println(pushResult);
        if(pushResult.getResponseCode()==200){
            result=1;
        }
    } catch (Exception e) {

        e.printStackTrace();
    }

    return result;
}



public static PushPayload buildPushObject_android_and_ios(String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    return PushPayload.newBuilder()
            .setPlatform(Platform.android_ios())
            .setAudience(Audience.all())
            .setNotification(Notification.newBuilder()
                    .setAlert(notification_title)
                    .addPlatformNotification(AndroidNotification.newBuilder()
                            .setAlert(notification_title)
                            .setTitle(notification_title)
                            //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value                            .addExtra("id",id)
                            .addExtra("messageType",type)
                            .build()
                    )
                    .addPlatformNotification(IosNotification.newBuilder()
                            //传一个IosAlert对象,指定apns titletitlesubtitle                            .setAlert(notification_title)
                            //直接传alert
                            //此项是指定此推送的badge自动加1
                            .incrBadge(1)
                            //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                            // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                            .setSound("sound.caf")
                            //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value                            .addExtra("id",id)
                            .addExtra("messageType",type)
                            //此项说明此推送是一个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(msg_content)
                    .setTitle(msg_title)
                    .addExtra("messageId",id)
                    .addExtra("messageType",type)
                    .build())

            .setOptions(Options.newBuilder()
                    //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                    .setApnsProduction(true)
                    //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                    .setSendno(1)
                    //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                    .setTimeToLive(days*86400)
                    .build()
            )
            .build();
}

private static PushPayload buildPushObject_all_registrationId_alertWithTitle(String registrationId,String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    //System.out.println("----------buildPushObject_all_all_alert");
    //创建一个IosAlert对象,可指定APNsalerttitle等字段
    //IosAlert iosAlert =  IosAlert.newBuilder().setTitleAndBody("title", "alert body").build();
    return PushPayload.newBuilder()
            //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
            .setPlatform(Platform.all())
            //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tagalias或该应应用客户端调用接口获取到的registration id
            .setAudience(Audience.registrationId(registrationId))
            //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
            .setNotification(Notification.newBuilder()
                    //指定当前推送的android通知
                    .addPlatformNotification(AndroidNotification.newBuilder()
                            .setAlert(notification_title)
                            .setTitle(notification_title)
                            //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value                            .addExtra("id",id)
                            .addExtra("messageType",type)
                            .build())
                    //指定当前推送的iOS通知
                    .addPlatformNotification(IosNotification.newBuilder()
                            //传一个IosAlert对象,指定apns titletitlesubtitle                            .setAlert(notification_title)
                            //直接传alert
                            //此项是指定此推送的badge自动加1
                            .incrBadge(1)
                            //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                            // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                            .setSound("sound.caf")
                            //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value                            .addExtra("id",id)
                            .addExtra("messageType",type)
                            //此项说明此推送是一个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(msg_content)

                    .setTitle(msg_title)

                    .addExtra("messageId",id)

                    .addExtra("messageType",type)

                    .build())

            .setOptions(Options.newBuilder()
                    //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                    .setApnsProduction(true)
                    //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                    .setSendno(1)
                    //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天;
                    .setTimeToLive(days*86400)

                    .build())

            .build();

}

private static PushPayload buildPushObject_android_all_alertWithTitle(String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    //System.out.println("----------buildPushObject_android_registrationId_alertWithTitle");
    return PushPayload.newBuilder()
            //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
            .setPlatform(Platform.android())
            //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tagalias或该应应用客户端调用接口获取到的registration id
            .setAudience(Audience.all())
            //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
            .setNotification(Notification.newBuilder()
                    //指定当前推送的android通知
                    .addPlatformNotification(AndroidNotification.newBuilder()
                            .setAlert(notification_title)
                            .setTitle(notification_title)
                            //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value                            .addExtra("id",id)
                            .addExtra("messageType",type)
                            .build())
                    .build()
            )
            //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
            // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/            // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
            .setMessage(Message.newBuilder()
                    .setMsgContent(msg_content)
                    .setTitle(msg_title)
                    .addExtra("messageId",id)
                    .addExtra("messageType",type)
                    .build())

            .setOptions(Options.newBuilder()
                    //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                    .setApnsProduction(true)
                    //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                    .setSendno(1)
                    //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                    .setTimeToLive(days*86400)
                    .build())
            .build();
}

private static PushPayload buildPushObject_ios_all_alertWithTitle( String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    //System.out.println("----------buildPushObject_ios_registrationId_alertWithTitle");
    return PushPayload.newBuilder()
            //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
            .setPlatform(Platform.all())
            //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tagalias或该应应用客户端调用接口获取到的registration id
            .setAudience(Audience.all())
           /* .setAudience(Audience.newBuilder()
                    .addAudienceTarget(AudienceTarget.tag("tag1", "tag2"))
                    .addAudienceTarget(AudienceTarget.alias("alias1", "alias2")).build())*/
            //.setAudience(Audience.tag("13865946828"))
            //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
            .setNotification(Notification.newBuilder()
                    //指定当前推送的android通知
                    .addPlatformNotification(IosNotification.newBuilder()
                            //传一个IosAlert对象,指定apns titletitlesubtitle                            .setAlert(notification_title)
                            //直接传alert
                            //此项是指定此推送的badge自动加1
                            .incrBadge(1)
                            //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                            // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                            .setSound("sound.caf")
                            //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value                            .addExtra("id",id)
                            .addExtra("messageType",type)
                            //此项说明此推送是一个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(msg_content)
                    .setTitle(msg_title)
                    .addExtra("messageId",id)
                    .addExtra("messageType",type)
                    .build())

            .setOptions(Options.newBuilder()
                    //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                    .setApnsProduction(true)
                    //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                    .setSendno(1)
                    //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
                    .setTimeToLive(days*86400)
                    //如果新的一条消息,其 override_msg_id 与离线消息里已经存在的一条相同,则这条新的消息会覆盖老的消息
                    //.setOverrideMsgId(Long.valueOf("2797796982"))
                    .build())
            .build();
}

private static PushPayload buildPushObject_all_alias_alertWithTitle(List list,String notification_title, String msg_title, String msg_content, String id, String type, int days) {
    return PushPayload.newBuilder()
            //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
            .setPlatform(Platform.all())
            //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tagalias或该应应用客户端调用接口获取到的registration id
            .setAudience(Audience.alias(list))
            //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
            .setNotification(Notification.newBuilder()
                    //指定当前推送的android通知
                    .addPlatformNotification(AndroidNotification.newBuilder()
                            .setAlert(notification_title)
                            .setTitle("xxxx")
                            //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value                            .addExtra("id",id)
                            .addExtra("messageType",type)
                            .build())
                    //指定当前推送的iOS通知
                    .addPlatformNotification(IosNotification.newBuilder()
                            //传一个IosAlert对象,指定apns titletitlesubtitle                            .setAlert(notification_title)
                            //直接传alert
                            //此项是指定此推送的badge自动加1
                            .incrBadge(1)
                            //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
                            // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
                            .setSound("sound.caf")
                            //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value                            .addExtra("id",id)
                            .addExtra("messageType",type)
                            //此项说明此推送是一个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(msg_content)

                    .setTitle(msg_title)

                    .addExtra("messageId",id)

                    .addExtra("messageType",type)

                    .build())

            .setOptions(Options.newBuilder()
                    //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                    .setApnsProduction(true)
                    //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                    .setSendno(1)
                    //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天;
                    .setTimeToLive(days*86400)

                    .build())

            .build();

}

上面各种参数有什么不懂的地方可以参考官方文档,文档地址:https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push/

提醒各位开发者一个遇到的问题:使用jpush发送通知时文字加粗、换行等暂只支持ios系统,android系统想要解决相关问题,需要解决机型适配等问题,可以在android应用中进行相关配置(改变通知栏样式)。




你可能感兴趣的:(springcloud)