消息推送的实现:
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);
}
}