2017-05-12 17 views

答えて

4

代わりにcordova-plugin-firebaseを使用することをおすすめします。このプラグインの使い方については、this repoをご覧ください。

最初にfirebaseコンソールを設定し、.json/.plistファイルをdonwloadして、それらをIonicアプリのルートフォルダに追加する必要があることに注意してください。次に、プラグインの使用を開始できます。

デモではすべてがapp.component.tsファイルで行われますが、すべてを整理しておくためにPushNotificationServiceを作成することをおすすめします。

トピック機能を使用しているため、デバイスで特定のトピックを購読できます。これらのトピックを使用して、一部のユーザーグループ(AndroidやiOS、特定のユーザーのみ、アプリからのすべてのユーザー...):

this.firebase.subscribe('firebase-app'), // Subscribe to the entire app 
this.firebase.subscribe('android'),   // Subscribe to android users topic 
this.firebase.subscribe('userid-1')   // Subscribe using the user id (hardcoded in this example) 

これは、すべての関連するコードです:

// Angular 
import { Component } from '@angular/core'; 

// Ionic 
import { Platform, AlertController } from 'ionic-angular'; 

// Ionic Native 
import { Firebase } from '@ionic-native/firebase'; 
import { StatusBar } from '@ionic-native/status-bar'; 
import { SplashScreen } from '@ionic-native/splash-screen'; 

// Pages 
import { HomePage } from '../pages/home/home'; 

export class NotificationModel { 
    public body: string; 
    public title: string; 
    public tap: boolean 
} 

@Component({ 
    templateUrl: 'app.html' 
}) 
export class MyApp { 
    rootPage: any = HomePage; 

    constructor(private platform: Platform, 
     private alertCtrl: AlertController, 
     private firebase: Firebase, 
     private statusBar: StatusBar, 
     private splashScreen: SplashScreen) { 

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

      if (this.platform.is('cordova')) { 
       // Initialize push notification feature 
       this.platform.is('android') ? this.initializeFireBaseAndroid() : this.initializeFireBaseIos(); 
      } else { 
       console.log('Push notifications are not enabled since this is not a real device'); 
      } 
     }); 
    } 

    private initializeFireBaseAndroid(): Promise<any> { 
     return this.firebase.getToken() 
      .catch(error => console.error('Error getting token', error)) 
      .then(token => { 

       console.log(`The token is ${token}`); 

       Promise.all([ 
        this.firebase.subscribe('firebase-app'), // Subscribe to the entire app 
        this.firebase.subscribe('android'),   // Subscribe to android users topic 
        this.firebase.subscribe('userid-1')   // Subscribe using the user id (hardcoded in this example) 
       ]).then((result) => { 
        if (result[0]) console.log(`Subscribed to FirebaseDemo`); 
        if (result[1]) console.log(`Subscribed to Android`); 
        if (result[2]) console.log(`Subscribed as User`); 

        this.subscribeToPushNotificationEvents(); 
       }); 
      }); 
    } 

    private initializeFireBaseIos(): Promise<any> { 
     return this.firebase.grantPermission() 
      .catch(error => console.error('Error getting permission', error)) 
      .then(() => { 
       this.firebase.getToken() 
        .catch(error => console.error('Error getting token', error)) 
        .then(token => { 

         console.log(`The token is ${token}`); 

         Promise.all([ 
          this.firebase.subscribe('firebase-app'), 
          this.firebase.subscribe('ios'), 
          this.firebase.subscribe('userid-2') 
         ]).then((result) => { 

          if (result[0]) console.log(`Subscribed to FirebaseDemo`); 
          if (result[1]) console.log(`Subscribed to iOS`); 
          if (result[2]) console.log(`Subscribed as User`); 

          this.subscribeToPushNotificationEvents(); 
         }); 
        }); 
      }) 

    } 

    private saveToken(token: any): Promise<any> { 
     // Send the token to the server 
     console.log('Sending token to the server...'); 
     return Promise.resolve(true); 
    } 

    private subscribeToPushNotificationEvents(): void { 

     // Handle token refresh 
     this.firebase.onTokenRefresh().subscribe(
      token => { 
       console.log(`The new token is ${token}`); 
       this.saveToken(token); 
      }, 
      error => { 
       console.error('Error refreshing token', error); 
      }); 

     // Handle incoming notifications 
     this.firebase.onNotificationOpen().subscribe(
      (notification: NotificationModel) => { 

       !notification.tap 
        ? console.log('The user was using the app when the notification arrived...') 
        : console.log('The app was closed when the notification arrived...'); 

       let notificationAlert = this.alertCtrl.create({ 
        title: notification.title, 
        message: notification.body, 
        buttons: ['Ok'] 
       }); 
       notificationAlert.present(); 
      }, 
      error => { 
       console.error('Error getting the notification', error); 
      }); 
    } 
} 

もしてくださいをNotIアプリケーションがフォアグラウンドで実行されている場合や、通知が届いたときにアプリが終了した場合に送信される通知の内容が同じではないことを確認してください。通知を送信する際に、これを処理するためには、詳細オプションセクション私はFCMに休閑エラーインストール

Example

+1

こんにちは@sebaferrerasは、アプリがフォアグランドにあり、通知がアプリクラッシュ(シングルデバイスとセグメンテーションユーザーの両方)に到着したときにアプリケーションがバックグラウンドでエラーなく受信したときに、実際にcordova-plugin-firebaseを使用しようとしました。私は問題のプロセスの完全な説明があります:https://forum.ionicframework.com/t/when-app-receive-push-notification-by-token-the-app-crashing/89893 – RSA

+0

その投稿を見ると、私はそれを答えの中のように正確に使用しており、期待どおりに動作しているので、通知を処理するときに何か間違っているはずです。 Btw、あなたは、アプリケーションが閉じられたとき、 'title'と' body'プロパティはfirebase /プラグインによって送信されていないことに気付きましたか?そのため、このコードアプリケーションを使用するとカスタムデータ – sebaferreras

+1

の情報を送信するのはなぜですか。クラッシュしませんが、このコードが無効になっていると、パブリックとシングルデバイスのプッシュ通知の両方でアプリがクラッシュします。 Tnx – RSA

1

はい、これにはプラグインが必要ですが、私はcordova-plugin-fcmを使用します。で

app.tsあなたはあなたのコードをやる以下

declare var FCMPlugin: any; //declare with the imports 

FCMPlugin.onNotification(function(data){ 
    if(data.wasTapped){ 
    //Notification was received on device tray and tapped by the user. 
    alert(JSON.stringify(data)); 
    }else{ 
    //Notification was received in foreground. Maybe the user needs to be notified. 
    alert(JSON.stringify(data)); 
    } 
}); 

の中にあったタッパーを行うことができます。

これが役に立ちます。

+0

titlebody追加:モジュール「"E:/アプリケーション/ myappのを/ node_modules/ionic-native/dist/es5/index "にエクスポートされたメンバー 'FCM'がありません。 – RSA