Skip to content

Commit c30b7ba

Browse files
author
zhanq
committed
添加已读消息回执
1 parent fd977b4 commit c30b7ba

File tree

5 files changed

+179
-25
lines changed

5 files changed

+179
-25
lines changed

android/src/io/jchat/android/Constant.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,21 @@ public class Constant {
133133
public static final String JOIN_GROUP_TIME = "joinGroupTime";
134134
public static final String IS_SILENCE = "isSilence";
135135

136+
/*
137+
* message receiptResult
138+
* */
139+
public static final String RECEIPT_RESULT = "receiptResult";
140+
public static final String UN_RECEIPT_COUNT = "unReceiptCount";
141+
public static final String UN_RECEIPT_M_TIME = "unReceiptMTime";
142+
143+
/**
144+
* MessageSendingOptions
145+
*/
146+
public static final String IS_RETAIN_OFFLINE = "isRetainOffline";
147+
public static final String IS_SHOW_NOTIFICATION = "isShowNotification";
148+
public static final String IS_CUSTOM_NOTIFICATION_ENABLED = "isCustomNotificationEnabled";
149+
public static final String NOTIFICATION_TITLE = "notificationTitle";
150+
public static final String NOTIFICATION_TEXT = "notificationText";
151+
public static final String NEED_READ_RECEIPT = "needReadReceipt";
152+
136153
}

android/src/io/jchat/android/JMessageModule.java

Lines changed: 88 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import cn.jpush.im.android.api.event.GroupApprovedNotificationEvent;
6262
import cn.jpush.im.android.api.event.LoginStateChangeEvent;
6363
import cn.jpush.im.android.api.event.MessageEvent;
64+
import cn.jpush.im.android.api.event.MessageReceiptStatusChangeEvent;
6465
import cn.jpush.im.android.api.event.MessageRetractEvent;
6566
import cn.jpush.im.android.api.event.NotificationClickEvent;
6667
import cn.jpush.im.android.api.event.OfflineMessageEvent;
@@ -82,6 +83,7 @@ public class JMessageModule extends ReactContextBaseJavaModule {
8283

8384
private static final String TAG = "JMessageModule";
8485
private static final String RECEIVE_MSG_EVENT = "JMessage.ReceiveMsgEvent";
86+
private static final String RECEIPT_MSG_EVENT = "JMessage.ReceiptMsgEvent";
8587
private static final String LOGIN_STATE_CHANGE_EVENT = "JMessage.LoginStateChanged"; //
8688
private static final String CLICK_NOTIFICATION_EVENT = "JMessage.ClickMessageNotification"; // 点击推送 Android Only
8789
private static final String SYNC_OFFLINE_EVENT = "JMessage.SyncOfflineMessage"; // 同步离线消息事件
@@ -377,17 +379,20 @@ public void sendMessage(ReadableMap map, final Callback success, final Callback
377379
if (map.hasKey(Constant.SENDING_OPTIONS)) {
378380
MessageSendingOptions options = new MessageSendingOptions();
379381
ReadableMap optionMap = map.getMap(Constant.SENDING_OPTIONS);
380-
options.setShowNotification(optionMap.getBoolean("isShowNotification"));
381-
options.setRetainOffline(optionMap.getBoolean("isRetainOffline"));
382+
options.setShowNotification(optionMap.getBoolean(Constant.IS_SHOW_NOTIFICATION));
383+
options.setRetainOffline(optionMap.getBoolean(Constant.IS_RETAIN_OFFLINE));
382384

383-
if (optionMap.hasKey("isCustomNotificationEnabled")) {
384-
options.setCustomNotificationEnabled(optionMap.getBoolean("isCustomNotificationEnabled"));
385+
if (optionMap.hasKey(Constant.IS_CUSTOM_NOTIFICATION_ENABLED)) {
386+
options.setCustomNotificationEnabled(optionMap.getBoolean(Constant.IS_CUSTOM_NOTIFICATION_ENABLED));
385387
}
386-
if (optionMap.hasKey("notificationTitle")) {
387-
options.setNotificationTitle(optionMap.getString("notificationTitle"));
388+
if (optionMap.hasKey(Constant.NOTIFICATION_TITLE)) {
389+
options.setNotificationTitle(optionMap.getString(Constant.NOTIFICATION_TITLE));
388390
}
389-
if (optionMap.hasKey("notificationText")) {
390-
options.setNotificationText(optionMap.getString("notificationText"));
391+
if (optionMap.hasKey(Constant.NOTIFICATION_TEXT)) {
392+
options.setNotificationText(optionMap.getString(Constant.NOTIFICATION_TEXT));
393+
}
394+
if(optionMap.hasKey(Constant.NEED_READ_RECEIPT)){
395+
options.setNeedReadReceipt(optionMap.getBoolean(Constant.NEED_READ_RECEIPT));
391396
}
392397
JMessageClient.sendMessage(message, options);
393398
} else {
@@ -1517,17 +1522,20 @@ public void forwardMessage(ReadableMap map, final Callback success, final Callba
15171522
if (map.hasKey(Constant.SENDING_OPTIONS)) {
15181523
options = new MessageSendingOptions();
15191524
ReadableMap optionMap = map.getMap(Constant.SENDING_OPTIONS);
1520-
options.setShowNotification(optionMap.getBoolean("isShowNotification"));
1521-
options.setRetainOffline(optionMap.getBoolean("isRetainOffline"));
1525+
options.setShowNotification(optionMap.getBoolean(Constant.IS_SHOW_NOTIFICATION));
1526+
options.setRetainOffline(optionMap.getBoolean(Constant.IS_RETAIN_OFFLINE));
15221527

1523-
if (optionMap.hasKey("isCustomNotificationEnabled")) {
1524-
options.setCustomNotificationEnabled(optionMap.getBoolean("isCustomNotificationEnabled"));
1528+
if (optionMap.hasKey(Constant.IS_CUSTOM_NOTIFICATION_ENABLED)) {
1529+
options.setCustomNotificationEnabled(optionMap.getBoolean(Constant.IS_CUSTOM_NOTIFICATION_ENABLED));
1530+
}
1531+
if (optionMap.hasKey(Constant.NOTIFICATION_TITLE)) {
1532+
options.setNotificationTitle(optionMap.getString(Constant.NOTIFICATION_TITLE));
15251533
}
1526-
if (optionMap.hasKey("notificationTitle")) {
1527-
options.setNotificationTitle(optionMap.getString("notificationTitle"));
1534+
if (optionMap.hasKey(Constant.NOTIFICATION_TEXT)) {
1535+
options.setNotificationText(optionMap.getString(Constant.NOTIFICATION_TEXT));
15281536
}
1529-
if (optionMap.hasKey("notificationText")) {
1530-
options.setNotificationText(optionMap.getString("notificationText"));
1537+
if(optionMap.hasKey(Constant.NEED_READ_RECEIPT)){
1538+
options.setNeedReadReceipt(optionMap.getBoolean(Constant.NEED_READ_RECEIPT));
15311539
}
15321540
}
15331541
ReadableMap target = map.getMap(Constant.TARGET);
@@ -2076,6 +2084,53 @@ public void gotResult(int status, String desc) {
20762084
}
20772085
}
20782086

2087+
@ReactMethod
2088+
public void setMsgHaveRead(ReadableMap map, final Callback callback) {
2089+
String userName = map.getString(Constant.USERNAME);
2090+
String appKey = map.getString(Constant.APP_KEY);
2091+
String msgId = map.getString(Constant.ID);
2092+
String serverMsgId = map.getString(Constant.SERVER_ID);
2093+
WritableMap callbackMap = Arguments.createMap();
2094+
if(TextUtils.isEmpty(userName)||
2095+
TextUtils.isEmpty(appKey)||
2096+
TextUtils.isEmpty(msgId)||
2097+
TextUtils.isEmpty(serverMsgId)){
2098+
callbackMap.putInt(Constant.CODE, ERR_CODE_CONVERSATION);
2099+
callbackMap.putString(Constant.DESCRIPTION, ERR_MSG_CONVERSATION);
2100+
callback.invoke(callbackMap);
2101+
return;
2102+
}
2103+
Conversation conversation = JMessageClient.getSingleConversation(userName, appKey);
2104+
if(conversation==null){
2105+
callbackMap.putInt(Constant.CODE, ERR_CODE_CONVERSATION);
2106+
callbackMap.putString(Constant.DESCRIPTION, ERR_MSG_CONVERSATION);
2107+
callback.invoke(callbackMap);
2108+
return;
2109+
}
2110+
//优先使用msgId获取conversation,获取不到再使用serverMsgId获取
2111+
Message message = conversation.getMessage(Integer.parseInt(msgId));
2112+
if(message==null){
2113+
message = conversation.getMessage(Long.parseLong(serverMsgId));
2114+
}
2115+
if (message == null){
2116+
callbackMap.putInt(Constant.CODE, ERR_CODE_MESSAGE);
2117+
callbackMap.putString(Constant.DESCRIPTION, ERR_MSG_MESSAGE);
2118+
callback.invoke(callbackMap);
2119+
return;
2120+
}
2121+
if (!message.haveRead()) {
2122+
message.setHaveRead(new BasicCallback() {
2123+
@Override
2124+
public void gotResult(int i, String s) {
2125+
WritableMap map = Arguments.createMap();
2126+
map.putInt(Constant.CODE, i);
2127+
map.putString(Constant.DESCRIPTION, s);
2128+
callback.invoke(map);
2129+
}
2130+
});
2131+
}
2132+
}
2133+
20792134
public void onEvent(LoginStateChangeEvent event) {
20802135
Logger.d(TAG, "登录状态改变事件:event = " + event.toString());
20812136
WritableMap map = Arguments.createMap();
@@ -2091,6 +2146,23 @@ public void onEvent(MessageEvent event) {
20912146
.emit(RECEIVE_MSG_EVENT, ResultUtils.toJSObject(msg));
20922147
}
20932148

2149+
/*
2150+
* 收到已读回执
2151+
* */
2152+
public void onEventMainThread(MessageReceiptStatusChangeEvent event) {
2153+
WritableMap map = Arguments.createMap();
2154+
Conversation conv = event.getConversation();
2155+
for (MessageReceiptStatusChangeEvent.MessageReceiptMeta meta : event.getMessageReceiptMetas()) {
2156+
WritableMap receiptMap = Arguments.createMap();
2157+
receiptMap.putString(Constant.SERVER_ID, String.valueOf(meta.getServerMsgId()));
2158+
receiptMap.putInt(Constant.UN_RECEIPT_COUNT, meta.getUnReceiptCnt());
2159+
receiptMap.putString(Constant.UN_RECEIPT_M_TIME, String.valueOf(meta.getUnReceiptMtime()));
2160+
map.putMap(Constant.RECEIPT_RESULT, receiptMap);
2161+
}
2162+
getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
2163+
.emit(RECEIPT_MSG_EVENT, map);
2164+
}
2165+
20942166
/**
20952167
* 漫游消息同步事件。
20962168
*

android/src/io/jchat/android/utils/JMessageUtils.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,21 @@ public void gotResult(int status, String desc) {
7474
if (map.hasKey(Constant.SENDING_OPTIONS)) {
7575
MessageSendingOptions options = new MessageSendingOptions();
7676
ReadableMap optionMap = map.getMap(Constant.SENDING_OPTIONS);
77-
options.setShowNotification(optionMap.getBoolean("isShowNotification"));
78-
options.setRetainOffline(optionMap.getBoolean("isRetainOffline"));
7977

80-
if (optionMap.hasKey("isCustomNotificationEnabled")) {
81-
options.setCustomNotificationEnabled(
82-
optionMap.getBoolean("isCustomNotificationEnabled"));
78+
options.setShowNotification(optionMap.getBoolean(Constant.IS_SHOW_NOTIFICATION));
79+
options.setRetainOffline(optionMap.getBoolean(Constant.IS_RETAIN_OFFLINE));
80+
81+
if (optionMap.hasKey(Constant.IS_CUSTOM_NOTIFICATION_ENABLED)) {
82+
options.setCustomNotificationEnabled(optionMap.getBoolean(Constant.IS_CUSTOM_NOTIFICATION_ENABLED));
83+
}
84+
if (optionMap.hasKey(Constant.NOTIFICATION_TITLE)) {
85+
options.setNotificationTitle(optionMap.getString(Constant.NOTIFICATION_TITLE));
8386
}
84-
if (optionMap.hasKey("notificationTitle")) {
85-
options.setNotificationTitle(optionMap.getString("notificationTitle"));
87+
if (optionMap.hasKey(Constant.NOTIFICATION_TEXT)) {
88+
options.setNotificationText(optionMap.getString(Constant.NOTIFICATION_TEXT));
8689
}
87-
if (optionMap.hasKey("notificationText")) {
88-
options.setNotificationText(optionMap.getString("notificationText"));
90+
if(optionMap.hasKey(Constant.NEED_READ_RECEIPT)){
91+
options.setNeedReadReceipt(optionMap.getBoolean(Constant.NEED_READ_RECEIPT));
8992
}
9093
JMessageClient.sendMessage(msg, options);
9194
}

example/app/routes/Chat/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,17 @@ export default class Chat extends Component {
200200

201201
this.receiveMessageCallBack = (message) => {
202202

203+
console.log("收到消息"+JSON.stringify(message));
204+
const readParams = {
205+
// ...message,
206+
username: message.from.username,
207+
appKey: message.from.appKey,
208+
id: message.id,
209+
serverMessageId: message.serverMessageId
210+
}
211+
212+
JMessage.setMsgHaveRead(readParams,(result) => {})
213+
203214
if (this.conversation.type === 'single') {
204215
if (message.target.type === 'user') {
205216
if (message.from.username === this.conversation.username) {
@@ -225,6 +236,7 @@ export default class Chat extends Component {
225236
}
226237
}
227238
JMessage.addReceiveMessageListener(this.receiveMessageCallBack)
239+
JMessage.addReceiptMessageListener((result)=>{})
228240
}
229241
AuroraIController.addMessageListDidLoadListener(this.messageListDidLoadCallback)
230242
// this.timer = setTimeout(() => {
@@ -406,6 +418,7 @@ export default class Chat extends Component {
406418
Alert.alert('send text', JSON.stringify(msg))
407419

408420
msg.messageSendingOptions = {
421+
needReadReceipt: true,
409422
isShowNotification: true,
410423
isRetainOffline: true,
411424
isCustomNotificationEnabled: true,

index.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const JMessageModule = NativeModules.JMessageModule;
88

99
const listeners = {};
1010
const receiveMsgEvent = "JMessage.ReceiveMsgEvent"; // 接收到消息事件
11+
const receiptMsgEvent = "JMessage.ReceiptMsgEvent"; // 接收已读消息回执事件
1112
const loginStateChanged = "JMessage.LoginStateChanged"; //
1213
const clickMessageNotificationEvent = "JMessage.ClickMessageNotification"; // 点击推送 Android Only
1314
const syncOfflineMessage = "JMessage.SyncOfflineMessage" // 同步离线消息事件
@@ -860,6 +861,20 @@ export default class JMessage {
860861
JMessageModule.setConversationExtras(params, success, error)
861862
}
862863

864+
/**
865+
* 设置消息已读
866+
* @param {object} params = {
867+
* 'username': String
868+
* 'appKey': String
869+
* 'id': String
870+
* 'serverMessageId': String
871+
* }
872+
* @param {function} result = function ({'code': '错误码', 'description': '错误信息'}) {}
873+
*/
874+
static setMsgHaveRead(params,result){
875+
JMessageModule.setMsgHaveRead(params,result)
876+
}
877+
863878
/**
864879
*
865880
* JMessage Events
@@ -893,6 +908,40 @@ export default class JMessage {
893908
listeners[listener] = null;
894909
}
895910

911+
/**
912+
* 添加收到消息事件监听。
913+
*
914+
* @param {function} listener = function (result) {} // 以参数形式返回消息对象。
915+
* result = {
916+
* receiptResult = {
917+
* 'serverMessageId': String
918+
* 'unReceiptCount': int
919+
* 'unReceiptMTime': String
920+
* },
921+
* receiptResult = {
922+
* 'serverMessageId': String
923+
* 'unReceiptCount': int
924+
* 'unReceiptMTime': String
925+
* },
926+
* ...
927+
*
928+
* }
929+
*/
930+
static addReceiptMessageListener(listener) {
931+
listeners[listener] = DeviceEventEmitter.addListener(receiptMsgEvent,
932+
(result) => {
933+
listener(result);
934+
});
935+
}
936+
937+
static removeReceiptMessageListener(listener) {
938+
if (!listeners[listener]) {
939+
return;
940+
}
941+
listeners[listener].remove();
942+
listeners[listener] = null;
943+
}
944+
896945
/**
897946
* 添加点击通知栏消息通知事件监听。
898947
* Note: Android only, (如果想要 iOS 端 实现相同的功能,需要同时集成 jpush-react-native)

0 commit comments

Comments
 (0)