Уведомление Ionic 4 Firebase о перенаправлении крана не работает с this.ngZone.run (() - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь перенаправить приложение на статью, когда приходит push-уведомление и когда приложение находится в фоновом режиме. Когда кто-то нажимает на уведомление на основе полученных данных, приложение иногда перенаправляет на статью, но иногда перенаправляет только на домашнюю страницу.

Я отладил код и обнаружил, что блок кода всегда работает правильно. «Навигация выполнена успешно» всегда печатается в консоли, даже если вы перенаправляете на домашнюю страницу вместо страницы уведомлений. На странице уведомлений я загружаю содержимое статьи в функции ngOnInit. Данные успешно получены из http api. Это означает, что страница вызвана, но какая-то причина не отображается Я совершенно пустой, что может быть причиной. Пожалуйста, помогите.

app.component.ts

  constructor(
    private platform: Platform,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar,
    private authenticationService: AuthenticationService,
    private router: Router,
    private route: ActivatedRoute,
    private storage: Storage,
    private toast: ToastController,
    public alertController: AlertController,   
    private menu: MenuController,
    private fcm: FcmService,
    private ngZone: NgZone,
  ) {
    this.user = {};
    this.initializeApp();
    this.backButtonEvent();
  }

  initializeApp() {
     this.platform.ready().then(() => {
     this.statusBar.styleDefault();
     this.splashScreen.hide();

     if (!navigator.onLine) {
        this.presentAlert('No Internet Connection','Sorry, No internet connectivity detected. Please reconnect and try again.');
     }   

      this.authenticationService.authenticationState.subscribe(state => {
       if (state) {
          this.isLoggedIn = true;
          console.log('App Component IF: '+state);
          this.router.navigate(['home']);
       } 

       if(state == false) {
         console.log('App Component ELSE: '+state);
         this.isLoggedIn = false;
         this.router.navigate(['login']);
        }   
       });  
       this.notificationSetup();
     });
   }

private notificationSetup() {
   this.fcm.getToken();
   this.fcm.onTokenRefresh();
   this.fcm.onNotifications().pipe(tap(msg => console.log(msg))).subscribe(
  (msg) => {
    if(msg.tap) {
      this.ngZone.run(() => this.router.navigate(['notification', { id: msg.id, action: msg.action }])).then(e => {
          if (e) {
            console.log(e);
            console.log("Navigation is successful!");
          } else {
            console.log(e);
            console.log("Navigation has failed!");
          }
        }
      );          
    } else {         
      if (this.platform.is('ios')) {
        this.presentToast(msg.aps.alert);
      } else {
        this.presentToast(msg.body);
      }
    }
  });
 }

Страница уведомления Notification.page.ts

export class NotificationPage implements OnInit {
  id: string;
  action: string;
  title: string;
  excerpt: string;
  content: string;    
  audio_code: string; 
  audio_link: string;
  type: string;
  section_parent: string;  
  section_slug: string;
  section_title: string;
  post: any;

constructor(private router: Router, private route: ActivatedRoute, public api: RestApiService, public loadingController: LoadingController) { }

 ngOnInit() {
    //alert('Test');
    this.title = '';
    this.excerpt = '';     
    this.content = '';
    this.audio_code = '';        
    this.audio_link = '';        
    this.type = '';        
    this.section_parent = '';        
    this.section_slug = '';        
    this.section_title = '';        

    this.id = this.route.snapshot.paramMap.get('id');
    this.action = this.route.snapshot.paramMap.get('action');    
    this.getPost(this.id,this.action);
  }

  async getPost(id: any,action: string) {
    const loading = await this.loadingController.create();
    await loading.present();

    await this.api.getArticleById(id,action)
      .subscribe(res => {
         console.log(res);
         this.title = res.object_title;        
         this.excerpt = res.object_excerpt;
         if(res.type=='video')
           this.content = res.video_link;
         else 
           this.content = res.object_content;
         this.type = res.type;        
         this.audio_code = res.audio_code;
         this.audio_link = res.audio_link;
         this.section_parent = res.section_parent;        
         this.section_slug = res.section_slug;        
         this.section_title = res.section_title;                  
         loading.dismiss();

       }, err => {
         console.log(err);
        loading.dismiss();
      });
  }  
...