РЕДАКТИРОВАТЬ: Решил проблему, запустив новый проект с нуля, добавив все зависимости один за другим, а затем скопировав источники
Я пытаюсь использовать push-уведомление Firebase с приложением Ionic 4.
К сожалению, кажется, что есть проблема, когда мое приложение находится в фоновом режиме.
Фактически нажатие на уведомление не откроет приложение.
Я пробовал много способов, учебных пособий, официальных или нет. Плагин Firebase или @ ionic-native / push.
Мне удалось заставить работать уведомления, когда приложение находится на переднем плане. Что приятно. Но, как я уже сказал, невозможно запустить приложение, щелкнув уведомление, когда приложение находится в фоновом режиме (не закрыто).
Что меня беспокоит, так это то, что код, содержащийся в методе .subscribe () метода onNotificationOpen (), не будет выполняться, но по какой-то причине моя консоль Android Studio будет отображать что-то:
Вот что говорится, когда я получаю (но не нажимаю) уведомление в фоновом режиме: (очевидно, я заменил дату и название приложения)
TIMESTAMP 10795-11987 / APPNAME W / FirebaseMessaging: Канал уведомлений, установленный в AndroidManifest.xml, не был создан приложением. Будет использовано значение по умолчанию.
TIMESTAMP 10795-11987 / APPNAME W / FirebaseMessaging: ресурс значка fcm_push_icon не найден. В уведомлении будет использоваться значок по умолчанию.
Если я установлю значение по умолчанию в AndroidManifest.xml, оно, похоже, заменит его на и другое значение.
Вот мой код:
У меня есть этот сервис, найденный где-то (учебник или стекопоток, не могу вспомнить), довольно просто:
import { Injectable } from '@angular/core';
import { Firebase } from '@ionic-native/firebase/ngx';
import { AngularFirestore } from 'angularfire2/firestore';
import { Platform } from '@ionic/angular';
import { Router } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class FcmService {
constructor(private firebase: Firebase,
private afs: AngularFirestore,
private platform: Platform,
private router: Router) { }
getToken = async () => {
let token;
if (this.platform.is('android')) {
token = await this.firebase.getToken();
}
if (this.platform.is('ios')) {
token = await this.firebase.getToken();
await this.firebase.grantPermission();
}
this.saveToken(token);
}
subscribe = (str: string) => this.firebase.subscribe(`topic_string_${str}`);
unsubscribe = (str: string) => this.firebase.unsubscribe(`topic_string_${str}`);
private saveToken = (token) => {
if (!token) {
return;
}
const devicesRef = this.afs.collection('devices');
const data = {
token,
userId: 'testUserId'
};
return devicesRef.doc(token).set(data);
}
onNotifications = (): Observable<any> => this.firebase.onNotificationOpen();
}
И мой app.component.ts (обратите внимание, что сначала он там не обрабатывался, но для более быстрого тестирования я поместил этот простой код здесь).
this.fcm является экземпляром вышеуказанного сервиса.
Оператор else выполняется правильно, когда приложение на переднем плане.
Также обратите внимание, что на этом этапе я не использую метод saveToken, но это не должно быть проблемой.
this.fcm.getToken();
this.fcm.onNotifications().subscribe(x => {
if (x.tap) {
console.log(`Notification background`, x);
} else {
console.log(`Notification foreground`, x);
}
});
И последнее, но не менее важное. У меня странная ошибка, которая часто появляется, когда я ищу исправление.
плагин cordova-plugin-fcm-with-dependecy-updated автоматически приведет к сбою сборки при следующей ошибке:
Что пошло не так:
Возникла проблема при оценке скрипта.
Не удалось применить плагин [класс 'com.google.gms.googleservices.GoogleServicesPlugin']
Для входной строки: "+"
Это ошибка для Android.
Я пытался исправить версию разными способами, но всегда заканчивался сбоем, и мне пришлось удалить и заново добавить платформу Android, чтобы убрать беспорядок.
Та же самая ошибка возникает и при использовании функции phonegap-push.
Большое спасибо! Надеюсь, я был ясен в своих объяснениях.