在用于网络平台的 ionic 3 应用程序中集成推送通知时遇到问题
Facing problem in integrating push notification in ionic 3 app for web platform
我在 ionic 3 应用程序中工作,其中 -:
说明 -: 1. 我正在开发离子应用程序,我正在尝试使用 firebase 在可能的应用程序中集成推送通知
我已按照 https://ionicframework.com/docs/native/push/
中的所有步骤进行操作
问题:推送通知不适用于 ios 的 Web 平台,android 它可以正常工作。
**
Please see : may be I am not putting fcm correctly as ionic fcm is not
supported for web , .
**
我把代码放在下面:
ts 文件-:
import { Push, PushOptions , PushObject } from '@ionic-native/push/ngx';
export class MyApp {
rootPage:any = TabsPage;
fcmId: any;
constructor( private storage: Storage , private alertCtrl: AlertController , private push: Push , public navCtrl: NavController , platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
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.
statusBar.styleDefault();
splashScreen.hide();
});
}
initPushNotification() {
// to check if we have permission
this.push.hasPermission().then((res: any) => {
if (res.isEnabled) {
console.log('We have permission to send push notifications');
} else {
console.log("We don't have permission to send push notifications");
}
});
// to initialize push notifications
const options: PushOptions = {
android: {
senderID: '839584699716',
},
ios: {
alert: 'true',
badge: true,
sound: 'false',
},
windows: {},
browser: {
pushServiceURL: 'http://push.api.phonegap.com/v1/push',
},
};
const pushObject: PushObject = this.push.init(options);
pushObject.on('notification').subscribe((notification: any) => {
console.log('Received a notification', notification);
//Notification Display Section
let confirmAlert = this.alertCtrl.create({
title: 'New Notification',
message: JSON.stringify(notification),
buttons: [
{
text: 'Ignore',
role: 'cancel',
},
{
text: 'View',
handler: () => {
//TODO: Your logic here
//self.nav.push(DetailsPage, {message: data.message});
},
},
],
});
confirmAlert.present();
//
});
pushObject.on('registration').subscribe((registration: any) => {
console.log('Device registered', registration);
this.fcmId = registration.registrationId;
console.log(this.fcmId);
this.storage.set('fcmId', this.fcmId);
});
pushObject.on('error').subscribe(error => console.error('Error with Push plugin.....', error));
}
}
app.module.ts
import { AngularFireModule } from 'angularfire2';
import firebase from 'firebase';
import { AngularFireAuth } from 'angularfire2/auth';
import { AngularFireAuthModule } from 'angularfire2/auth'
import { Push } from '@ionic-native/push/ngx';
export const firebaseConfig = {
apiKey: "AIzaSyBrU5I4_hK-M4Ai3#############",
authDomain: "primeval-wind-230006.firebaseapp.com",
databaseURL: "https://primeval-wind-230006.firebaseio.com",
projectId: "primeval-wind-230006",
storageBucket: "primeval-wind-230006.appspot.com",
messagingSenderId: "##########"
}
firebase.initializeApp(firebaseConfig)
@NgModule({
declarations: [
MyApp,
AboutPage,
ContactPage,
HomePage,
TabsPage,
SecondtryPage
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp),
AngularFireModule.initializeApp(firebaseConfig),
AngularFireAuthModule,
IonicStorageModule.forRoot()
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
AboutPage,
ContactPage,
HomePage,
TabsPage,
SecondtryPage
],
providers: [
StatusBar,Push,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler},
GooglePlus
]
})
export class AppModule {}
我将在这里分享适用于我的一个应用程序(Ionic 3,Angular 5.2.3)的方法:
在你的服务工作者中添加以下代码:
// FIREBASE:
importScripts('https://www.gstatic.com/firebasejs/5.8.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/5.8.2/firebase-messaging.js');
// firebase messaging part:
firebase.initializeApp({
// get this from Firebase console, Cloud messaging section
'messagingSenderId':'YOURIDHERE'
});
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler((payload) => {
console.log('Received background message ', payload);
// here you can override some options describing what's in the message;
// however, the actual content will come from the Webtask
const notificationOptions = {
icon: '/assets/img/mstile-150x150.png'
};
return self.registration.showNotification(notificationTitle, notificationOptions);
});
然后在你的 app.module.ts 中导入 fire 和 messaging 模块:
import { AngularFireModule } from '@angular/fire';
import { AngularFireMessagingModule } from '@angular/fire/messaging';
确保您也将模块添加到@NgModule 的导入部分:
AngularFireModule.initializeApp(ENV.FIREBASE_CONFIG),
AngularFireMessagingModule,
上面的 ENV 配置包含你的 fcm 配置:
FIREBASE_CONFIG: {
apiKey: "",
authDomain: "",
databaseURL: "",
projectId: "",
storageBucket: "",
messagingSenderId: ""
},
现在您的消息服务提供商:
import { AngularFireMessaging } from '@angular/fire/messaging';
...
constructor(
private firebaseMessaging: AngularFireMessaging,
) {}
...
initFCMforPWA() {
navigator.serviceWorker.getRegistration().then((registration)=>{
this.firebaseMessaging.messaging.subscribe(
(messaging) => {
// we use this trick here to access useServiceWorker method:
messaging.useServiceWorker(registration);
// small workaround below (as I use ANGULAR FIRE 5.0.0):
messaging.onTokenRefresh = messaging.onTokenRefresh.bind(messaging);
// small work around above
this.enableNotifications();
// set flag that messaging was init:
this.appHasFCMInitDone = true;
messaging.onMessage((message)=>{
console.log(message);
this.toaster.presentSimpleToast(message.notification.title, "top");
});
},
(error)=>{ console.log("failed to subscribe to firebase messaging")}
);
});
}
enableNotifications() {
console.log("Requesting permission and token...");
this.firebaseMessaging.requestToken.subscribe((token) => {
console.log("Permission and token granted");
this.fcmPermissionGranted = true;
// send token to our server and set this for current user:
this.setFCMToken(token).subscribe(
() => { this.pushToken = token; console.log("token was set on server side") },
(error) => {this.handleError(error)}
)
}, (error)=>{
this.fcmPermissionGranted = false;
console.log(error);
});
};
disableNotifications() {
return new Promise((resolve, reject) =>{
this.revokeFCMToken().subscribe(() => {
this.pushToken = null;
this.userID = null;
this.userData = null;
console.log("removed notification token from morphistic server");
this.firebaseMessaging.getToken.pipe(mergeMap(token => this.firebaseMessaging.deleteToken(token))).subscribe(() => {
console.log('deleted notification token from firebase');
resolve();
}
);
}
);
})
};
请注意,您需要有自己的后端方法来设置和撤销令牌。
此配置适用于 Ionic 3/Angular 5.2.3 和 AngularFire 5.0.0
我在 ionic 3 应用程序中工作,其中 -:
说明 -: 1. 我正在开发离子应用程序,我正在尝试使用 firebase 在可能的应用程序中集成推送通知
我已按照 https://ionicframework.com/docs/native/push/
中的所有步骤进行操作问题:推送通知不适用于 ios 的 Web 平台,android 它可以正常工作。
**
Please see : may be I am not putting fcm correctly as ionic fcm is not supported for web , .
**
我把代码放在下面:
ts 文件-:
import { Push, PushOptions , PushObject } from '@ionic-native/push/ngx';
export class MyApp {
rootPage:any = TabsPage;
fcmId: any;
constructor( private storage: Storage , private alertCtrl: AlertController , private push: Push , public navCtrl: NavController , platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
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.
statusBar.styleDefault();
splashScreen.hide();
});
}
initPushNotification() {
// to check if we have permission
this.push.hasPermission().then((res: any) => {
if (res.isEnabled) {
console.log('We have permission to send push notifications');
} else {
console.log("We don't have permission to send push notifications");
}
});
// to initialize push notifications
const options: PushOptions = {
android: {
senderID: '839584699716',
},
ios: {
alert: 'true',
badge: true,
sound: 'false',
},
windows: {},
browser: {
pushServiceURL: 'http://push.api.phonegap.com/v1/push',
},
};
const pushObject: PushObject = this.push.init(options);
pushObject.on('notification').subscribe((notification: any) => {
console.log('Received a notification', notification);
//Notification Display Section
let confirmAlert = this.alertCtrl.create({
title: 'New Notification',
message: JSON.stringify(notification),
buttons: [
{
text: 'Ignore',
role: 'cancel',
},
{
text: 'View',
handler: () => {
//TODO: Your logic here
//self.nav.push(DetailsPage, {message: data.message});
},
},
],
});
confirmAlert.present();
//
});
pushObject.on('registration').subscribe((registration: any) => {
console.log('Device registered', registration);
this.fcmId = registration.registrationId;
console.log(this.fcmId);
this.storage.set('fcmId', this.fcmId);
});
pushObject.on('error').subscribe(error => console.error('Error with Push plugin.....', error));
}
}
app.module.ts
import { AngularFireModule } from 'angularfire2';
import firebase from 'firebase';
import { AngularFireAuth } from 'angularfire2/auth';
import { AngularFireAuthModule } from 'angularfire2/auth'
import { Push } from '@ionic-native/push/ngx';
export const firebaseConfig = {
apiKey: "AIzaSyBrU5I4_hK-M4Ai3#############",
authDomain: "primeval-wind-230006.firebaseapp.com",
databaseURL: "https://primeval-wind-230006.firebaseio.com",
projectId: "primeval-wind-230006",
storageBucket: "primeval-wind-230006.appspot.com",
messagingSenderId: "##########"
}
firebase.initializeApp(firebaseConfig)
@NgModule({
declarations: [
MyApp,
AboutPage,
ContactPage,
HomePage,
TabsPage,
SecondtryPage
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp),
AngularFireModule.initializeApp(firebaseConfig),
AngularFireAuthModule,
IonicStorageModule.forRoot()
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
AboutPage,
ContactPage,
HomePage,
TabsPage,
SecondtryPage
],
providers: [
StatusBar,Push,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler},
GooglePlus
]
})
export class AppModule {}
我将在这里分享适用于我的一个应用程序(Ionic 3,Angular 5.2.3)的方法:
在你的服务工作者中添加以下代码:
// FIREBASE:
importScripts('https://www.gstatic.com/firebasejs/5.8.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/5.8.2/firebase-messaging.js');
// firebase messaging part:
firebase.initializeApp({
// get this from Firebase console, Cloud messaging section
'messagingSenderId':'YOURIDHERE'
});
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler((payload) => {
console.log('Received background message ', payload);
// here you can override some options describing what's in the message;
// however, the actual content will come from the Webtask
const notificationOptions = {
icon: '/assets/img/mstile-150x150.png'
};
return self.registration.showNotification(notificationTitle, notificationOptions);
});
然后在你的 app.module.ts 中导入 fire 和 messaging 模块:
import { AngularFireModule } from '@angular/fire';
import { AngularFireMessagingModule } from '@angular/fire/messaging';
确保您也将模块添加到@NgModule 的导入部分:
AngularFireModule.initializeApp(ENV.FIREBASE_CONFIG),
AngularFireMessagingModule,
上面的 ENV 配置包含你的 fcm 配置:
FIREBASE_CONFIG: {
apiKey: "",
authDomain: "",
databaseURL: "",
projectId: "",
storageBucket: "",
messagingSenderId: ""
},
现在您的消息服务提供商:
import { AngularFireMessaging } from '@angular/fire/messaging';
...
constructor(
private firebaseMessaging: AngularFireMessaging,
) {}
...
initFCMforPWA() {
navigator.serviceWorker.getRegistration().then((registration)=>{
this.firebaseMessaging.messaging.subscribe(
(messaging) => {
// we use this trick here to access useServiceWorker method:
messaging.useServiceWorker(registration);
// small workaround below (as I use ANGULAR FIRE 5.0.0):
messaging.onTokenRefresh = messaging.onTokenRefresh.bind(messaging);
// small work around above
this.enableNotifications();
// set flag that messaging was init:
this.appHasFCMInitDone = true;
messaging.onMessage((message)=>{
console.log(message);
this.toaster.presentSimpleToast(message.notification.title, "top");
});
},
(error)=>{ console.log("failed to subscribe to firebase messaging")}
);
});
}
enableNotifications() {
console.log("Requesting permission and token...");
this.firebaseMessaging.requestToken.subscribe((token) => {
console.log("Permission and token granted");
this.fcmPermissionGranted = true;
// send token to our server and set this for current user:
this.setFCMToken(token).subscribe(
() => { this.pushToken = token; console.log("token was set on server side") },
(error) => {this.handleError(error)}
)
}, (error)=>{
this.fcmPermissionGranted = false;
console.log(error);
});
};
disableNotifications() {
return new Promise((resolve, reject) =>{
this.revokeFCMToken().subscribe(() => {
this.pushToken = null;
this.userID = null;
this.userData = null;
console.log("removed notification token from morphistic server");
this.firebaseMessaging.getToken.pipe(mergeMap(token => this.firebaseMessaging.deleteToken(token))).subscribe(() => {
console.log('deleted notification token from firebase');
resolve();
}
);
}
);
})
};
请注意,您需要有自己的后端方法来设置和撤销令牌。
此配置适用于 Ionic 3/Angular 5.2.3 和 AngularFire 5.0.0