Browse Source

webSocket消息推送,app消息推送

sunhh 2 years ago
parent
commit
cd3adcc6bf

+ 2 - 2
.idea/compiler.xml

@@ -7,10 +7,10 @@
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
         <outputRelativeToContentRoot value="true" />
-        <module name="hazard-admin" />
         <module name="hazard-sdk" />
-        <module name="base-admin" />
         <module name="business-service" />
+        <module name="hazard-admin" />
+        <module name="base-admin" />
       </profile>
     </annotationProcessing>
     <bytecodeTargetLevel>

+ 12 - 12
.idea/jarRepositories.xml

@@ -1,16 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="RemoteRepositoriesConfiguration">
-    <remote-repository>
-      <option name="id" value="central" />
-      <option name="name" value="Central Repository" />
-      <option name="url" value="https://maven.aliyun.com/repository/public" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="central" />
-      <option name="name" value="Central Repository" />
-      <option name="url" value="https://repo.maven.apache.org/maven2" />
-    </remote-repository>
     <remote-repository>
       <option name="id" value="public" />
       <option name="name" value="aliyun nexus" />
@@ -18,8 +8,8 @@
     </remote-repository>
     <remote-repository>
       <option name="id" value="central" />
-      <option name="name" value="Maven Central repository" />
-      <option name="url" value="https://repo1.maven.org/maven2" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
     </remote-repository>
     <remote-repository>
       <option name="id" value="central" />
@@ -36,6 +26,11 @@
       <option name="name" value="Central Repository" />
       <option name="url" value="http://maven.aliyun.com/nexus/content/repositories/central/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
     <remote-repository>
       <option name="id" value="custom_group" />
       <option name="name" value="Nexus Repository" />
@@ -46,5 +41,10 @@
       <option name="name" value="JBoss Community repository" />
       <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
   </component>
 </project>

+ 23 - 0
hazard-sdk/pom.xml

@@ -25,6 +25,29 @@
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
 
+        <!-- 极光推送 -->
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jpush-client</artifactId>
+            <version>3.3.8</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jmessage-client</artifactId>
+            <version>1.1.8</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jiguang-common</artifactId>
+            <version>1.1.3</version>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>io.netty</groupId>-->
+<!--            <artifactId>netty-all</artifactId>-->
+<!--            <version>4.1.6.Final</version>-->
+<!--            <scope>compile</scope>-->
+<!--        </dependency>-->
+
         <!--lombok -->
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 63 - 2
hazard-sdk/src/main/java/com/ozs/controller/upload/GeoHazardMonitorTokenController.java

@@ -10,6 +10,7 @@ import com.ozs.common.utils.AppTokenUtils;
 import com.ozs.common.utils.AppendUtils;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.common.utils.stateSecrets.SM4Utils;
+import com.ozs.jpush.JPushUtil;
 import com.ozs.service.entity.BaseCameraManagement;
 import com.ozs.service.entity.BaseDeviceDynamicManagement;
 import com.ozs.service.entity.MsgAlarm;
@@ -65,6 +66,55 @@ public class GeoHazardMonitorTokenController {
     @Resource
     private BaseRailwayManagementService baseRailwayManagementService;
 
+    /**
+     * 测试app消息推送
+     *
+     * @return
+     */
+    @PostMapping("/appjiguang")
+    public String appjiguang(@RequestBody SvcAddress svcAddress) {
+        List<String> alias = new ArrayList<String>();
+        alias.add("sunhh");
+//        alias.add("wangyy");
+        //sendToRegistrationId(alias, "中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com");
+        //sendToRegistrationId2(alias,"中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com","2021-07-14 17:54:00");
+//        sendToAllAndroid("中奖通知!!!!", "中奖通知!!!!!", "恭喜你中了100000000个亿!!!!", "https://www.baidu.com");
+        JPushUtil.sendToAllIos("中奖通知", "中奖通知", "恭喜你中了100个亿", "https://www.baidu.com");
+        // sendToAll("中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com");
+        //sendToAll2("中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com","2021-07-14 17:54:00");
+        return "推送成功!";
+    }
+
+    /**
+     * 测试webSocket消息推送
+     *
+     * @return
+     */
+    @PostMapping("/webSocketT")
+    public String webSocketT(@RequestBody SvcAddress svcAddress) {
+        // 获取推送人ID列表
+//        Set<String> set = baseUserService.getUserIdList(baseCameraManagement.getCreateBy(), baseCameraManagement.getDeptId());
+//        String[] list = set.toArray(new String[set.size()]);
+        List<String> list = new ArrayList<>();
+        list.add("1");
+
+        // 初始化 -> 运行中 -> 成功或失败
+        try {
+            // 1、初始化
+            webSocketServer.sendMoreMessage(list, objStrString("消息推送", 1));
+            Thread.sleep(3 * 1000);
+            // 2、运行中
+            webSocketServer.sendMoreMessage(list, objStrString("消息推送", 2));
+            Thread.sleep(5 * 1000);
+            // 3、成功或失败
+            webSocketServer.sendMoreMessage(list, Math.random() * 10 > 5 ? objStrString("消息推送", 6) : objStrString("消息推送", 7));
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            throw new RuntimeException("构建失败");
+        }
+        return "推送成功!";
+    }
+
     /**
      * 获取web访问令牌
      *
@@ -134,8 +184,8 @@ public class GeoHazardMonitorTokenController {
             BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(wrapper);
             // 获取推送人ID列表
             Set<String> set = baseUserService.getUserIdList(baseCameraManagement.getCreateBy(), baseCameraManagement.getDeptId());
-            // List<String> list = new ArrayList<>(set);
-            String[] list = set.toArray(new String[set.size()]);
+            List<String> list = new ArrayList<>(set);
+//            String[] list = set.toArray(new String[set.size()]);
             MsgAlarmResp msgAlarmResp = new MsgAlarmResp();
             String begin = AppendUtils.stringAppend(baseCameraManagement.getBeginMile());
             String end = AppendUtils.stringAppend(baseCameraManagement.getEndMile());
@@ -161,6 +211,10 @@ public class GeoHazardMonitorTokenController {
                 e.printStackTrace();
                 throw new RuntimeException("构建失败");
             }
+            // app 消息推送
+            List<String> alias = new ArrayList<String>();
+            alias.add("sunhh");
+            JPushUtil.sendToRegistrationId(alias, "中奖通知!!!!", "中奖通知!!!!!", "恭喜你中了100000000个亿!!!!", "https://www.baidu.com");
             log.info("baseCameraManagement:{}", baseCameraManagement);
             if (ObjectUtils.isEmpty(reqMsgAlarmVo.getLineDir())) {
                 reqMsgAlarmVo.setLineDir(baseCameraManagement.getLineDir());
@@ -231,6 +285,13 @@ public class GeoHazardMonitorTokenController {
         return obj.toJSONString();
     }
 
+    private String objStrString(String msgAlarmResp, int status) {
+        JSONObject obj = new JSONObject();
+        obj.put("pipelineId", msgAlarmResp); //流水线ID
+        obj.put("status", status);
+        return obj.toJSONString();
+    }
+
     /**
      * 设备状态数据传输
      *

+ 376 - 0
hazard-sdk/src/main/java/com/ozs/jpush/JPushUtil.java

@@ -0,0 +1,376 @@
+package com.ozs.jpush;
+
+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 cn.jpush.api.schedule.ScheduleResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/13 11:19
+ */
+@Slf4j
+@Component
+public class JPushUtil {
+
+//    AppKey : 1712ced750e33d75d18cb577
+//    Master Secret : e4b8ba2eda2acd0f75177b88
+    private final static String APPKER = "1712ced750e33d75d18cb577";
+    private final static String MASTERSECRET = "e4b8ba2eda2acd0f75177b88";
+//    private final static String APPKER = "2a59ed096611fb4b82f08a44";
+//    private final static String MASTERSECRET = "a121413e4b89b0a4b3998fe0";
+
+    /**
+     * 推送给设备标识参数的用户
+     */
+    public static int sendToRegistrationId(List<String> alias, String notification_title, String msg_title, String msg_content, String extrasparam) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAllAliasAlertWithTitle(alias, notification_title, msg_title, msg_content, extrasparam);
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            if (pushResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]PushResult result is " + pushResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 推送给设备标识参数的用户(定时)
+     */
+    public static int sendToRegistrationId2(List<String> alias, String notification_title, String msg_title, String msg_content, String extrasparam, String time) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAllAliasAlertWithTitle(alias, notification_title, msg_title, msg_content, extrasparam);
+            ScheduleResult scheduleResult = jPushClient.createSingleSchedule("测试", time, pushPayload);
+            if (scheduleResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]ScheduleResult result is " + scheduleResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 发送给所有安卓用户
+     */
+    public static int sendToAllAndroid(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAndroidAllAlertWithTitle(notification_title, msg_title, msg_content, extrasparam);
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            if (pushResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]PushResult result is " + pushResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 发送给所有IOS用户
+     */
+    public static int sendToAllIos(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectIosAllAlertWithTitle(notification_title, msg_title, msg_content, extrasparam);
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            if (pushResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]PushResult result is " + pushResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 发送给所有用户
+     */
+    public static int sendToAll(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAndroidAndIos(notification_title, msg_title, msg_content, extrasparam);
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            if (pushResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]PushResult result is " + pushResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 发送给所有用户(定时推送)
+     */
+    public static int sendToAll2(String notification_title, String msg_title, String msg_content, String extrasparam, String time) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAndroidAndIos(notification_title, msg_title, msg_content, extrasparam);
+            ScheduleResult scheduleResult = jPushClient.createSingleSchedule("测试", time, pushPayload);
+            if (scheduleResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]scheduleResult result is " + scheduleResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    public static PushPayload buildPushObjectAndroidAndIos(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        return PushPayload.newBuilder()
+                .setPlatform(Platform.android_ios())
+                .setAudience(Audience.all())
+                .setNotification(Notification.newBuilder()
+                        .setAlert(msg_content)
+                        .addPlatformNotification(AndroidNotification.newBuilder()
+                                .setAlert(msg_content)
+                                .setTitle(notification_title)
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                .build()
+                        )
+                        .addPlatformNotification(IosNotification.newBuilder()
+                                //传一个IosAlert对象,指定apns title、title、subtitle等
+                                .setAlert(msg_content)
+                                //直接传alert
+                                //此项是指定此推送的badge自动加1
+                                .incrBadge(1)
+                                //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
+                                // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
+                                .setSound("sound.caf")
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                //此项说明此推送是一个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("url", extrasparam)
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(true)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
+                        .setTimeToLive(86400)
+                        .build()
+                )
+                .build();
+    }
+
+    private static PushPayload buildPushObjectAllAliasAlertWithTitle(List<String> alias, String notification_title, String msg_title, String msg_content, String extrasparam) {
+        //创建一个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(alias))
+//                .setAudience(Audience.registrationId(registrationId))
+                //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
+                .setNotification(Notification.newBuilder()
+                        //指定当前推送的android通知
+                        .addPlatformNotification(AndroidNotification.newBuilder()
+                                .setAlert(msg_content)
+                                .setTitle(notification_title)
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                .build())
+                        //指定当前推送的iOS通知
+                        .addPlatformNotification(IosNotification.newBuilder()
+                                //传一个IosAlert对象,指定apns title、title、subtitle等
+                                .setAlert(msg_content)
+                                //直接传alert
+                                //此项是指定此推送的badge自动加1
+                                .incrBadge(1)
+                                //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
+                                // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
+                                .setSound("sound.caf")
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                //此项说明此推送是一个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("url", extrasparam)
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(true)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天;
+                        .setTimeToLive(86400)
+                        .build())
+                .build();
+    }
+
+    private static PushPayload buildPushObjectAndroidAllAlertWithTitle(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        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(msg_content)
+                                .setTitle(notification_title)
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                .build())
+                        .build()
+                )
+                //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
+                // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
+                // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
+                .setMessage(Message.newBuilder()
+                        .setMsgContent(msg_content)
+                        .setTitle(msg_title)
+                        .addExtra("url", extrasparam)
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(true)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
+                        .setTimeToLive(86400)
+                        .build())
+                .build();
+    }
+
+    private static PushPayload buildPushObjectIosAllAlertWithTitle(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        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(msg_content)
+                                //直接传alert
+                                //此项是指定此推送的badge自动加1
+                                .incrBadge(1)
+                                //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
+                                // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
+                                .setSound("sound.caf")
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                //此项说明此推送是一个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("url", extrasparam)
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(true)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
+                        .setTimeToLive(86400)
+                        .build())
+                .build();
+    }
+
+//    public static void main(String[] args) {
+//        List<String> alias = new ArrayList<String>();
+//        alias.add("sunhh");
+////        alias.add("wangyy");
+//        //sendToRegistrationId(alias, "中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com");
+//        //sendToRegistrationId2(alias,"中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com","2021-07-14 17:54:00");
+////        sendToAllAndroid("中奖通知!!!!", "中奖通知!!!!!", "恭喜你中了100000000个亿!!!!", "https://www.baidu.com");
+//         sendToAllIos("中奖通知", "中奖通知", "恭喜你中了100个亿", "https://www.baidu.com");
+//         // sendToAll("中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com");
+//        //sendToAll2("中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com","2021-07-14 17:54:00");
+//    }
+}

+ 1 - 1
hazard-sdk/src/main/java/com/ozs/websocket/WebSocketServer.java

@@ -112,7 +112,7 @@ public class WebSocketServer {
     }
 
     // 此为单点消息(多人)
-    public void sendMoreMessage(String[] userIds, String message) {
+    public void sendMoreMessage(List<String> userIds, String message) {
         for(String userId:userIds) {
             Session session = sessionPool.get(userId);
             if (session != null&&session.isOpen()) {