默认
发表评论 12
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已解决] MobileIMSDK-Web端未离线回调APP端互通过来的消息
阅读(35397) | 评论(12 收藏 淘帖
我在WEB端的nodejs里已经按文档设置了回调:
// 设置离线消息处理回调
imServerSDK.setCallBack_processC2COfflineMessage(callBack_processC2COfflineMessage);
同时callBack_processC2COfflineMessage也定义好了:
function callBack_processC2COfflineMessage(p){
    logger.info('[应用层-回调] 客户端C2C消息实时发送没成功,需要做离线消息处理(%s)', JSON.stringify(p));

    contentCheck(p, 2);
}

可是在APP给离线的WEB用户发消息时,在WEB控制台显示:
[2017-09-18 14:40:30.053] [WARN] console - [SDKUtils] 很遗憾[CAUSE:!socket],因未设置fnProcessOfflineMessage回调,消息 {"bridge":false,"type":2,"dataContent":"{\n  \"type\" : \"normalMsg\",\n  \"resList\" : {\n    \"message\" : \"33333\"\n  }\n}","from":"6","to":"7","fp":"526CFA02-FCD4-4ABA-A232-A030279300CD","QoS":true,"typeu":0}无法作离线回调处理,将被抛弃!

说我未定义回调离线消息。这是什么情况?

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

推荐方案
评论 12
这应该是没设置好回调函数,你把设置“imServerSDK.setCallBack_processC2COfflineMessage(callBack_processC2COfflineMessage);”这段代码的前后代码多贴一点出来,越多越好,看的全一点,我看看是否是设置的时机不对。
引用:JackJiang 发表于 2017-09-18 15:07
这应该是没设置好回调函数,你把设置“imServerSDK.setCallBack_processC2COfflineMessage(callBack_proces ...

var app = require('../app');
//var debug = require('debug')('TalkM_WebIM:server');
var http = require('http');

//var http = require('https');
var fs = require('fs');
const options = {
    key: fs.readFileSync('./ca/daliao.key'),
    ca: fs.readFileSync('./ca/daliao.pem'),
    cert: fs.readFileSync('./ca/daliao.pem'),
    ciphers: ['ECDHE-RSA-AES128-GCM-SHA256','ECDHE','ECDH','AES,HIGH','!NULL','!aNULL','!MD5','!ADH','!RC4'].join(':'),
};

var config = require('../j_conf/config');
var imConfig = require('../j_conf/config');
var common = require('../j_common/common');
var logger = require('../j_conf/log').logger;


/** -----------------------------------------------------------------------------------
 * Get port from environment and store in Express.
 */

var port = common.normalizePort(process.env.PORT || '3000');
app.set('port', port);


/** -----------------------------------------------------------------------------------
 * Create HTTP server.
 */

var server = http.createServer(app);
//var server = http.createServer(options, app);

/** -----------------------------------------------------------------------------------
 * Create WebSocket server.
 */

// 设置要连接的MQ消息中间件URL地址
imConfig.im_mq_server_url = IMMQ_IMBRIDGE_URL;
//
var imServerSDK = require('../j_imserver_sdk/im-server-sdk');
// 创建服务端的IM SDK管理实例
imServerSDK.createServer(server);
// 设置连接认证回调
imServerSDK.setCallBack_checkAuthToken(callBack_CheckAuthToken);
// 设置用户上线回调
imServerSDK.setCallBack_userOnline(callBack_userOnline);
// 设置用户离线回调
imServerSDK.setCallBack_userOffline(callBack_userOffline);
// 设置C2S消息回调
imServerSDK.setCallBack_receivedC2SMessage(callBack_receivedC2SMessage);
// 设置C2C消息回调
imServerSDK.setCallBack_transferedC2CMessage(callBack_transferedC2CMessage);
// 设置离线消息处理回调
imServerSDK.setCallBack_processC2COfflineMessage(callBack_processC2COfflineMessage);
// 设置个人认证后信息的处理回调
imServerSDK.setCallBack_authedInfo(callBack_authedInfo);

var userP = require("../j_imserver_sdk/user-processor");
var userPObj = new userP();
引用:JackJiang 发表于 2017-09-18 15:07
这应该是没设置好回调函数,你把设置“imServerSDK.setCallBack_processC2COfflineMessage(callBack_proces ...

我这块的代码好像是当时你传给我的WEB端的样例的www.js改的。我没调整过顺序。
我查到你的初始化方法里好像没设置回调。就是其中的 sendDataLocal4OnlineOrOffline(null, p, null);这句。
function _init(){

    /** -----------------------------------------------------------------------------------
     * 启动MQ中间件服务(开启桥接跨服消息的处理).
     */

    // 需要与APP版的互通
    if (config.im_bridge_enabled) {

            // 设置MQ桥接消息回调:以下回调函数将在nodejs端的MQProvider中当收到MQ的消息时进行回调,应用层通过此回调来进行消息转发处理
            // 本回调的返回值说明:true表示此消息正确处理完成,false表示未成功处理(MQ会将原消息重放回队列以便下次再取到)。
        imMQProvider.setCallBack_forWork(function (p) {
            try {
                // 如果nodejs端通过桥接(收到的是APP端发过来的消息)收到的消息不为空则尝试在本nodejs机器发送(给用户)
                if (p) {
                    logger.debug('[IMSDK-MQ↓]【桥接收】callBack_forWork回调中收到Protocal对象:[%s], 马上通过本机的WebIM发送之!'
                        , JSON.stringify(p));

                    // 发送消息(此方法内的sendData实际上会通过回调处理在线和不在线的情况,只管调用就是了)
                    // ## Bug fixed by js 20160922: 之前错误地把p.to写成了p.toLocalString而导致收消息时
                    // ## - 出现"RabbitMQ Error Code 504"(原因是错误地代码使得sendProtocalForOnlineOrOffline发生异常,
                    // ## - 因没有try catch而蔓延至MQProvider里的处理代码)!
                    //sendDataLocal4OnlineOrOffline(userProcessor.getSession(p.to), p);
                    sendDataLocal4OnlineOrOffline(null, p, null);// 因为桥接消息是由服务端代码,所以第一个参数(发送者的socket引用)自然填null
                    return true;
                }
                else {
                    logger.error('[IMSDK-MQ↓]【桥接收】callBack_forWork回调中收到无效的Protocal对象:%s,【本条处理没有继续】', JSON.stringify(p));
                    //return false;
                    return true;// 【注意】尽量不要返回false,不然消息被放回队列后容易死循环,出错作好记录备查即可!
                }
            }
            catch (e) {
                logger.error('[IMSDK-MQ↓]【桥接收】callBack_forWork回调中出错了,消息内容:[%s],错误原因:[%s]【本条处理没有继续】'
                    , JSON.stringify(p), JSON.stringify(e));
                return true;// 【注意】尽量不要返回false,不然消息被放回队列后容易死循环,出错作好记录备查即可!
            }

        });
        // 启动MQ中件件服务
        imMQProvider.start();

        logger.info("[IMSDK] 配置项:已开启与MobileIMSDK APP的互通【ok】.");
    }
    else{
        logger.info("[IMSDK] 配置项:未开启与MobileIMSDK Web的互通【no】.");
    }

引用:heavenK 发表于 2017-09-18 15:13
我这块的代码好像是当时你传给我的WEB端的样例的www.js改的。我没调整过顺序。

OK,我知道你的问题了,你是不是在服务端调用sendData方法发送数据出现的这个提示?
引用:JackJiang 发表于 2017-09-18 15:22
OK,我知道你的问题了,你是不是在服务端调用sendData方法发送数据出现的这个提示?

服务端?我是在IOS客户端调用的sendCommonData方法发送的。服务端只做保存到数据库的处理,没做消息中转处理。
引用:JackJiang 发表于 2017-09-18 15:22
OK,我知道你的问题了,你是不是在服务端调用sendData方法发送数据出现的这个提示?

我这面就是进行的客户端发消息到客户端的操作。
引用:heavenK 发表于 2017-09-18 15:27
我这面就是进行的客户端发消息到客户端的操作。

你的意思是,你基本上没有改过web端的代码,现在做的操作是app通过桥接发送到web端时给出的提示?
引用:JackJiang 发表于 2017-09-18 15:51
你的意思是,你基本上没有改过web端的代码,现在做的操作是app通过桥接发送到web端时给出的提示?

嗯,我就是在每个回调方法里加一些我自己的保存数据库的相关操作。然后把http改成了https,其它没怎么动。我现在遇到的问题就是app给一个在web端登录后退出的账号发消息。在WEB端会提示我回调未设置。然后你看一下我在5楼回复的截图,是不是那里有问题?我看那块没写回调。
引用:heavenK 发表于 2017-09-18 16:26
嗯,我就是在每个回调方法里加一些我自己的保存数据库的相关操作。然后把http改成了https,其它没怎么动 ...

问题已经核实了,这是MobileIMSDK-Web版的一个bug,影响的版为v3.1.0及之前的版本,此问题将在v3.2.0的发布版中解决!

我先把修改bug后的代码发给你,省的你要等到版本发布了才能用,最终的版本肯定是跟给你的代码是同步的,放心使用,请见附件(替换您MobileIMSDK-Web下的同名文件即可):
im-server-sdk.js (30.36 KB , 下载次数: 4 )

点评

JackJiang  说:
此为本贴的最佳答案!  (7 年前)
引用:JackJiang 发表于 2017-09-18 16:39
问题已经核实了,这是MobileIMSDK-Web版的一个bug,影响的版为v3.1.0及之前的版本,此问题将在v3.2.0的发 ...

好的。多谢了。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部