目录
1、插件使用
2、代码实现
3、真机测试
4、完整代码
1)推送插件:cordova.plugins.notification.local
插件安装:cordova plugin add cordova-plugin-local-notification
或者:cordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git
git地址:https://github.com/katzer/cordova-plugin-local-notifications
2)ng2-STOMP-Over-WebSocket插件 用于和后台通信
插件安装:npm i --save stompjs npm i --save sockjs-client npm i --save ng2-stomp-service
git地址:https://github.com/devsullo/ng2-STOMP-Over-WebSocket
1)推送代码实现
clickObj = {};
/**
* @函数名称:sentInfo
* @param
* @作用:消息推送
* @return:obj
* @date 2018/7/19
*/
sentInfo(item) {
this.initLocalNotifications();
const me = this;
//新版本使用 add 可以替换 schedule
const localNotifications = this.localNotifications;
if (localNotifications.add) {
localNotifications.add({
id: item.charNum,
title: item.text,
text: item.label,
at: item.at,
badge: 2,
sound: 'res://platform_default',//默认值
icon: 'res://ic_popup_reminder', //默认值
autoClear: true,//默认值
ongoing: true, //默认值
data: item
});
} else {
localNotifications.schedule({
id: item.charNum,
title: item.text,
text: item.label,
at: item.at,
badge: 2,
autoClear: true,//默认值
ongoing: true, //默认值
data: item
});
}
me.clickObj[item.charNum] = false;
// 跳转到详情页面
localNotifications.on('click', function(notification){
// TODO 待优化 处理多次注入问题
if (me.clickObj[notification.id]) {
return;
}
if (!me.clickObj[notification.id]) {
me.navCrt.push(EventInfoModal, notification.data);
}
me.clickObj[notification.id] = true;
}, item.charNum);
}
2)和后台对接代码实现
/**
* @函数名称:stompFn
* @param
* @作用:websocket相关业务处理
* @date 2018/7/19
*/
stompFn() {
//configuration
const hostUrl = this.http.getUrl('/api/websocket');
this.stomp.configure({
host: hostUrl,
debug: true,
queue: {'init':false}
});
//start connection
this.stomp.startConnect().then(() => {
this.stomp.done('init');
console.log("链接成功");
//subscribe
this.subscription = this.stomp.subscribe('/topic/subscribe', this.response);
//send data
// this.stomp.send('destionation',{"data":"data"});
//unsubscribe
// this.subscription.unsubscribe();
//disconnect
// this.stomp.disconnect().then(() => {
// console.log( 'Connection closed' )
// })
});
}
infoId = 0; // 消息id
//response
public response = (data) => {
this.infoId++;
const item = {
img: 'data:image/jpeg;base64,' + data.checkJpg,
text : this.getTitle(data),//single.checkName,
label: this.getLabel(data),
time: Number(data.time_norm),
videoUrl: data.combiner_output_path+'/'+data.combiner_output_file+'/'+data.time+'.jpg.mp4',
charNum: this.infoId
};
this.sentInfo(item);
};
1)部署内网websocket连接不上
原因:host没有添加内网地址,正确连接地址例如 http://192.1.1.1:8888//api/websocket
切记订阅地址不需要添加http地址
this.stomp.configure({
host: hostUrl,
debug: true,
queue: {'init':false}
});
2)部署外网websocket连接不上
nginx配置问题
解决办法参考:http://www.cnblogs.com/duanweishi/p/9286461.html
import { HomePage } from '../home/home';
import { ListPage } from '../list/list';
import { Component, ViewChild, OnDestroy } from '@angular/core';
import { Nav, Platform, ModalController, NavController, Tabs } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { LoginPage } from '../login/login';
import { HttpSerProvider } from './../../providers/http-ser/http-ser';
import { BackButtonProvider } from "../../providers/back-button/back-button";
import { StompService } from 'ng2-stomp-service';
import { UtilsProvider } from './../../providers/utils/utils';
import { LoadingSerProvider } from '../../providers/loading-ser/loading-ser';
import { EventInfoModal } from '../home/eventInfoModal';
@Component({
templateUrl: 'content.html'
})
export class ContentPage implements OnDestroy {
@ViewChild(Nav) nav: Nav;
@ViewChild('mytabs') mytabs: Tabs;
pages: Array<{title: string, component: any}>;
rootPage: any = HomePage;
public subscription : any;
constructor(
public platform: Platform,
public statusBar: StatusBar,
public utils : UtilsProvider,
public splashScreen: SplashScreen,
public modalCtrl: ModalController,
public http: HttpSerProvider,
public navCrt: NavController,
public backButtonService: BackButtonProvider,
public stomp: StompService,
public loading: LoadingSerProvider,
) {
this.initializeApp();
this.setPages();
this.backFn();
setTimeout(()=>{
this.stompFn();
});
}
// 注入home事件
backFn() {
this.platform.ready().then(() => {
this.backButtonService.registerBackButtonAction(this.mytabs);
});
}
/**
* @函数名称:stompFn
* @param
* @作用:websocket相关业务处理
* @date 2018/7/19
*/
stompFn() {
//configuration
const hostUrl = this.http.getUrl('/api/websocket');
this.stomp.configure({
host: hostUrl,
debug: false,
queue: {'init':false}
});
//start connection
this.stomp.startConnect().then(() => {
this.stomp.done('init');
//subscribe
this.subscription = this.stomp.subscribe('/topic/subscribe', this.response);
//send data
// this.stomp.send('destionation',{"data":"data"});
//unsubscribe
// this.subscription.unsubscribe();
//disconnect
// this.stomp.disconnect().then(() => {
// console.log( 'Connection closed' )
// })
});
}
infoId = 0; // 消息id
//response
public response = (data) => {
this.infoId++;
const item = {
img: 'data:image/jpeg;base64,' + data.checkJpg,
text : this.getTitle(data),//single.checkName,
label: this.getLabel(data),
time: this.utils.timestampToTime(data.time_norm, null),
at: Number(data.time_norm),
videoUrl: data.combiner_output_path+'/'+data.combiner_output_file+'/'+data.time+'.jpg.mp4',
charNum: this.infoId
};
this.sentInfo(item);
};
getLabel(single) {
return this.utils.getDeviceNameLabel(single);
}
getTitle(single) {
return this.utils.getDeviceNameTitle(single);
}
// 模块保存对象 将用到的对象保存下来
localNotifications: any;
initLocalNotifications() {
if (!this.localNotifications) {
this.localNotifications = cordova.plugins.notification.local;
}
}
clickObj = {};
/**
* @函数名称:sentInfo
* @param
* @作用:消息推送
* @return:obj
* @date 2018/7/19
*/
sentInfo(item) {
this.initLocalNotifications();
const me = this;
//新版本使用 add 可以替换 schedule
const localNotifications = this.localNotifications;
if (localNotifications.add) {
localNotifications.add({
id: item.charNum,
title: item.text,
text: item.label,
at: item.at,
badge: 2,
sound: 'res://platform_default',//默认值
icon: 'res://ic_popup_reminder', //默认值
autoClear: true,//默认值
ongoing: true, //默认值
data: item
});
} else {
localNotifications.schedule({
id: item.charNum,
title: item.text,
text: item.label,
at: item.at,
badge: 2,
autoClear: true,//默认值
ongoing: true, //默认值
data: item
});
}
me.clickObj[item.charNum] = false;
// 跳转到详情页面
localNotifications.on('click', function(notification){
// TODO 待优化 处理多次注入问题
if (me.clickObj[notification.id]) {
return;
}
if (!me.clickObj[notification.id]) {
me.navCrt.push(EventInfoModal, notification.data);
}
me.clickObj[notification.id] = true;
}, item.charNum);
}
/**
* @函数名称:setPages
* @param
* @作用:设置模块menu
* @return:obj
* @date 2018/7/20
*/
setPages() {
// used for an example of ngFor and navigation
this.pages = [
{ title: '预警事件', component: HomePage },
{ title: '预警统计', component: ListPage }
];
}
initializeApp() {
this.platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
this.statusBar.styleDefault();
this.splashScreen.hide();
});
}
/**
* 菜单项打开
* @param page
*/
openPage(page) {
// Reset the content nav to have just this page
// we wouldn't want the back button to show in this scenario
this.nav.setRoot(page.component);
}
/**
* 退出登录
*/
logOut() {
this.http.clearToken();
this.navCrt.push(LoginPage);
// let modal = this.modalCtrl.create(LoginPage);
// modal.present();
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}