本地通知按钮未执行任何操作

时间:2019-09-11 14:05:42

标签: javascript angular typescript ionic-framework notifications

对于ionic 4,我正在使用插件的本地通知:

https://github.com/katzer/cordova-plugin-local-notifications

我要实现“是”,“否”选项,并且仅在触摸“是”按钮时才执行操作,并且如果单击“否”按钮,仅想关闭通知,便在我的应用程序中实现了该实现真实的项目,并且操作按钮“有效”,但是只有当我在应用程序中或者当我将应用程序挂起但可见(可以杀死应用程序的菜单)时,该按钮才能正常工作。

这是详细信息:如果我触摸“主页”按钮并尝试选择操作是或否,如果我选择“是”,则应用正确启动(“是”按钮具有启动操作),但是如果我尝试单击在“否”选项中,并且由于某种原因该应用程序不可见,因为该应用程序已关闭并且没有出现在您可以杀死应用程序的菜单中(但是当我再次打开该应用程序时,该应用程序将在我恢复的位置恢复是),有点奇怪...

这很难调试,因为当应用程序未处于活动状态时,控制台不会记录任何内容(检查器控制台仅在应用程序处于活动状态时才起作用)。

从字面上看,我几个小时都遇到了这个问题,所以我尝试创建一个仅用于使用此插件进行测试的新项目,并且在新项目中,如果以前我单击了“主页”按钮,则按钮不会关闭应用程序,但出现了一个新问题:操作不会被触发...

我已经尝试使用后台模式并在新项目中将其激活,但这没有什么区别,我尝试做的另一件事是在deviceready函数中放置(事件):

document.addEventListener('deviceready', ()=>{

      this.isAcceptedObservable = this.localNotifications.on('yes').subscribe(res =>{

        console.log('confirmed!');

      });

      this.isNotAcceptedObservable = this.localNotifications.on('no').subscribe(res =>{

        console.log('denied!');

      });

    });

但是什么也没发生...

我也尝试退出日程表选项中的前台选项,但这没有任何区别...

这是我用于测试的代码app.module:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';

import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { NgPipesModule } from 'ngx-pipes';
import { LocalNotifications } from '@ionic-native/local-notifications/ngx';
import { BackgroundMode } from '@ionic-native/background-mode/ngx';

@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule, NgPipesModule],
  providers: [
    StatusBar,
    SplashScreen,
    LocalNotifications,
    BackgroundMode,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

home.page.html:

<ion-header>
  <ion-toolbar>
    <ion-title>
      Ionic Blank
    </ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>
  <ion-button expand = "full" (click) = "showNotification()">
    <ion-label>
      Show notification...
    </ion-label>
  </ion-button>
</ion-content>

home.module.ts:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IonicModule } from '@ionic/angular';
import { FormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';

import { HomePage } from './home.page';
import {NgPipesModule} from 'ngx-pipes';
import { LocalNotifications } from '@ionic-native/local-notifications/ngx';

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    IonicModule,
    NgPipesModule,
    RouterModule.forChild([
      {
        path: '',
        component: HomePage
      }
    ])
  ],
  declarations: [HomePage],
  providers: [LocalNotifications]
})
export class HomePageModule {}

home.page.ts:

import { Component } from '@angular/core';
import { LocalNotifications } from '@ionic-native/local-notifications/ngx';
import { Observable } from 'rxjs';
import { Subscription } from 'rxjs';
import { BackgroundMode } from '@ionic-native/background-mode/ngx';

@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss'],
})

export class HomePage {

  public isAcceptedObservable: Subscription;
  public isNotAcceptedObservable: Subscription;

  constructor(private localNotifications: LocalNotifications,private backgroundMode: BackgroundMode){

    this.backgroundMode.enable();
    document.addEventListener('deviceready', ()=>{

      this.isAcceptedObservable = this.localNotifications.on('yes').subscribe(res =>{

        console.log('confirmed!');

      });

      this.isNotAcceptedObservable = this.localNotifications.on('no').subscribe(res =>{

        console.log('denied!');

      });

    });

  }

  ionViewDidEnter(){

    this.localNotifications.schedule({
      id: 1,
      title: 'Notification received!',
      text: 'Haz recibido una invitación para ir a un lugar!',
      actions: [
        { id: 'yes',  title: 'Yes' , launch: true},
        { id: 'no',  title: 'No', launch: false}
      ],
      autoClear: true,
      foreground: true
    });

  }

  showNotification(){

    this.localNotifications.schedule({
      id: 1,
      title: 'Notification received!',
      text: 'Haz recibido una invitación para ir a un lugar!',
      actions: [
        { id: 'yes',  title: 'Yes' , launch: true},
        { id: 'no',  title: 'No', launch: false}
      ],
      autoClear: true,
      foreground: true
    });

  }

  ionViewWillLeave(){

    this.isAcceptedObservable.unsubscribe();
    this.isNotAcceptedObservable.unsubscribe();

  }

}

当我同时点击两个按钮时,什么也没有发生……还有一些重要的事情需要考虑:

  • Android平台版本:android@6.4.0
  • BackgroundMode插件版本(重要提示,我使用的是最实际版本的其他版本,BackgroundMode实际插件与此版本的android不兼容),版本:0.7.2

  • LocalNotification插件版本:最新版本或倒数第二个(结果相同)。

1 个答案:

答案 0 :(得分:1)

您的事件名称不正确。使用

this.plt.ready().then(
            () => {
                this.localNotification.on('click').subscribe(
                    res => {}
                );
                this.localNotification.on('trigger').subscribe(
                    res => {}
                );
            }
        );