Обновление представления на странице после получения push-уведомления fcm и на той же странице - PullRequest
1 голос
/ 17 апреля 2019

У меня есть приложение в Ionic4, которое получает push-уведомления FCM для различных обновлений данных. Push работает без проблем, в полезную нагрузку данных уведомления я помещаю различные теги, которые затем использую в приложении, чтобы изменить поведение в соответствии с полезной нагрузкой, например, изменить заголовок и описание контроллера оповещений, который я использую для управления передним планом. уведомления:

this.FCM.onNotification()
.subscribe( data => {
   if (data.wasTapped) {
     this.router.navigateByUrl(data.mobile_page);
} else {
 this.presentAlertConfirm(data);
//this.router.navigateByUrl(data.mobile_page);
}
});   

[...]

async presentAlertConfirm(data) {

var dataheader;

// Verifico il tipo di messaggio nel payload della notifica push 

if (data.msgtype == 'msg') {
  dataheader = 'Nuovo Messaggio';
}

[...]

var messageurl = data.mobile_page;

const alert = await this.alertController.create({
  header: dataheader,
  message: 'Premere OK per visualizzare',
  buttons: [
    {
      text: 'Ignora',
      role: 'cancel',
      cssClass: 'secondary',
      handler: (blah) => {
        console.log('Confirm Cancel: blah');
      }
    }, {
      text: 'OK',
      handler: () => {
        this.router.navigateByUrl(data.mobile_page);
        console.log('Confirm Okay');
      }
    }
  ]
});

Пока что эта часть работает без проблем. Если я нахожусь в приложении и получаю, например, новое сообщение, появится всплывающее окно «Предупреждение», и я смогу нажать «ОК», чтобы перейти на страницу, где отображается сообщение. Здесь начинается сложная часть, которую я не смог решить самостоятельно. Если я получаю другое сообщение , когда я нахожусь на странице сообщения , я получаю всплывающее окно «Предупреждение», но даже если я нажимаю «ОК», представление не отображается снова, и новое сообщение не отображается. В качестве обходного пути я добавил кнопку обновления и средство обновления ионов на странице, которая выполняет эту работу, но я хотел бы знать, возможно ли даже добиться того, что я ищу, чтобы новое сообщение отображалось без необходимость вручную нажать кнопку обновления или проведите пальцем вниз, чтобы активировать ион-освежитель.

Это код, который у меня есть в ngOnInit () на странице сведений о сообщении:

this.badge.clear();
this.getLoggedUserId();
this.getMessageSingleThread(this.route.snapshot.paramMap.get('thread_id'));

Функция getMessageSingleThread вызывает метод rest в моем веб-сервисе, и этот метод следует вызывать после нажатия OK во всплывающем окне с уведомлением.

Я попробовал кучу разных решений, найденных здесь и на других сайтах, включая NgZone, но безуспешно. Я уверен, что я делаю что-то глупое. Пока что все примеры, где используется одна страница с подпиской FCM и перезагрузкой, что, я уверен, является рабочим решением, но не применимо к моему случаю, так как у меня есть многостраничное приложение, и FCM закодировано в приложении. component.ts.

Большое спасибо

1 Ответ

0 голосов
/ 18 апреля 2019

Как упомянуто в комментариях, возможное решение (возможно, не самое лучшее, но все же стоящее для реализации) заключается в использовании Subject в общей службе singleton для возможности уведомления любого просмотр, который в настоящее время подписан на эту тему, что новое сообщение было получено.

Служебная часть включает объявление Subject и предоставление метода для выдачи значений из него.

import {Injectable} из '@ angular / core'; import {Subject} from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class SharedService {
  /**
   * Holds the shared reference of the subject.
   */
  public _OnMessageReceivedSubject: Subject<string>;

  public constructor() {
    // Creates a new subject.
    this._OnMessageReceivedSubject = new Subject<string>();
  }

 /**
 * emits a message. 
 */
  public emitMessageReceived(msg: string): void {
    this._OnMessageReceivedSubject.next(msg);
  }
}

Stackblitz, чтобы играть с

...