如何处理使用Ionic3开发的PWA中的硬件后退按钮

Viv*_*nha 13 android ionic-framework

我使用Ionic 3开发了一个PWA(基于Tab).它在Android浏览器中按下硬件后退按钮或浏览器的后退按钮之前工作正常.如果它从主屏幕运行,按回硬件将关闭应用程序.如果应用程序在android中运行chrome(仅在chrome中测试),硬件返回或浏览器后面将重新加载PWA的第一页,而不是之前访问过的页面.如何在Ionic 3 PWA中处理这些事件?

我正在为所有页面使用延迟加载.

到目前为止我尝试了什么:

  1. 按照jgw96的评论在这里,我想IonicPage将处理导航本身.但它没有用.

  2. 使用platform.registerBackButtonAction,但它不适用于PWA.

  3. 根据Webruster在Answers中的建议,在app.component.ts中尝试了代码.但没有变化.

发布代码:

    import { Component, ViewChild } from '@angular/core';
    import { Nav, Platform, AlertController, Alert, Events, App, IonicApp, MenuController } from 'ionic-angular';

    @Component({
      templateUrl: 'app.html'
    })
    export class MyApp {
      @ViewChild(Nav) nav: Nav;
      rootPage:any = 'TabsPage';
      constructor(public platform: Platform,
        public alertCtrl: AlertController, public events: Events,
          public menu: MenuController,
          private _app: App,
          private _ionicApp: IonicApp) {

        platform.ready().then(() => {
          this.configureBkBtnprocess ();
        });
      }

      configureBkBtnprocess() {
        if (window.location.protocol !== "file:") {
          window.onpopstate = (evt) => {
            if (this.menu.isOpen()) {
              this.menu.close ();
              return;
            }
    let activePortal = this._ionicApp._loadingPortal.getActive() ||
      this._ionicApp._modalPortal.getActive() ||
      this._ionicApp._toastPortal.getActive() ||
      this._ionicApp._overlayPortal.getActive();

    if (activePortal) {
      activePortal.dismiss();
      return;
    }

    if (this._app.getRootNav().canGoBack())
      this._app.getRootNav().pop();
          };

          this._app.viewDidEnter.subscribe((app) => {
            history.pushState (null, null, "");
            });
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

Web*_*ter 6

您已经提到您正在使用应用程序和浏览器中的硬件后退按钮,因此您没有明确提到在哪个阶段需要做什么,因此我想出了一个通用的解决方案,该解决方案在大多数情况下都非常有用

app.component.ts

platform.ready().then(() => {

      // your other plugins code...
      this.configureBkBtnprocess ();

    });
Run Code Online (Sandbox Code Playgroud)

configureBkBtnprocess

private configureBkBtnprocess () {

    // If you are on chrome (browser)
    if (window.location.protocol !== "file:") {

      // Register browser back button action and you can perform
      // your own actions like as follows
      window.onpopstate = (evt) => {

        // Close menu if open
        if (this._menu.isOpen()) {
          this._menu.close ();
          return;
        }

        // Close any active modals or overlays
        let activePortal = this._ionicApp._loadingPortal.getActive() ||
          this._ionicApp._modalPortal.getActive() ||
          this._ionicApp._toastPortal.getActive() ||
          this._ionicApp._overlayPortal.getActive();

        if (activePortal) {
          activePortal.dismiss();
          return;
        }

        // Navigate back
        if (this._app.getRootNav().canGoBack()) 
        this._app.getRootNav().pop();

      }
      else{
        // you are in the app
      };

  // Fake browser history on each view enter
  this._app.viewDidEnter.subscribe((app) => {
    history.pushState (null, null, "");
  });
Run Code Online (Sandbox Code Playgroud)

解决方案2 尝试在准备就绪的平台中添加以下事件侦听器:

 window.addEventListener('load', function() { window.history.pushState({}, '') 
           })
    window.addEventListener('popstate', function() { window.history.pushState({}, 
   '') })
Run Code Online (Sandbox Code Playgroud)