Cordova-plugin-firebase: アプリが閉じている場合、onNotificationOpenは起動されません-アプリプロセスはバックグラウンドで強制終了されます。

作成日 2016年11月24日  ·  46コメント  ·  ソース: arnesson/cordova-plugin-firebase

やあ、

このデフォルトの動作かどうかはわかりません。 ただし、アプリが閉じている場合(アプリプロセスが強制終了されている場合)、プッシュ通知が送信され、それをタップすると、onNotificationOpenは起動されません。 これは期待どおりですか、それとも何かがそれに取り組む必要がありますか?

messaging

最も参考になるコメント

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

全てのコメント46件

私も同じ問題に直面しています:(

cordova resumeイベントを使用して、コールバックを再度フックします。 androidライフサイクルに関するcordovaドキュメントを参照してください: http: //cordova.apache.org/docs/en/6.x/guide/platforms/android/index.html#lifecycle -guide

@robertarnessonあなたの答えをもう少し説明していただけませんか。 iOSでも同じ問題が発生します。 アプリがフォアグラウンドとバックグラウンドで実行されているときに通知を受信できますが、アプリを閉じる/終了するとすぐに通知を受信できなくなります。

バックグラウンドとフォアグラウンドの両方で通知を受信します(Android 6.0.1)...しかし、オープン通知はアプリを起動していません。タップするとトレイ通知がクリアされ、通知データが失われます。 (これは、アプリが一時停止している場合でも発生します)。 横断歩道のせいでしょうか? 修正はありますか?

@robertarnesson @Taracque

これが役立つかどうかはわかりませんが、人々が自分のコードサンプルの代わりに単語やリンクを使用して助けようとするとき、私は本当にそれを嫌います。

これは、index.htmlにあるものの基本的な解釈であり、これはiOSとAndroidで機能し、ペイロードが操作のためにアプリに配信されます。

iOSでは、cordova.jsの「deviceready」機能を使用するだけでよいことがわかりました。これは、アプリがフォアグラウンドにあるときに通知を受信したとき、およびバックグラウンドにあったアプリを再開した後、をタップすることで起動するように見えたためです。通知またはアプリを開くだけです。

Androidの場合、「デバイスレディ」はアプリが最初に読み込まれたときに1回だけ起動するように見えたため、「再開」を使用する必要がありました(私が思うに理にかなっています)。

function onLoad(){

    //fire this with load of the HTML page
    document.addEventListener("deviceready", onDeviceReady, false);

    }

    function onDeviceReady(){

    // this will fire when the app first runs (iOS and Android)
    // iOS will run this after tapping a notification as well but not Android

    // Create the resume as soon as the device is ready.
    document.addEventListener("resume", onResume, false); 

    // add initial cordova-plugin-firebase function calls here
    // e.g TokenRefresh, onNotificationOpen etc

    window.FirebasePlugin.onTokenRefresh(function(token){

    //Do something with the token server-side if it exists

    });

    // get any initial or resume notification (used for iOS)
    var payload = getNotification();

    }

    function getNotification(){

    // get any notification variables for use in your app
    window.FirebasePlugin.onNotificationOpen(function(notification){

    //Check if notification exists then do something with the payload vars
    var str = JSON.stringify(notification);
    console.log(str);

    });

    return str;

    }

    function onResume(){
    //Add plugin functions here after app has resumed from background
    // or after notification is tapped (needed for Android)

    //get resume notification and payload (needed for Android)

    var payload = getNotification();

    }

こんにちはみんな、私たちはここでポイントを逃していると思います。 アプリ自体はバックグラウンドでもフォアグラウンドでもありません。 アプリを強制終了し、関数が起動されない場合、アプリが一時停止されておらず、アプリがフォアグラウンドに移動せずに起動されているため、再開時に使用できません。 デバイスの準備ができた後でも、onNotificationopenは起動されません。

よくわかりませんが、これは正しいです。

1:アプリは完全に非アクティブです
2:アプリのネイティブ通知を受け取ります
3通知をクリックします
4アプリが読み込まれます
5onNotificationOpenが起動していません

これは正しいです?

これは何のOSですか?

コードの一部を提供できますか?

スクリプトにCordova.jsを含めましたか?

読み込みページにjsエラーがないことを100%確信していますか?

@ device68 @nikrhes言ったように、アプリが最初に起動されていないときにonNotificationOpenが起動されるかどうかを知りたいです。
私はAndroidとiOSの両方でテストし、onNotificationOpenがresumeとdevicereadyで呼び出されました。 そして、私が上で述べた状況だけがうまくいきませんでした。 他の状況でも予期しない動作が発生します。
私が開いた第137号をチェックしてください。

@chanphillip 、朝見てみます。 古いバージョンのXCODEを使用しているため、iOS 10を確認できませんが、Androidで何が起こっているかを正確に確認できます。

私のアプリは、通知からのペイロードからのコールドスタートと再開の両方を重要に活用していますが、問題には気づいていません。

@ device68すべての状況は、アプリが非アクティブの場合にのみ正常に機能し、関数はまったく起動されません。 私はテストされており、ほとんどすべてのIOSとAndroidOSで手に入れることができます。 まだ動作していません。

今日のAndroidでのテスト中に思い出したことから、これが起こります。

1つの非アクティブなアプリ

通知を受け取ってクリックすると、期待どおりにアプリが読み込まれ、onDeviceReady内のプラグインコードがそのペイロードをキャプチャします。

Resume内のコードは、ペイロードをキャプチャしません。

アプリがまだアクティブで、まだ最小化されていない間にそれ以上の通知は、onDeviceReady内の関数によって受信されます。

2アプリを初めて最小化する。

初めてアプリを最小化すると、deciceはすでに準備ができており、再開状態を待機しているため、これはonDeviceReadyで停止します。

通知を受け取ってタップすると、アプリが開き、Resume内のプラグインコードがペイロードをキャプチャするようになります。

それ以降の通知はすべてResumeによって受信されます。

3最小化されたアプリ(一般的に言えば)

アプリがいつでも最小化され、通知をクリックすると、Resumeがこれをキャプチャしますが、クリックせずに手動でアプリを開くと、Resumeは何も実行せず、コード内のどこでもonNotificationOpenが起動されません。

このアクティビティはiOS9.3ではまったく異なることに注意してください

4フォアグラウンドアプリ

再開した後、アプリ内で通知を受け取った場合、Resumeはペイロードをキャプチャします。

5殺害アプリ

アプリを殺すと、#1から始めます

6ペイロード

GCMがAndroidで送信するデータで私が見た2つの違いは、通知がアプリの外部でクリックされたか、フォアグラウンドで受信されたかによって異なります。

通知がタップされた場合、Googleはタイムコード、差出人、メッセージIDなどを追加します。

Googleは上記を削除しますが、他のすべての状況ではtap = falseを追加します。

送信するデータ変数はすべての場合に存在します。

サーバー側のCurlAPIを使用して、Web、Android、iOS間でメッセージを送信しています

結局のところ、Androidではすべてが論理的であるように見えますが、実際にはiOSの実装が間違っていて非論理的です。

iOSのすべてがonDeviceReadyで動作し、通知を受け取った後、メッセージをクリックした後、またはアプリがフォアグラウンドにあるときに通知を受け取った後にアプリを手動で開いた場合でも、通知を受信するたびにonNotificationOpenが呼び出されます。

お役に立てれば。

ただし、すべての状況でペイロードをキャプチャする場合は、onDeviceReadyとResumeの両方を使用し、それぞれの下にonNotificationOpenのバージョンを配置する必要があります。

@ device68詳細な説明ありがとうございます。
実際、私は間違っていると言いました。デバイスの再開と準備の両方にonNotificationOpenを入れていましたが、ユースケース1(アプリが起動されていないときに通知をクリックする)は私の側では機能しませんでしたが、他のユースケースは機能していますあなたが説明したように。

テスト中にイオンフレームワークを使用していないと思います。 私はplatform.ready()を使用していますが、私の理解ではdevicereadyと同じであるはずです。

あなたの側でアプリが起動されていない(アプリが強制終了されている)場合でも、onNotificationOpenが起動されることを再確認できますか? また、iOSでもこれをテストすることは可能ですか? ありがとう。

@chanphillip問題ありません。お手伝いできてうれしいです。

正解です。CLIを介してインストールされた生のphonegapプラグインを使用していて、このプラグインをその中にインストールしています。

うーん、実際に私はさらにいくつかのテストを行い、4か所にアラートを含むデバイスのビデオを作成しました。

https://www.youtube.com/watch?v=xrWQH2wE8Fo

これはあなたが見ているものを確認しているようです。 アプリのコールドブートを引き起こす通知をタップしても、onNotificationOpenはまったく起動されません。 この後、通知が関数onNotificationOpenから収集されます。

リスナーは期待どおりに起動しますが、onNotificationOpenでは起動しません。

私にとって、これは私のアプリにとって特に問題ではありません。おそらく、これまで見たことがなかった理由を説明しているのでしょう。

Android 4以降、6以降、7以降を実行しているデバイスでテストしましたが、すべて同じ結果です。

残念ながら、私はiOSであまり役に立たないと思います。私は、YosemiteとXCODE 7.1(iOS 9.3 SDKを含めるように強制されています)でVirtualboxを使用しています。通知は、onDeviceRedyでのみ機能し、Resumeを使用する必要さえありませんでした。 これは、iOS9以降で10以上のデバイス用でした

ただし、エンドユーザーは電話を10.2に更新し、通知は動作期間を停止しました。 これは、9.3 SDKを使用してXCODEを構築したためだと思います。今度は、Macを購入する必要があります:-(

ビデオが役に立ったかどうか教えてください。

私も同じ問題に直面しています。 アプリは開きますが、関数はトリガーされません。 私はあなたのビデオの振る舞いを再現しようとしました、そしてもちろん私はondeviceready状態を待っています。 ただし、メソッドがトリガーされることはありません。

注意:ライトテーブルソケットを介して機能を評価すると、機能します。 IDEで評価した場合にのみ機能します。 ただし、プラグインバージョンのメソッドが「呼び出されない」など、関数がトリガーされることはありません。 関数の評価が機能するのはなぜですか?

やあ、
私は同じ問題に直面しているので、コードで何が起こっているのかを理解しようとしています。
コールドスタートのユースケースの場合、ドキュメントにはonNewIntentを使用するように指示されています。
プラグインのコードは良さそうです。

    <strong i="9">@Override</strong>
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        FirebasePlugin.sendNotification(intent.getExtras());
    }

ただし、呼び出されるこのコールバックでは、通知がペイロードでclick_actionの使用を開始するインテントを設定する必要があります

{
  "to": "/topics/news",
  "notification": {
    "title": "Click Action Message",
    "text": "Sample message",
    "click_action": "android.intent.action.MAIN"
  }
}

私はそうしようとしていますが、成功しないので、クリックアクションで設定する必要があるかどうかはわかりません。
私が設定した値が何であれ、アプリは起動しません

        <activity android:name="MainActivity" >
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

クリックアクションのミスを回避するには、プラグインの初期化中に余分なコンテンツを読むとよいでしょう。
このコードを試してみましたが、今回は通知が届きました。

<strong i="21">@Override</strong>
    protected void pluginInitialize() {
        final Context context = this.cordova.getActivity().getApplicationContext();
        final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
        this.cordova.getThreadPool().execute(new Runnable() {
            public void run() {
                Log.d(TAG, "Starting Firebase plugin");
                mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
                if(extras != null && extras.size()>1) {
                    FirebasePlugin.sendNotification(extras);

                }
            }
        });
    }

とにかくそれは汚いハックのように見えます。

マニフェスト.xmlにデフォルトのカテゴリを追加することでclick_actionを使用できますが、onNewIntentは呼び出されません。

            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

上記と同じ問題が発生しました。主に、通知をタップしてアプリを起動したときに通知ペイロードが配信されませんでした。 @ huny0522の提案で問題が解決したようです。 👍

興味深いことに、私はこれを特に必要としませんが、それが私のために働くかどうかも試してみます。 アプリのコールドブート後に通知ペイロードを必要とするほとんどの人にとって大きな問題のように思われるため、このプラグインの開発者がこの変更を何らかの方法で実装できれば理想的です。

この問題は修正されているか、次のリリースで修正される予定です!?

@ huny0522からのパッチは私にとって問題を解決しませんでした。 onNotificationReceivedコールバックはAndroidコールドスタートでは無視されます。 他のすべてのシナリオは期待どおりに動作します。

提案されたすべての解決策を試した後、githubからプラグインを再インストールすると、問題が解決しました

cordovaプラグイン追加https://github.com/arnesson/cordova-plugin-firebase.git--save

誰かが解決しました

@ device68が書いたステップ3 ??

最小化されたアプリ(一般的に言えば)

アプリがいつでも最小化され、通知をクリックすると、Resumeがこれをキャプチャしますが、クリックせずに手動でアプリを開くと、Resumeは何も実行せず、コード内のどこでもonNotificationOpenが起動されません。

これが私の唯一の問題です。

ここで同様の問題。

送信されたオブジェクトからこの行を削除する必要がありました: "click_action": "YOUR_DATA_HERE"。

これで、バックグラウンドで受信した通知をタッチすると、アプリが正しく起動します。

それが役に立てば幸い。

ionic / cordovaアプリでも同じ問題が発生しますが、Android6.0を搭載したデバイスでのみ発生します。 このデバイスでは、アプリがバックグラウンドまたはフォアグラウンド(!)にあるかどうかに関係なく、通知は常にステータスバーでトリガーされ、通知を開いたときにコールバックがトリガーされないため、ペイロードが取得されません。
私がテストした他のすべてのデバイス(android 5、iOS 9、10)は問題ありませんでした。フォアグラウンドではコールバックデータがトリガーされ、それに反応します。バックグラウンドでは、ドキュメントで説明されているように、通常はステータスバーで通知を受け取ります。

@ abhishek-kollipara議論されている問題は、フォアグラウンド/バックグラウンド状態でペイロードを取得する方法ではなく、通知をタップして通知ペイロードを取得することでアプリがコールドブートされた場合です。 これは、特にこのプラグインではなく別のプラグインのドキュメントに記述されている場合に、ペイロードがどのように形成されるかに関する問題ではありません。

過去2日間、ペイロードを探し始めて以来、コールドブートでペイロードをキャッチすることに初めて成功しました。 イオンネイティブプラグイン「Webインテント」を取得します。 文書化されているようにインストールし、ブート時に組み込み関数getIntent()を使用します。 アプリが通知によって起動された場合、通知データは返されたオブジェクト内のどこかにあります。

@heidjiこれはIOSで動作しますか?

私の場合:

アンドロイド:
-コールドスタート:OnNotificationOpenを起動します
-最小化されたアプリ:OnNotificationOpenを起動します
-フォアグラウンドアプリ:OnNotificationOpenを起動します

IOS:
-コールドスタート:OnNotificationOpenを起動しない
-最小化されたアプリ:OnNotificationOpenを起動します
-フォアグラウンドアプリ:OnNotificationOpenを起動します

手伝ってくれてありがとう

@Hanzofm正直言ってiOSで動作するかどうかはわかりません。 Web Intentプラグインを使用して、起動時にその出力をコンソールに記録してみてください。

@Hanzofmで説明されているiOSでも同じ動作をします

iOSでも同じ動作をします。 onNotificationOpenは、通知をクリックしたiOSアプリのコールドスタートでは呼び出されません。 プラグインバージョン0.1.25を使用します。

アップデート:
「cordova-plugin-local-notifications」をfirebaseプラグインでも使用していたため、問題が発生しました。 「cordova-plugin-local-notifications」プラグインを削除すると、正常に機能しました。

また、コールドスタート(iOS)でnoNotificationOpenを起動するのに問題があります。 そこに解決策はありますか?

ありがとう

私の場合、local-notificationsプラグインを削除することで解決しました。 このプラグインとプッシュ通知プラグインには互換性がありません

残念ながら、私はそのプラグインを持っていません:)

これはオンになっているはずですか?

skjermbilde 2018-04-27 kl 09 22 50

クリーンアップのために閉じます。 最新バージョンでテストし、それでも問題が解決しない場合は再度開いてください。

@heidjiあなたの方法で問題を解決したとしましょう。次のような状況で通知データを取得する方法について何かありますか?

アプリは完全に閉じています。 ユーザーはプッシュ通知を受け取ります。 ユーザーは通知をクリックせず、代わりに通知バーから通知を削除します。 ユーザーは後でアプリを開き、通知ページに移動しても何も表示されません。 ユーザーはフォアグラウンドで通知を受け取ることも、アプリを開くためにそれをクリックすることもありません。 ただし、ユーザーに表示するためにこの通知が存在することを知る必要があります。 ionic3でこれを行う方法は?

@akildemir Ionicではこれを行う方法はありません。ユーザーがアプリを開いたときに、他のユーザーと同じように、自分のサーバーに通知を記録して取得する必要があります。

@heidjiこの通知が存在することがわからない場合、通知をサーバーに記録して取得するにはどうすればよいですか?
Firebaseがデバイスを使用して通知をサーバーに送信する方法はありますか?Firebaseを使用せず、通知に独自のサーバーを使用することを意味しましたか?

@akildemirプッシュ通知を作成するときは、自分のサーバーやプロジェクトで使用しているサーバーなど、別の場所にもその存在を登録します。 Firebaseもこれらのサービスを提供していると思います。
これらの通知をどのように作成するかはわかりませんが、私のプロジェクトでは、PHPサーバーで何かが発生した場合、たとえば誰かがメッセージを送信した場合、firebaseに連絡して通知を送信し、このイベントを「is_read = 0」で保存しますフラグが設定されているため、ユーザーが通知をクリックしない場合は、ウェブサイトで通知を取得できます。または、アプリが独自のサービスを使用してこれらの通知などを呼び出します。

@heidji私は自分のアプリのウェブサイトを持っていませんが、あなたが言ったことはかなり論理的です。同時に通知をサーバーに保存し、後で取得することができます。 ありがとう! はい、私はモバイル開発関連の初心者として数えることができます。 また、他に質問してもいいですか? Firebaseを介して複数のデバイスに同じ通知を登録するにはどうすればよいですか? あなたはそれをグループチャットのように考えることができます。 誰かがグループチャットで何かを入力すると、グループ内の全員がそれを取得します。 私はこのフォーマットを使用して通知を登録しています:

body = {
"通知":{
"title": "title" , "body":"body"
}、
"データ":{
"param1": "value1"
}、
"to": DeviceId
「優先度」:「高」、
"restricted_pa​​ckage_name": ""
}

  let options = new HttpHeaders().set('Content-Type','application/json');
  this.http.post("https://fcm.googleapis.com/fcm/send",body,{
    headers: options.set('Authorization', 'key=),
  })

ここで、deviceIdを「to」セクションに渡すと、デバイスに送信されます。 しかし、ここで複数のdeviceIdを渡すことはできますか?

@nikrhesメタデータで確認できます。
window.FirebasePlugin.onNotificationOpen()。subscribe((data)=> {
if(data.tap){
//ユーザーが通知をタップする
} そうしないと {
//アプリはフォアグラウンドで実行されています
}
});

これがこれまでに解決されたかどうかはわかりませんが、それに関するさまざまなスレッドを通じて何ヶ月もの間答えを探してきました。 明確にするために、問題は、アプリが完全に閉じられている/オフになっている/強制終了されているiOSの場合に特にonNotificationが起動しないことです。 通知が届き、アプリをコールドブートしますが、関数は起動せず、ペイロードは配信されません。

@ heidji-プッシュイベントをサーバーに保存し、それらが読み取られたかどうかを確認するという回避策は理にかなっています。 ただし、このアプリでは、これが機能しないシナリオがあります(つまり、通知が発生するかどうかは、ユーザーが実際にクリックしたかどうかに基づいて、読んだかどうかに基づいて判断する必要があります)。

しかし、他の多くの人が述べているように、主なことは、これは解決策がなければならない重要な行動であるように思われるということですか?

@wwwguy私の解決策は回避策ではありません。 それは、大小を問わず、誰もが使用する標準的な慣習です。
通知プレスに頼ることはできません。これらは保証されたイベントではありません。 xiaomi電話でFacebookの通知を押すと、アプリが開かないことがあります。

はい、わかりました。 さまざまなクライアント向けに数十のアプリを導入してきました。 いくつかのアプリでも、サーバー上で通知の「読み取り」を追跡する方法を使用しています。 ただし、考慮すべき他のケースもあります。つまり、単なる通知ではなく、クリックされた場合にアプリ内の特定の機能を指示するペイロードを運ぶ通知です。 Facebookはがらくたです。 誰もがこれを知っています。 ただし、FB通知は、単純な通知(アプリ内のアーカイブリストに表示されるだけ)でもあります。 それらは本質的に機能的ではありません。 つまり、特定の種類のFB通知をクリックすると、アプリを開いて特定の場所に移動する必要があるという特定の種類のFB通知はありません。

とにかく...私は必ずしも大きな哲学的議論に参加するために投稿していませんでした(実際には、多くの場合問題を解決するので、良いアイデアのために@heidjiにうなずきました)。 しかし、確かに私たちは皆、これに同意することができます:

Android Open App = WORKS
iOSオープンアプリ= WORKS
Androidバックグラウンドアプリ= WORKS
iOSバックグラウンドアプリ= WORKS
殺されたアプリからのAndroidコールドブート= WORKS
強制終了されたアプリからのiOSコールドブート=機能しない

...プラグインの意図された設計ではありません。 したがって、開発者が対処していないバグ(おそらく、これらのさまざまなスレッドすべての混乱の原因と、問題が何であるかを誤診しているさまざまな人々による)か、PUSH本体で渡された変数やxCodeでコンパイルされた機能などです。この動作を引き起こします。

開発者によるプラグインのバグ修正はさておき...誰かがこれの手動コード修正を分離することができましたか?

正直なところ、iOSのコールドブートからの通知は100%機能します。 onNotificationOpenが機能せず、iOSにwebintentが存在しないため、Android専用のwebintentプラグインを使用しました。
セットアップの詳細が必要な場合はお知らせください

このページは役に立ちましたか?
0 / 5 - 0 評価