Skip to content
iuapwuxiaoliang edited this page Dec 13, 2016 · 3 revisions

消息推送在app中的应用

summer集成了一系列关于有信消息推送的api,通过summer.callCordova()方法调用这些api能够实现获取消息列表,实时监控消息等功能;

一、api介绍

1.登录有信

     var json = {
     		"method": "YYIM.login",
     		"params": {
     			"userinfo": userinfo
     		}
     	}
     summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
参数
  • params: json字符串 需要传递的参数,登录有信需要传入用户的信息;
  • method 封装有信的接口;

2.获取用户的消息列表

     var command = {
                 "method": "YYIM.fetchMessages",
                 "params": {
                     "callback": "callback()" // 收到消息时候回调
                 }
     }
     summer.callCordova("summer-plugin-service.XService", "callSync", command,null,null);
参数
  • params: json字符串 传入回调函数,获取消息的数据储存在回调函数的参数中,在回调函数中处理返回的数据;
  • method 封装有信的接口;

3.监听实时消息推送

      var json = {
                 "method": "YYIM.registerMessageObserver",
                 "params": {
                     "callback": "callback()" // 收到消息时候回调
                 }
      }
      summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
参数
  • params: json字符串 传入回调函数,获取消息的数据储存在回调函数的参数中,在回调函数中处理返回的数据;
  • method 封装有信的接口;

4.消息设为已读

     var json = {
                 "method": "YYIM.updateMessageReaded",
                 "params": {
                     "accountID": id    // 获取的消息ID
                 }
     }
     summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
参数
  • params: json字符串 将已经查过的消息设置为已读,需要传入通知类消息的ID值;
  • method 封装有信的接口;

5.打开聊天界面

     var json = {
                 "method": "YYIM.chat",
                 "params": {
                     "chatID": id, // 从消息列表获取
                 }
     }
     summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
参数
  • params: json字符串 传入聊天类消息的ID值,进入聊天界面;
  • method 封装有信的接口;

6.更新用户信息

     var json = {
             "method": "YYIM.updateUserInfo",
             "params": {
                 "userPhoto": src,   //  头像图片地址
                  "userName" :name   //用户的昵称
             }
     }
     summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
参数
  • params: json字符串 传入用户新头像的url地址或者用户的新昵称 ;
  • method 封装有信的接口;

7.退出有信

    var params = {
    		"method": "YYIM.logout",
    	}
     summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
参数
  • method 封装有信的接口;

二、消息推送在友人才中的应用实例

消息推送已经再友人才app中成功应用,本处结合友人才的应用场景,具体介绍消息推送api的使用。

1、首页面登录有信

在首页上需要获取用户的用户信息,信息包括用户名称,用户密码和用户账号,调用YYIM.login的方法登录有信,实现与有信的沟通。
//登录有信 IM
function loginIm(){
	var account = JSON.parse(localStorage.getItem("account"));
	var userinfo = {
		"usercode": account.usercode,
		"password": account.pwd,
		"userName": account.username
	}
	var params = {
		"method": "YYIM.login",
		"params": {
			"userinfo": userinfo
		}
	}
	cordova.exec(null, null, "XService", "callSync", [params]);
}

2、消息页面调用获取用户所有消息和实时监测消息推送

2.1 获取用户所有消息

在进入消息页面后,调用YYIM.fetchMessages方法,获取用户所有的消息信息。
     summerready = function () {
            callFetchMessages(); //获取用户所有消息
            getNewInfo();        //监控实时消息推送
            summer.window.setRefreshHeaderInfo({ //下拉刷新,重新获取用户消息
                visible: true,
                bgColor: '#ffffff',
                textColor: '#4d4d4d',
                textDown: '下拉刷新...',
                textUp: '松开刷新...',
                showTime: true
            }, function (ret, err) {
                callFetchMessages();
                summer.window.refreshHeaderLoadDone();
            });
        };
    function callFetchMessages() {

            var json = {
                "method": "YYIM.fetchMessages",
                "params": {
                    "callback": "getMessages()"
                }
            }
            summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);

        }
在回调函数中处理获取到的数据,渲染到页面中。友人才用doT模板引擎,绑定数据,渲染信息列表。
        //将获取到的消息列表填充到页面中
        function getMessages(args) {
            var result = JSON.parse(args.result);
            commonData.allData = result;
            var tText = doT.template($("#template").html());
            $(".table-view").html(tText(result));
            getUnReadNum(result);
        }

2.2、实时监测消息推送

用户有新消息时,会触发getNewInfo()方法,调用YYIM.registerMessageObserver方法。
           //监听实时推送
           function getNewInfo() {
               var json = {
                   "method": "YYIM.registerMessageObserver",
                   "params": {
                       "callback": "receiveMessage()" // 收到消息时候回调
                   }
               }
               summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
           }
在回调函数中处理获取到的数据,判断消息的ID是否存在,如果ID存在,则删除原有消息,创建新消息置顶,如果ID不存在,直接创建新消息置顶。注意:消息推送每次只推送一条数据。
         function receiveMessage(args) {
                var message = JSON.parse(args.result);
                //未读消息变化
                commonData.unReadNum += message.newCount;
                //更新角标
                refreshCorner();
                //匹配新消息
                var matchInfo=matchNewMessage(message,commonData.allData);
                if (message.type == 'chat') {
                    if (matchInfo.isSame) {
                        //返回的信息newCount=0,为从聊天页面返回消息页
                        if (message.newCount == 0) {
                            commonData.unReadNum -= commonData.allData[matchInfo.index].newCount;
                            refreshCorner();
                            //修改commonData.allData的值保持同步
                            commonData.allData[matchInfo.index].newCount=0;
                        }
                        else {
                            message.newCount += commonData.allData[matchInfo.index].newCount;
                        }
                        /*删去原来聊天列表*/
                        removeOldItem('.chat',matchInfo.index,commonData.allData,matchInfo.sameIndex)
                        /*创建新聊天列表*/
                        createChatItem(message);
                    } else {
                        createChatItem(message);
                    }
                } else {
                    //新增消息项
                    if (matchInfo.isSame) {
                        var newCount = commonData.allData[matchInfo.index].newCount + message.newCount;
                        //监听信息的未读数改为原来+1
                        message.newCount = newCount;
                        /*删除原来的消息列表*/
                        removeOldItem('.pubaccount',matchInfo.index,commonData.allData,matchInfo.sameIndex);
                        /*创建新的消息列表*/
                        createMessageItem(message);
                    } else {
                        createMessageItem(message);
                    }
                }
         }

3、 点击信息列表进入聊天页面或者消息页面

3.1、 进入聊天页面,调用YYIM.chat方法,聊天页面为原生页面。

        //打开聊天方法
        function openChat(obj) {
            watchReadNum(obj); //打开聊天界面时,未读消息数量变化
            var id = $(obj).attr('data-id'); //获取聊天信息的ID
            var command = {
                "method": "YYIM.chat",
                "params": {
                    "chatID": id, // 从消息列表获取
                }
            }
            summer.callCordova("summer-plugin-service.XService", "callSync", command,null,null);
        }

3.2、进入消息页面,消息页面为web页面,需要打开一个window。

        //打开消息页面
        function openWin(obj) {
            watchReadNum(obj);//检测打开未读消息时未读消息总数变化
            var num = null;
            var id = $(obj).attr("data-id");
            callUpdateMessageReaded(id);
            if (id == 'daibantongzhi') {
                num = 303;
            }
            if (id == 'xitongxiaoxi') {
                num = 304;
            }
            summer.openWin({
                id: 'first-head',
                url: 'html/first-head.html',
                pageParam: {
                    count: num
                }
            });
        }

4、全局变量的维护

        //创建全局维护的变量
        var commonData={
            //保存用户全部消息数据;
            allData:[],
            //保存未读消息总数;
            unReadNum:0
        }
创建全局变量commonData,allData主要用来本地保存用户消息数据,unReadNum主要用来保存未读消息的总数,实时更新消息项角标的数据。

4.1、allData的维护

allData的数据同步主要在以下几个地方:
  • 1.首次请求数据,将请求的数据赋值给allData;
  • 2.新消息推送过来时,判断消息ID是否存在,如果存在,删去allData中的旧数据,将新数据放到allData的头条位置;不存在,则直接将新数据放到allData的头条位置。
  • 3.下拉刷新时,将获取到的数据重新赋值给allData;

4.2、unReadNum的维护

unReadNum的更新与角标的更新要同步执行,unReadNum的数据同步主要在以下几个地方:
  • 1.请求全部数据时,遍历数据将未读数据的总和赋值给unReadNum;
  • 2.打开消息界面或者聊天界面,unReadNum需要减去该信息的未读数;
  • 3.新消息推送时,判断新消息数据的newCount值,为空表示从聊天页面返回消息页面,需要减去聊天页面中推送的消息数;为1,则unReadNum直接+1。

三、个人信息修改界面更新用户信息

更新用户信息时,将用户头像的新地址或者用户的新昵称传入YYIM.updateUserInfo方法中,同步用户在有信中的信息。
    function setIm(src){
        var json = {
            "method": "YYIM.updateUserInfo",
            "params": {
                "userPhoto": src //  头像图片地址
            }
        }
        summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
    }

四、用户退出登录同时退出有信

用户在退出登录时,会同时退出有信,调用YYIM.logout方法,该方法不用传递参数
    //退出有信
    function quitIm(){
    	var json = {
    		"method": "YYIM.logout",
    		"params":{}
    	}
        summer.callCordova("summer-plugin-service.XService", "callSync", json,null,null);
    }

Clone this wiki locally