极光推送工具类

Posted 健身小白

tags:

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

工作中经常会遇到服务器向App推送消息的需求,一般企业中选择用极光推送的比较多,在集成极光时发现极光的文档并不完整,网上的文章也很多不能直接使用,这里列出我在工作中集成极光的全部代码,只需要按照如下代码保证一次性实现。

https://www.toutiao.com/article/6809776164580622852/ 、
收藏了很有用

1.pom.xml
<!-- 极光推送 begin -->
<dependency>
    <groupId>cn.jpush.api</groupId>
    <artifactId>jpush-client</artifactId>
    <version>3.3.10</version>
</dependency>
<dependency>
    <groupId>cn.jpush.api</groupId>
    <artifactId>jiguang-common</artifactId>
    <version>1.1.4</version>
</dependency>
<!-- 极光推送 end -->
2.application.yml
jpush:
  appKey: xxx
  masterSecret: xxxx
  apnsProduction: false   # 是否生成环境,true表示生成环境
  
3.MyJPushClient
package com.sinosoft.sss.cloud.notification.utils;

import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.ServiceHelper;
import cn.jiguang.common.connection.NettyHttpClient;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jiguang.common.resp.ResponseWrapper;
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.iosAlert;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import cn.jpush.api.schedule.ScheduleResult;
import com.sinosoft.sss.cloud.notification.config.JpushConfig;
import com.sinosoft.sss.commons.transfer.SingleDataResult;
import io.netty.handler.codec.http.HttpMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;

@Component
public class JpushUtils 

    @Value("$jpush.appKey")
    private  String appKey;
    @Value("$jpush.masterSecret")
    private  String masterSecret;

    @Value("$jpush.appKeyIOS")
    private  String appKeyIOS;
    @Value("$jpush.masterSecretIOS")
    private  String masterSecretIOS;

    private static JPushClient jPushClient = null;

    private static JPushClient jPushClientIOS = null;

    public JPushClient getJPushClient() 
        if (jPushClient == null) 
            jPushClient = new JPushClient(masterSecret, appKey);
        

        return jPushClient;
    
    public JPushClient getJPushClientIOS() 
        if (jPushClientIOS == null) 
            jPushClientIOS = new JPushClient(masterSecretIOS, appKeyIOS);
        
        return jPushClientIOS;
    


    private static final Logger logger = LoggerFactory.getLogger(JpushUtils.class);

    @Resource
    private JpushConfig jpushConfig;

    /**
     * 推送给所有的用户(定时)
     *
     * @param title    推送标题
     * @param text     推送内容
     * @param sendTime 推送时间
     * @param extras   传输内容
     * @param alias    标签
     * @return boolean
     */
    public SingleDataResult sendToAllTiming(String title, String text, String sendTime, Map<String, String> extras, String[] alias) 
        PushPayload pushPayload = buildPushObject_All(title, text, null);
        return this.sendPushTiming(pushPayload, sendTime);
    



    /**
     * 推送给所有的用户(立即)
     *
     * @param title    推送标题
     * @param text     推送内容
     * @param extras   传输内容
     * @return boolean
     */
    public SingleDataResult sendToAll(String title, String text, Map<String, String> extras) 
        PushPayload pushPayload = buildPushObject_All(title, text, null);
        return this.sendPush(pushPayload);
    

    /**
     * 发送给所有安卓用户
     *
     * @param title     通知标题
     * @param content   通知内容
     * @param extrasMap 自定义通知信息(不在app上显示,作为内容传输的数据)
     * @param alias     标签组
     * @return boolean
     */
    public SingleDataResult sendToAllAndroid(String title, String content, Map<String, String> extrasMap, String... alias) 
        PushPayload pushPayload = buildPushObject_android_all_alertWithTitle(title, content, extrasMap, alias);
        return this.sendPush(pushPayload);
    

    /**
     * 发送给所有IOS用户
     *
     * @param title     通知标题
     * @param content   通知内容
     * @param extrasMap 自定义通知信息(不在app上显示,作为内容传输的数据)
     * @param alias     标签组
     * @return boolean
     */
    public SingleDataResult sendToAllIOS(String title, String content, Map<String, String> extrasMap, String... alias) 
        PushPayload pushPayload = buildPushObject_ios_all_alertWithTitle(title, content, extrasMap, alias);
        return this.sendPush(pushPayload);
    

    /**
     * 发送给指定的用户推送
     */
    public SingleDataResult sendToRegistrationIds(String content, List<String> registrationIds) 
        PushPayload pushPayload = buildPushObject_registrationIds_alertWithTitle(content, registrationIds);
        return this.sendPush(pushPayload);
    
    /**
     * 发送给指定的用户推送(立即)
     */
    public SingleDataResult sendToRegistrationIds(String title,String content, List<String> registrationIds) 
        PushPayload pushPayload = buildPushObject_registrationIds_alertWithTitle(title,content, registrationIds);
        return this.sendPush(pushPayload);
    
    /**
     * 发送给指定的用户推送(定时)
     */
    public SingleDataResult sendToRegistrationIdsTiming(String title,String content,String sendTime,List<String> registrationIds) 
        PushPayload pushPayload = buildPushObject_registrationIds_alertWithTitle(title,content, registrationIds);
        return this.sendPushTiming(pushPayload,sendTime);
    



    /**
     * 异步请求推送方式
     * 使用NettyHttpClient,异步接口发送请求,通过回调函数可以获取推送成功与否情况
     *
     * @param title     通知栏标题
     * @param content   通知栏内容(为了单行显示全,尽量保持在22个汉字以下)
     * @param extrasMap 额外推送信息(不会显示在通知栏,传递数据用)
     * @param alias     需接收的用户别名数组(为空则所有用户都推送)
     */
    public void sendPushWithCallback(String title, String content, Map<String, String> extrasMap, String... alias) 
        ClientConfig clientConfig = ClientConfig.getInstance();
        clientConfig.setTimeToLive(Long.valueOf(jpushConfig.getLiveTime()));
        String host = (String) clientConfig.get(ClientConfig.PUSH_HOST_NAME);
        NettyHttpClient client = new NettyHttpClient(
                ServiceHelper.getBasicAuthorization(jpushConfig.getAppkey(), jpushConfig.getMasterSecret()), null,
                clientConfig);
        try 
            URI uri = new URI(host + clientConfig.get(ClientConfig.PUSH_PATH));
            PushPayload payload = buildPushObject_Android_And_Ios(title, content, extrasMap, alias);
            client.sendRequest(HttpMethod.POST, payload.toString(), uri, new NettyHttpClient.BaseCallback() 
                @Override
                public void onSucceed(ResponseWrapper responseWrapper) 
                    if (200 == responseWrapper.responseCode) 
                        logger.info("极光推送成功");
                     else 
                        logger.info("极光推送失败,返回结果: " + responseWrapper.responseContent);
                    
                
            );
         catch (URISyntaxException e) 
            e.printStackTrace();
         finally 
            // 需要手动关闭Netty请求进程,否则会一直保留
            client.close();
        

    

    /**
     * 设置、更新、设备的 tag, alias 信息。
     *
     * @param registrationId 设备的registrationId
     * @param alias          更新设备的别名属性
     * @param tagsToAdd      添加设备的tag属性
     * @param tagsToRemove   移除设备的tag属性
     */
    public void UpdateDeviceTagAlias(String registrationId, String alias, Set<String> tagsToAdd, Set<String> tagsToRemove) throws APIConnectionException, APIRequestException 
        JPushClient jpushClient = new JPushClient(jpushConfig.getMasterSecret(), jpushConfig.getAppkey());
        jpushClient.updateDeviceTagAlias(registrationId, alias, tagsToAdd, tagsToRemove);
    


    /**
     * 根据标签推送相应的消息
     *
     * @param title   推送消息标题
     * @param content 推送消息内容
     * @param map     推送额外信息
     * @param tags    推送的目标标签
     * @return PushPayload
     */
    public PushPayload buildPushLoadByTags(String title, String content, Map<String, String> map, String... tags) 
        if (map.isEmpty()) 
            map = new HashMap<>();
        
        //批量删除数组中的空元素
        String[] newTags = removeArrayEmptyElement(tags);
        return PushPayload.newBuilder()
                //设置推送平台为安卓
                .setPlatform(Platform.android())
                //设置标签
                .setAudience(Audience.tag(tags))
                //设置 推送的标签标题
                // 设置通知方式(以alert方式提醒)
                .setNotification(Notification.newBuilder()
                        .setAlert(content)
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .setTitle(title)
                                .addExtras(map)
                                .build())
                        .build())
                //sendno int 可选 推送序号 纯粹用来作为 API 调用标识
                //离线消息保留时长 推送当前用户不在线时,为该用户保留多长时间的离线消息(默认 86400 (1 天),最长 10 天。设置为 0 表示不保留离线消息,只有推送当前在线的用户可以收到)
                //apns_production boolean 可选 APNs是否生产环境  True 表示推送生产环境,False 表示要推送开发环境; 如果不指定则为推送生产环境
                //big_push_duration int 可选 定速推送时长(分钟) 又名缓慢推送,把原本尽可能快的推送速度,降低下来,在给定的 n 分钟内,均匀地向这次推送的目标用户推送。最大值为 1440。未设置则不是定速推送
//            .setOptions(Options.newBuilder().setApnsProduction(false).setTimeToLive(8600).setBigPushDuration(1).build())
                //设置通知内容
//            .setMessage(Message.newBuilder().setTitle("").setMsgContent("").setContentType("").build())
                .build();
    

    /**
     * 删除别名中的空元素(需删除如:null,""," ")
     *
     * @param strArray strArray
     * @return String[]
     */
    private String[] removeArrayEmptyElement(String... strArray) 
        if (null == strArray || strArray.length == 0) 
            return null;
        
        List<String> tempList = Arrays.asList(strArray);
        List<String> strList = new ArrayList<String>();
        Iterator<String> iterator = tempList.iterator();
        while (iterator.hasNext()) 
            String str = iterator.next();
            // 消除空格后再做比较
            if (null != str && !"".equals(str.trim())) 
                strList.add(str);
            
        
        // 若仅输入"",则会将数组长度置为0
        String[] newStrArray = strList.toArray(new String[strList.size()]);
        return newStrArray;
    


    /**
     * 推送方法
     *
     * @param pushPayload 推送内容
     * @return 是否推送成功
     */
    private SingleDataResult sendPush(PushPayload pushPayload) 
        SingleDataResult singleDataResult = new SingleDataResult();
        boolean flag = false;
        logger.info("pushPayload=", pushPayload);
        PushResult pushResult = null;
        PushResult pushResultIOS = null;
        try 
            pushResult = this.getJPushClient().sendPush(pushPayload);
            pushResultIOS = this.getJPushClientIOS().sendPush(pushPayload);
            if (pushResult.getResponseCode() == 200 || pushResultIOS.getResponseCode() == 200) 
                flag = true;
            
            logger.info("[极光推送]scheduleResult result is " + pushResult);
            logger.info("[极光推送]scheduleResult result is " + pushResultIOS);
         catch (APIConnectionException e) 
            logger.error("[极光推送]Connection error. Should retry later. ", e);
         catch (APIRequestException e) 
            logger.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
            logger.info("[极光推送]HTTP Status: " + e.getStatus());
            logger.info("[极光推送]Error Code: " + e.getErrorCode());
            logger.info("[极光推送]Error Message: " + e.getErrorMessage());
            singleDataResult.setMessage(e.getErrorMessage());
        
        singleDataResult.setSuccess(flag);
        return singleDataResult;
    

    /**
     * 推送方法
     *
     * @param pushPayload 推送内容(定时)
     * @return 是否推送成功
     */
    private SingleDataResult sendPushTiming(PushPayload pushPayload, String sendTime) 
        SingleDataResult singleDataResult = new SingleDataResult();
        boolean flag = false;
        logger.info("pushPayload=", pushPayload);
        ScheduleResult pushResult = null;
        ScheduleResult pushResultIOS = null;
        try 
            String sendPushName = "sendNo_" + pushPayload.getSendno();
            pushResult = this.getJPushClient().createSingleSchedule(sendPushName, sendTime, pushPayload);
            pushResultIOS = this.getJPushClientIOS().createSingleSchedule(sendPushName, sendTime, pushPayload);
            if (pushResult.getResponseCode() == 200 || pushResultIOS.getResponseCode() == 200) 
                flag = true;
            
            logger.info("[极光推送]scheduleResult result is " + pushResult.toString());
            logger.info("[极光推送]scheduleResult result is " + pushResultIOS.toString());
         catch (APIConnectionException e) 
            logger.error("[极光推送]Connection error. Should retry later. ", e);
         catch (APIRequestException e) 
            logger.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
            logger.info("[极光推送]HTTP Status: " + e.getStatus());
            logger.info("[极光推送]Error Code: " + e.getErrorCode());
            logger.info("[极光推送]Error Message: " + e.getErrorMessage());
            singleDataResult.setMessage(e.getErrorMessage());
        
        singleDataResult.setSuccess(flag);
        return singleDataResult;
    

    /**
     * 整合给特定的用户
     *
     * @param content         通知内容
     * @param registrationIds 推送的用户ids
     * @return PushPayload
     */
    private PushPayload buildPushObject_registrationIds_alertWithTitle(String content, List<String> registrationIds) 

        return PushPayload.newBuilder()
                .setPlatform(Platform.all())
                .setAudience(Audience.registrationId(registrationIds))
                .setNotification(Notification.newBuilder().setAlert(content).build())
                .build();
    


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

                        .setTitle(title)

                        .build())

                .setOptions(Options.newBuilder()
                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
                        .setApnsProduction(true)
                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
                        .setSendno(1)

                        .build())

                .build();

    

    /**
     * 向IOS平台所有用户推送消息
     *
     * @param title     通知标题
     * @param content   通知内容
     * @param extrasMap 数据传输
     * @param alias     发送人群标签
     * @return PushPayload
     */
    private PushPayload buildPushObject_ios_all_alertWithTitle(String title, String content, Map<String, String> extrasMap, String... alias) 
        if (extrasMap == null || extrasMap.isEmpty()) 
            extrasMap = new HashMap<String, String>();
        
        // 批量删除数组中空元素
        String[] newAlias = removeArrayEmptyElement(alias);
        return PushPayload.newBuilder()
                // 指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
                .setPlatform(Platform.ios())
                // 指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
                // 别名为空,全员推送;别名不为空,按别名推送
                .setAudience((null == newAlias || newAlias.length == 0) ? Audience.all() : Audience.alias(alias))
                // jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
                .setNotification(Notification.newBuilder()
                        // 指定当前推送的IOS通知
                        .addPlatformNotification(IosNotification.newBuilder()
                                .setAlert(content)
                                .incrBadge(1)
                                .setSound("default")
                                // 此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                .addExtras(extrasMap)
                                // 此项说明此推送是一个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(content)
                        .setTitle(title)
                        .addExtras(extrasMap)
                        .build())

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

    /**
     * 向android平台所有用户推送消息
     *
     * @param title     通知标题
     * @param content   通知内容
     * @param extrasMap 数据传输
     * @param alias     发送人群标签
     * @return PushPayload
     */
    private PushPayload buildPushObject_android_all_alertWithTitle(String title, String content, Map<String, String> extrasMap, String... alias) 
        if (extrasMap == null || extrasMap.isEmpty()) 
            extrasMap = new HashMap<String, String>();
        
        // 批量删除数组中空元素
        String[] newAlias = removeArrayEmptyElement(alias);
        return PushPayload.newBuilder()
                // 指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
                .setPlatform(Platform.android())
                // 指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
                // 别名为空,全员推送;别名不为空,按别名推送
                .setAudience((null == newAlias || newAlias.length == 0) ? Audience.all() : Audience.alias(alias))
                // jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
                .setNotification(Notification.newBuilder()
                        // 指定当前推送的android通知
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .setAlert(content)
                                .setTitle(title)
                                // 此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
                                .addExtras(extrasMap)
                                .build())
                        .build()
                )
                // Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。jpush的自定义消息,
                // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
                // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
                .setMessage(Message.newBuilder()
                        .setMsgContent(content)
                        .setTitle(title)
                        .addExtras(extrasMap)
                        .build())

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

    /**
     * 构建Android和IOS的推送通知对象
     *
     * @return PushPayload
     */
    private PushPayload buildPushObject_Android_And_Ios(String title, String content, Map<String, String> extrasMap, String... alias) 
        if (extrasMap == null || extrasMap.isEmpty()) 
            extrasMap = new HashMap<String, String>();
        
        // 批量删除数组中空元素
        String[] newAlias = removeArrayEmptyElement(alias);
        return PushPayload.newBuilder().setPlatform(Platform.android_ios())
                // 别名为空,全员推送;别名不为空,按别名推送
                .setAudience((null == newAlias || newAlias.length == 0) ? Audience.all() : Audience.alias(alias))
//                .setAudience(Audience.registrationId("d"))
                .setNotification(Notification.newBuilder().setAlert(content)
                        .addPlatformNotification(
                                AndroidNotification.newBuilder().setTitle(title).addExtras(extrasMap).build())
                        .addPlatformNotification(
                                IosNotification.newBuilder().incrBadge(1).addExtras(extrasMap).build())
                        .build())
                .build();
    

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

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

                .build();
    




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

极光推送工具类

极光推送工具类

总结:极光推送java服务端

极光推送消息——RegistrationID方式

极光推送总结

极光推送_总结_01_Java实现极光推送