个推消息推送,实现推送消息和语音合成

消息推送的实现:
1.打开应用的时候
2.通过plus.push.getClientInfo().clientid获取到clientid
3.接口传到服务器
4.进行判断表里是否存在该条数据,没有就插入,有则不插入,另外关联登录的companyid
5.在服务器进行轮询,如果有新的订单进入的时候,就调用消息接口,查询关联的companyid,推送消息到相应的门店的app
6.服务器集成phpsdk(使用composer安装https://packagist.org/?query=getui)
7.点击消息跳转到特定页面(在点击消息事件中进行跳转页面)
8.多进程处理
9.通过透传实现点餐语音提示
10.获取当前客户端的消息数据
11.设置当前客户端的消息配置
12.查询新消息的列表
13.扫码点餐下单后,获取到桌台号,进行md5加密,调用语音接口,生成语音文件,调用消息推送接口并传入文件路径,推送消息到前台,前台获取到消息的信息后,设置语音的路径,是否进行语音响铃的话,可以传入所有的client_id和sound的数组,进行循环,匹配到就进行sound的判断是否推送消息
14.扫码点餐和外卖,外卖通过小张的接口来实时的监听,扫码点餐
15.5+SDK获取client_id为null(https://blog.csdn.net/xiaomen417/article/details/76916390
16.低版本的安卓机推送的消息的logo是空白的
17.低版本的安卓播放语音,遇到逗号会停止,部分文字无法播放,例如:(龙王阁有新的订单),而(龙王阁有新的扫码点餐订单)可以播放,而且还受到语音长度的限制
18.本来是想把plusready写在vue的组件里的,但是这样只会执行一次,没有办法使用receive事件实时监听,所以只能把plusready放在index.html里,这样就会导致vue的路由问题,只能重新通过script标签引入router,但是我发现没法使用,应该是页面main.js没有加载完成,然后我使用mui.plusReady先加载完页面后,再去调用还是不行,路由已经是我想跳转的页面,大概是页面没加载完,找不到组件,所以我只能使用location.href来拼接url来进行跳转
19.安卓5.1.1通知栏logo空白
20.http://ask.dcloud.net.cn/question/28840(html5+语音设置)

php透传模板代码
public static function IGtTransmissionTemplateDemo($attributes)
    {
      extract($attributes);

      $template = new IGtTransmissionTemplate();
      $template->setAppId(APPID);//应用appid
      $template->setAppKey(APPKEY);//应用appkey
      $template->setTransmissionType(2);//透传消息类型
      $template->setTransmissionContent(json_encode([
        "url"      => $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST']."/speech/".md5($tablename).".mp3",
        "sound"    => $sound,
        "title"    => $title,
        "content"  => $content,
        "table_id" => $table_id,
        "tablename"=> $tablename,
        "type"     => $type,
        "time"     => time()
      ]));//透传内容
      //iOS推送需要设置的pushInfo字段
      //$template ->setPushInfo($actionLocKey,$badge,$message,$sound,$payload,$locKey,$locArgs,$launchImage);
      //$template ->setPushInfo('', 0, '', '', '', '', '', '');
      return $template;
    }
js代码
document.addEventListener( "plusready", function(){
          var messageList = [];
          var message = document.getElementById("message");
          // 监听点击消息事件
          plus.push.addEventListener( "click", function( msg ) {
              // alert(JSON.stringify(msg));
              // 判断是从本地创建还是离线推送的消息
              switch( msg.payload ) {
                  case "LocalMSG":
                      document.addEventListener("resume", function () {
                          mui.plusReady(function(){
                            // 循环清除通知栏
                            var all_message = plus.push.getAllMessage();
                            if(all_message.length > 0){
                              for(var i = 0; i < all_message.length; i++){
                                plus.push.remove(all_message[i]);
                              }
                            }
                            // 进行跳转,使用vue-router跳转失败
                            if(msg){
                              location.href = window.location.href.split('#')[0]+'#/msgcenter';
                            }
                            // 需要销毁这个对象,要不然每次启动app都会跳转到指定页面
                            msg = false;
                          })
                      }, false);
                      outSet( "点击本地创建消息启动:" );
                  break;
                  default:
                      outSet( "点击离线推送消息启动:");
                  break;
              }
              // 处理其它数据
              logoutPushMsg( msg );
          }, false );

          // 监听在线消息事件
          plus.push.addEventListener( "receive", function( msg ) {
              // alert(JSON.stringify(msg));
              // 把监听到的消息添加数组
              messageList.push(JSON.parse(msg.payload));
              // 排队只有队伍执行完了,才再次调用排队函数
              if(messageList.length == 1){
                queue(messageList);
              }

          }, false );
      }, false );

      // 消息进行排队设置
      function queue(messageList){
        if(messageList.length > 0){
          var reponse = messageList[0];
          // 创建消息
          plus.push.createMessage(reponse['content'],'LocalMSG',{"title":reponse['title'],"sound":"none","cover":false});
          // 如果设置了响铃,就apend一个audio到id为app的标签里
          if(reponse['sound'] == 't'){
            // createAudio(reponse['url'],reponse['table_id']);
            createSpeech(reponse);
          }
          // 延迟8秒后,再播放下一条通知
          setTimeout(function(){
            messageList.splice(0,1);
            queue(messageList);
          },10000);         
        }
      }
      // 创建audio标签(这块我之前是使用百度api的语音合成的phpSDK的,但是在5.1.1的安卓机没法完全播完(高版本的安卓机完全没有问题),老是播放一部分,实在没有找到解决的方案,感觉5+SDK可以解决,后来我就没有使用这块的代码了,我就改用科大讯飞的在线合成,hbuilder的html5+的speech)
      function createAudio(url,table_id) {
        var audio = document.createElement('audio');
        var app = document.getElementById('app');
        var oldAudio = document.getElementById(table_id.toString());
        // 如果已经存在这个id,就先移除掉
        if(oldAudio){
          app.removeChild(oldAudio);
        }
        audio.setAttribute('controls','controls');
        audio.setAttribute('autoplay','autoplay');
        audio.setAttribute('src',url);
        audio.setAttribute('id',table_id.toString());
        // audio.setAttribute('loop','loop');
        audio.style.display = 'none';
        app.appendChild(audio);
      }
      // 使用科大讯飞
      function createSpeech(reponse) {
        var main = plus.android.runtimeMainActivity();
        var SpeechUtility = plus.android.importClass('com.iflytek.cloud.SpeechUtility');
        var SpeechConstant = plus.android.importClass('com.iflytek.cloud.SpeechConstant');
        SpeechUtility.createUtility(main,"appid=5af2af41");        

        var SynthesizerPlayer = plus.android.importClass('com.iflytek.cloud.SpeechSynthesizer');
        var play = SynthesizerPlayer.createSynthesizer(main, null);
        play.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人
        play.setParameter(SpeechConstant.SPEED, "10");//设置语速  
        play.setParameter(SpeechConstant.VOLUME, "90");//设置音量,范围0~100  
        // play.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端 

        if(reponse['type'] == 1){
          play.startSpeaking(reponse['tablename'] + '新的扫码点餐订单,' + reponse['tablename'] + '新的扫码点餐订单',null);
        }else if(reponse['type'] == 2){
          play.startSpeaking(reponse['tablename'] + '新的外卖订单' + reponse['tablename'] + '新的外卖订单',null);
        }else if(reponse['type'] == 3){
          play.startSpeaking(reponse['tablename'] + '请用餐,' + reponse['tablename'] + '请用餐',null);
        }
      }
最后给条很好的消息推送的链接:http://ask.dcloud.net.cn/article/503

猜你喜欢

转载自blog.csdn.net/qq_39702364/article/details/80324662